summaryrefslogtreecommitdiffstats
path: root/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/systemflags/v1/SystemFlagsDataArchiveTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/systemflags/v1/SystemFlagsDataArchiveTest.java')
-rw-r--r--controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/systemflags/v1/SystemFlagsDataArchiveTest.java167
1 files changed, 80 insertions, 87 deletions
diff --git a/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/systemflags/v1/SystemFlagsDataArchiveTest.java b/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/systemflags/v1/SystemFlagsDataArchiveTest.java
index d010893f1d4..a24bed54a8a 100644
--- a/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/systemflags/v1/SystemFlagsDataArchiveTest.java
+++ b/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/systemflags/v1/SystemFlagsDataArchiveTest.java
@@ -54,15 +54,20 @@ public class SystemFlagsDataArchiveTest {
@TempDir
public File temporaryFolder;
- private static final FlagsTarget mainControllerTarget = FlagsTarget.forController(SYSTEM);
- private static final FlagsTarget cdControllerTarget = FlagsTarget.forController(SystemName.cd);
+ private static final FlagsTarget mainControllerTarget = createControllerTarget(SYSTEM);
+ private static final FlagsTarget cdControllerTarget = createControllerTarget(SystemName.cd);
private static final FlagsTarget prodUsWestCfgTarget = createConfigserverTarget(Environment.prod, "us-west-1");
private static final FlagsTarget prodUsEast3CfgTarget = createConfigserverTarget(Environment.prod, "us-east-3");
private static final FlagsTarget devUsEast1CfgTarget = createConfigserverTarget(Environment.dev, "us-east-1");
+ private static FlagsTarget createControllerTarget(SystemName system) {
+ return new ControllerFlagsTarget(system, CloudName.YAHOO, ZoneId.from(Environment.prod, RegionName.from("us-east-1")));
+ }
+
private static FlagsTarget createConfigserverTarget(Environment environment, String region) {
return new ConfigServerFlagsTarget(
SYSTEM,
+ CloudName.YAHOO,
ZoneId.from(environment, RegionName.from(region)),
URI.create("https://cfg-" + region),
new AthenzService("vespa.cfg-" + region));
@@ -177,102 +182,85 @@ public class SystemFlagsDataArchiveTest {
" \"comment\": \"comment d\"\n" +
" }\n" +
" ]\n" +
- "}")));
+ "}", Set.of())));
}
@Test
- void normalize_json_fail_on_invalid_application() {
- try {
- SystemFlagsDataArchive.normalizeJson("{\n" +
- " \"id\": \"foo\",\n" +
- " \"rules\": [\n" +
- " {\n" +
- " \"conditions\": [\n" +
- " {\n" +
- " \"type\": \"whitelist\",\n" +
- " \"dimension\": \"application\",\n" +
- " \"values\": [ \"a.b.c\" ]\n" +
- " }\n" +
- " ],\n" +
- " \"value\": true\n" +
- " }\n" +
- " ]\n" +
- "}\n");
- fail();
- } catch (IllegalArgumentException e) {
- assertEquals("Application ids must be on the form tenant:application:instance, but was a.b.c", e.getMessage());
- }
+ void normalize_json_succeed_on_valid_values() {
+ normalizeJson("application", "\"a:b:c\"");
+ normalizeJson("cloud", "\"yahoo\"");
+ normalizeJson("cloud", "\"aws\"");
+ normalizeJson("cloud", "\"gcp\"");
+ normalizeJson("cluster-id", "\"some-id\"");
+ normalizeJson("cluster-type", "\"admin\"");
+ normalizeJson("cluster-type", "\"container\"");
+ normalizeJson("cluster-type", "\"content\"");
+ normalizeJson("console-user-email", "\"name@domain.com\"");
+ normalizeJson("environment", "\"prod\"");
+ normalizeJson("environment", "\"staging\"");
+ normalizeJson("environment", "\"test\"");
+ normalizeJson("hostname", "\"2080046-v6-11.ostk.bm2.prod.gq1.yahoo.com\"");
+ normalizeJson("node-type", "\"tenant\"");
+ normalizeJson("node-type", "\"host\"");
+ normalizeJson("node-type", "\"config\"");
+ normalizeJson("node-type", "\"host\"");
+ normalizeJson("system", "\"main\"");
+ normalizeJson("system", "\"public\"");
+ normalizeJson("tenant", "\"vespa\"");
+ normalizeJson("vespa-version", "\"8.201.13\"");
+ normalizeJson("zone", "\"prod.us-west-1\"", Set.of(ZoneId.from("prod.us-west-1")));
}
- @Test
- void normalize_json_fail_on_invalid_node_type() {
- try {
- SystemFlagsDataArchive.normalizeJson("{\n" +
- " \"id\": \"foo\",\n" +
- " \"rules\": [\n" +
- " {\n" +
- " \"conditions\": [\n" +
- " {\n" +
- " \"type\": \"whitelist\",\n" +
- " \"dimension\": \"node-type\",\n" +
- " \"values\": [ \"footype\" ]\n" +
- " }\n" +
- " ],\n" +
- " \"value\": true\n" +
- " }\n" +
- " ]\n" +
- "}\n");
- fail();
- } catch (IllegalArgumentException e) {
- assertEquals("No enum constant com.yahoo.config.provision.NodeType.footype", e.getMessage());
- }
+ private void normalizeJson(String dimension, String jsonValue) {
+ normalizeJson(dimension, jsonValue, Set.of());
}
- @Test
- void normalize_json_fail_on_invalid_email() {
- try {
- SystemFlagsDataArchive.normalizeJson("{\n" +
- " \"id\": \"foo\",\n" +
- " \"rules\": [\n" +
- " {\n" +
- " \"conditions\": [\n" +
- " {\n" +
- " \"type\": \"whitelist\",\n" +
- " \"dimension\": \"console-user-email\",\n" +
- " \"values\": [ 123 ]\n" +
- " }\n" +
- " ],\n" +
- " \"value\": true\n" +
- " }\n" +
- " ]\n" +
- "}\n");
- fail();
- } catch (IllegalArgumentException e) {
- assertEquals("Non-string email address: 123", e.getMessage());
- }
+ private void normalizeJson(String dimension, String jsonValue, Set<ZoneId> zones) {
+ SystemFlagsDataArchive.normalizeJson("""
+ {
+ "id": "foo",
+ "rules": [
+ {
+ "conditions": [
+ {
+ "type": "whitelist",
+ "dimension": "%s",
+ "values": [ %s ]
+ }
+ ],
+ "value": true
+ }
+ ]
+ }
+ """.formatted(dimension, jsonValue), zones);
}
@Test
- void normalize_json_fail_on_invalid_tenant_id() {
+ void normalize_json_fail_on_invalid_values() {
+ failNormalizeJson("application", "\"a.b.c\"", "Application ids must be on the form tenant:application:instance, but was a.b.c");
+ failNormalizeJson("cloud", "\"foo\"", "Unknown cloud: foo");
+ // failNormalizeJson("cluster-id", ... any String is valid
+ failNormalizeJson("cluster-type", "\"foo\"", "Illegal cluster type 'foo'");
+ failNormalizeJson("console-user-email", "123", "Non-string value in console-user-email whitelist condition: 123");
+ failNormalizeJson("environment", "\"foo\"", "'foo' is not a valid environment identifier");
+ failNormalizeJson("hostname", "\"not:a:hostname\"", "hostname must match '(([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])\\.?', but got: 'not:a:hostname'");
+ failNormalizeJson("node-type", "\"footype\"", "No enum constant com.yahoo.config.provision.NodeType.footype");
+ failNormalizeJson("system", "\"bar\"", "'bar' is not a valid system");
+ failNormalizeJson("tenant", "123", "Non-string value in tenant whitelist condition: 123");
+ failNormalizeJson("vespa-version", "\"not-a-version\"", "Invalid version component in 'not-a-version'");
+ failNormalizeJson("zone", "\"dev.non-existing-zone\"", Set.of(ZoneId.from("prod.example-region")), "Unknown zone: dev.non-existing-zone");
+ }
+
+ private void failNormalizeJson(String dimension, String jsonValue, String expectedExceptionMessage) {
+ failNormalizeJson(dimension, jsonValue, Set.of(), expectedExceptionMessage);
+ }
+
+ private void failNormalizeJson(String dimension, String jsonValue, Set<ZoneId> zones, String expectedExceptionMessage) {
try {
- SystemFlagsDataArchive.normalizeJson("{\n" +
- " \"id\": \"foo\",\n" +
- " \"rules\": [\n" +
- " {\n" +
- " \"conditions\": [\n" +
- " {\n" +
- " \"type\": \"whitelist\",\n" +
- " \"dimension\": \"tenant\",\n" +
- " \"values\": [ 123 ]\n" +
- " }\n" +
- " ],\n" +
- " \"value\": true\n" +
- " }\n" +
- " ]\n" +
- "}\n");
+ normalizeJson(dimension, jsonValue, zones);
fail();
- } catch (IllegalArgumentException e) {
- assertEquals("Non-string tenant ID: 123", e.getMessage());
+ } catch (RuntimeException e) {
+ assertEquals(expectedExceptionMessage, e.getMessage());
}
}
@@ -291,6 +279,11 @@ public class SystemFlagsDataArchiveTest {
// Cannot use the standard registry mock as it's located in controller-server module
ZoneRegistry registryMock = mock(ZoneRegistry.class);
when(registryMock.system()).thenReturn(SystemName.main);
+ ZoneApi zoneApi = mock(ZoneApi.class);
+ when(zoneApi.getSystemName()).thenReturn(SystemName.main);
+ when(zoneApi.getCloudName()).thenReturn(CloudName.YAHOO);
+ when(zoneApi.getVirtualId()).thenReturn(ZoneId.ofVirtualControllerZone());
+ when(registryMock.systemZone()).thenReturn(zoneApi);
when(registryMock.getConfigServerVipUri(any())).thenReturn(URI.create("http://localhost:8080/"));
when(registryMock.getConfigServerHttpsIdentity(any())).thenReturn(new AthenzService("domain", "servicename"));
ZoneList zoneListMock = mock(ZoneList.class);
@@ -333,7 +326,7 @@ public class SystemFlagsDataArchiveTest {
@Override public SystemName getSystemName() { return SystemName.main; }
@Override public ZoneId getId() { return zoneId; }
- @Override public CloudName getCloudName() { throw new UnsupportedOperationException(); }
+ @Override public CloudName getCloudName() { return CloudName.YAHOO; }
@Override public String getCloudNativeRegionName() { throw new UnsupportedOperationException(); }
}