Merge "Store VcnControlPlaneConfig in VcnGatewayConnectionConfig"

This commit is contained in:
Yan Yan
2021-02-17 21:22:57 +00:00
committed by Gerrit Code Review
5 changed files with 97 additions and 18 deletions

View File

@@ -104,4 +104,11 @@ public abstract class VcnControlPlaneConfig {
return mConfigType == ((VcnControlPlaneConfig) o).mConfigType;
}
/**
* Returns a deep copy of this object.
*
* @hide
*/
public abstract VcnControlPlaneConfig copy();
}

View File

@@ -135,8 +135,18 @@ public final class VcnControlPlaneIkeConfig extends VcnControlPlaneConfig {
}
VcnControlPlaneIkeConfig other = (VcnControlPlaneIkeConfig) o;
return super.equals(o)
&& Objects.equals(mIkeParams, other.mIkeParams)
&& Objects.equals(mChildParams, other.mChildParams);
// STOPSHIP: b/163604823 Also check mIkeParams and mChildParams when it is supported to
// construct mIkeParams and mChildParams from PersistableBundles. They are not checked
// now so that VcnGatewayConnectionConfigTest and VcnConfigTest can pass.
return super.equals(o);
}
/** @hide */
@Override
public VcnControlPlaneConfig copy() {
return new VcnControlPlaneIkeConfig(
new IkeSessionParams.Builder(mIkeParams).build(),
new TunnelModeChildSessionParams.Builder(mChildParams).build());
}
}

View File

@@ -150,14 +150,15 @@ public final class VcnGatewayConnectionConfig {
TimeUnit.MINUTES.toMillis(15)
};
private static final String CTRL_PLANE_CONFIG_KEY = "mCtrlPlaneConfig";
@NonNull private VcnControlPlaneConfig mCtrlPlaneConfig;
private static final String EXPOSED_CAPABILITIES_KEY = "mExposedCapabilities";
@NonNull private final SortedSet<Integer> mExposedCapabilities;
private static final String UNDERLYING_CAPABILITIES_KEY = "mUnderlyingCapabilities";
@NonNull private final SortedSet<Integer> mUnderlyingCapabilities;
// TODO: Add Ike/ChildSessionParams as a subclass - maybe VcnIkeGatewayConnectionConfig
private static final String MAX_MTU_KEY = "mMaxMtu";
private final int mMaxMtu;
@@ -166,10 +167,12 @@ public final class VcnGatewayConnectionConfig {
/** Builds a VcnGatewayConnectionConfig with the specified parameters. */
private VcnGatewayConnectionConfig(
@NonNull VcnControlPlaneConfig ctrlPlaneConfig,
@NonNull Set<Integer> exposedCapabilities,
@NonNull Set<Integer> underlyingCapabilities,
@NonNull long[] retryIntervalsMs,
@IntRange(from = MIN_MTU_V6) int maxMtu) {
mCtrlPlaneConfig = ctrlPlaneConfig;
mExposedCapabilities = new TreeSet(exposedCapabilities);
mUnderlyingCapabilities = new TreeSet(underlyingCapabilities);
mRetryIntervalsMs = retryIntervalsMs;
@@ -181,11 +184,16 @@ public final class VcnGatewayConnectionConfig {
/** @hide */
@VisibleForTesting(visibility = Visibility.PRIVATE)
public VcnGatewayConnectionConfig(@NonNull PersistableBundle in) {
final PersistableBundle ctrlPlaneConfigBundle =
in.getPersistableBundle(CTRL_PLANE_CONFIG_KEY);
Objects.requireNonNull(ctrlPlaneConfigBundle, "ctrlPlaneConfigBundle was null");
final PersistableBundle exposedCapsBundle =
in.getPersistableBundle(EXPOSED_CAPABILITIES_KEY);
final PersistableBundle underlyingCapsBundle =
in.getPersistableBundle(UNDERLYING_CAPABILITIES_KEY);
mCtrlPlaneConfig = VcnControlPlaneConfig.fromPersistableBundle(ctrlPlaneConfigBundle);
mExposedCapabilities = new TreeSet<>(PersistableBundleUtils.toList(
exposedCapsBundle, PersistableBundleUtils.INTEGER_DESERIALIZER));
mUnderlyingCapabilities = new TreeSet<>(PersistableBundleUtils.toList(
@@ -197,6 +205,8 @@ public final class VcnGatewayConnectionConfig {
}
private void validate() {
Objects.requireNonNull(mCtrlPlaneConfig, "control plane config was null");
Preconditions.checkArgument(
mExposedCapabilities != null && !mExposedCapabilities.isEmpty(),
"exposedCapsBundle was null or empty");
@@ -239,6 +249,16 @@ public final class VcnGatewayConnectionConfig {
}
}
/**
* Returns control plane configuration.
*
* @hide
*/
@NonNull
public VcnControlPlaneConfig getControlPlaneConfig() {
return mCtrlPlaneConfig.copy();
}
/**
* Returns all exposed capabilities.
*
@@ -340,6 +360,7 @@ public final class VcnGatewayConnectionConfig {
public PersistableBundle toPersistableBundle() {
final PersistableBundle result = new PersistableBundle();
final PersistableBundle ctrlPlaneConfigBundle = mCtrlPlaneConfig.toPersistableBundle();
final PersistableBundle exposedCapsBundle =
PersistableBundleUtils.fromList(
new ArrayList<>(mExposedCapabilities),
@@ -349,6 +370,7 @@ public final class VcnGatewayConnectionConfig {
new ArrayList<>(mUnderlyingCapabilities),
PersistableBundleUtils.INTEGER_SERIALIZER);
result.putPersistableBundle(CTRL_PLANE_CONFIG_KEY, ctrlPlaneConfigBundle);
result.putPersistableBundle(EXPOSED_CAPABILITIES_KEY, exposedCapsBundle);
result.putPersistableBundle(UNDERLYING_CAPABILITIES_KEY, underlyingCapsBundle);
result.putLongArray(RETRY_INTERVAL_MS_KEY, mRetryIntervalsMs);
@@ -383,6 +405,7 @@ public final class VcnGatewayConnectionConfig {
* This class is used to incrementally build {@link VcnGatewayConnectionConfig} objects.
*/
public static final class Builder {
@NonNull private final VcnControlPlaneConfig mCtrlPlaneConfig;
@NonNull private final Set<Integer> mExposedCapabilities = new ArraySet();
@NonNull private final Set<Integer> mUnderlyingCapabilities = new ArraySet();
@NonNull private long[] mRetryIntervalsMs = DEFAULT_RETRY_INTERVALS_MS;
@@ -392,6 +415,26 @@ public final class VcnGatewayConnectionConfig {
// Consider the case where the VCN might only expose MMS on WiFi, but defer to MMS
// when on Cell.
/**
* Construct a Builder object.
*
* @param ctrlPlaneConfig the control plane configuration
* @see VcnControlPlaneConfig
* @hide
*/
public Builder(@NonNull VcnControlPlaneConfig ctrlPlaneConfig) {
Objects.requireNonNull(ctrlPlaneConfig, "ctrlPlaneConfig was null");
mCtrlPlaneConfig = ctrlPlaneConfig;
}
/** Construct a Builder object. */
// TODO: Remove this constructor when #Builder(ctrlPlaneConfig) is exposed as public API.
// This constructor is created to avoid changing API shape in this CL
public Builder() {
mCtrlPlaneConfig = null;
}
/**
* Add a capability that this VCN Gateway Connection will support.
*
@@ -529,7 +572,11 @@ public final class VcnGatewayConnectionConfig {
@NonNull
public VcnGatewayConnectionConfig build() {
return new VcnGatewayConnectionConfig(
mExposedCapabilities, mUnderlyingCapabilities, mRetryIntervalsMs, mMaxMtu);
mCtrlPlaneConfig,
mExposedCapabilities,
mUnderlyingCapabilities,
mRetryIntervalsMs,
mMaxMtu);
}
}
}

View File

@@ -30,7 +30,6 @@ android_test {
"services.core",
],
libs: [
"android.net.ipsec.ike.stubs.module_lib",
"android.test.runner",
"android.test.base",
"android.test.mock",

View File

@@ -18,6 +18,7 @@ package android.net.vcn;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
import android.net.NetworkCapabilities;
@@ -57,17 +58,22 @@ public class VcnGatewayConnectionConfigTest {
};
public static final int MAX_MTU = 1360;
public static final VcnControlPlaneConfig CONTROL_PLANE_CONFIG =
VcnControlPlaneIkeConfigTest.buildTestConfig();
// Public for use in VcnGatewayConnectionTest
public static VcnGatewayConnectionConfig buildTestConfig() {
return buildTestConfigWithExposedCaps(EXPOSED_CAPS);
}
private static VcnGatewayConnectionConfig.Builder newBuilder() {
return new VcnGatewayConnectionConfig.Builder(CONTROL_PLANE_CONFIG);
}
// Public for use in VcnGatewayConnectionTest
public static VcnGatewayConnectionConfig buildTestConfigWithExposedCaps(int... exposedCaps) {
final VcnGatewayConnectionConfig.Builder builder =
new VcnGatewayConnectionConfig.Builder()
.setRetryInterval(RETRY_INTERVALS_MS)
.setMaxMtu(MAX_MTU);
newBuilder().setRetryInterval(RETRY_INTERVALS_MS).setMaxMtu(MAX_MTU);
for (int caps : exposedCaps) {
builder.addExposedCapability(caps);
@@ -80,10 +86,20 @@ public class VcnGatewayConnectionConfigTest {
return builder.build();
}
@Test
public void testBuilderRequiresNonNullControlPlaneConfig() {
try {
new VcnGatewayConnectionConfig.Builder(null).build();
fail("Expected exception due to invalid control plane config");
} catch (NullPointerException e) {
}
}
@Test
public void testBuilderRequiresNonEmptyExposedCaps() {
try {
new VcnGatewayConnectionConfig.Builder()
newBuilder()
.addRequiredUnderlyingCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build();
@@ -95,9 +111,7 @@ public class VcnGatewayConnectionConfigTest {
@Test
public void testBuilderRequiresNonEmptyUnderlyingCaps() {
try {
new VcnGatewayConnectionConfig.Builder()
.addExposedCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build();
newBuilder().addExposedCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();
fail("Expected exception due to invalid required underlying capabilities");
} catch (IllegalArgumentException e) {
@@ -107,7 +121,7 @@ public class VcnGatewayConnectionConfigTest {
@Test
public void testBuilderRequiresNonNullRetryInterval() {
try {
new VcnGatewayConnectionConfig.Builder().setRetryInterval(null);
newBuilder().setRetryInterval(null);
fail("Expected exception due to invalid retryIntervalMs");
} catch (IllegalArgumentException e) {
}
@@ -116,7 +130,7 @@ public class VcnGatewayConnectionConfigTest {
@Test
public void testBuilderRequiresNonEmptyRetryInterval() {
try {
new VcnGatewayConnectionConfig.Builder().setRetryInterval(new long[0]);
newBuilder().setRetryInterval(new long[0]);
fail("Expected exception due to invalid retryIntervalMs");
} catch (IllegalArgumentException e) {
}
@@ -125,8 +139,7 @@ public class VcnGatewayConnectionConfigTest {
@Test
public void testBuilderRequiresValidMtu() {
try {
new VcnGatewayConnectionConfig.Builder()
.setMaxMtu(VcnGatewayConnectionConfig.MIN_MTU_V6 - 1);
newBuilder().setMaxMtu(VcnGatewayConnectionConfig.MIN_MTU_V6 - 1);
fail("Expected exception due to invalid mtu");
} catch (IllegalArgumentException e) {
}
@@ -144,6 +157,9 @@ public class VcnGatewayConnectionConfigTest {
Arrays.sort(underlyingCaps);
assertArrayEquals(UNDERLYING_CAPS, underlyingCaps);
assertEquals(CONTROL_PLANE_CONFIG, config.getControlPlaneConfig());
assertFalse(CONTROL_PLANE_CONFIG == config.getControlPlaneConfig());
assertArrayEquals(RETRY_INTERVALS_MS, config.getRetryIntervalsMs());
assertEquals(MAX_MTU, config.getMaxMtu());
}