diff options
author | jonmv <venstad@gmail.com> | 2023-05-26 09:59:08 +0200 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2023-05-26 10:38:45 +0200 |
commit | cdd9d7bb5fcdb154f6cc9fa129d3a65e22f7a63a (patch) | |
tree | 5357447d4050a410cfd7cf3de44d12a93855d2a1 /config-model-api/src/test/java/com/yahoo/config/application/api | |
parent | 3c3458a27beb1167d2b5d28898b3e13f44e0b8a0 (diff) |
Add empty-host-ttl to deployment spec
Diffstat (limited to 'config-model-api/src/test/java/com/yahoo/config/application/api')
2 files changed, 247 insertions, 87 deletions
diff --git a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java index 89b7318739e..9cee6c57591 100644 --- a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java +++ b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java @@ -32,6 +32,11 @@ import java.util.stream.Collectors; import static com.yahoo.config.application.api.Notifications.Role.author; import static com.yahoo.config.application.api.Notifications.When.failing; import static com.yahoo.config.application.api.Notifications.When.failingCommit; +import static com.yahoo.config.provision.Environment.dev; +import static com.yahoo.config.provision.Environment.perf; +import static com.yahoo.config.provision.Environment.prod; +import static com.yahoo.config.provision.Environment.staging; +import static com.yahoo.config.provision.Environment.test; import static com.yahoo.config.provision.zone.ZoneId.defaultId; import static com.yahoo.config.provision.zone.ZoneId.from; import static org.junit.Assert.assertEquals; @@ -60,11 +65,11 @@ public class DeploymentSpecTest { assertEquals(specXml, spec.xmlForm()); assertEquals(1, spec.requireInstance("default").steps().size()); assertFalse(spec.majorVersion().isPresent()); - assertTrue(spec.requireInstance("default").steps().get(0).concerns(Environment.test)); - assertTrue(spec.requireInstance("default").concerns(Environment.test, Optional.empty())); - assertTrue(spec.requireInstance("default").concerns(Environment.test, Optional.of(RegionName.from("region1")))); // test steps specify no region - assertFalse(spec.requireInstance("default").concerns(Environment.staging, Optional.empty())); - assertFalse(spec.requireInstance("default").concerns(Environment.prod, Optional.empty())); + assertTrue(spec.requireInstance("default").steps().get(0).concerns(test)); + assertTrue(spec.requireInstance("default").concerns(test, Optional.empty())); + assertTrue(spec.requireInstance("default").concerns(test, Optional.of(RegionName.from("region1")))); // test steps specify no region + assertFalse(spec.requireInstance("default").concerns(staging, Optional.empty())); + assertFalse(spec.requireInstance("default").concerns(prod, Optional.empty())); assertFalse(spec.requireInstance("default").globalServiceId().isPresent()); } @@ -97,10 +102,10 @@ public class DeploymentSpecTest { DeploymentSpec spec = DeploymentSpec.fromXml(r); assertEquals(1, spec.steps().size()); assertEquals(1, spec.requireInstance("default").steps().size()); - assertTrue(spec.requireInstance("default").steps().get(0).concerns(Environment.staging)); - assertFalse(spec.requireInstance("default").concerns(Environment.test, Optional.empty())); - assertTrue(spec.requireInstance("default").concerns(Environment.staging, Optional.empty())); - assertFalse(spec.requireInstance("default").concerns(Environment.prod, Optional.empty())); + assertTrue(spec.requireInstance("default").steps().get(0).concerns(staging)); + assertFalse(spec.requireInstance("default").concerns(test, Optional.empty())); + assertTrue(spec.requireInstance("default").concerns(staging, Optional.empty())); + assertFalse(spec.requireInstance("default").concerns(prod, Optional.empty())); assertFalse(spec.requireInstance("default").globalServiceId().isPresent()); } @@ -121,17 +126,17 @@ public class DeploymentSpecTest { assertEquals(1, spec.steps().size()); assertEquals(2, spec.requireInstance("default").steps().size()); - assertTrue(spec.requireInstance("default").steps().get(0).concerns(Environment.prod, Optional.of(RegionName.from("us-east1")))); + assertTrue(spec.requireInstance("default").steps().get(0).concerns(prod, Optional.of(RegionName.from("us-east1")))); assertFalse(((DeploymentSpec.DeclaredZone)spec.requireInstance("default").steps().get(0)).active()); - assertTrue(spec.requireInstance("default").steps().get(1).concerns(Environment.prod, Optional.of(RegionName.from("us-west1")))); + assertTrue(spec.requireInstance("default").steps().get(1).concerns(prod, Optional.of(RegionName.from("us-west1")))); assertTrue(((DeploymentSpec.DeclaredZone)spec.requireInstance("default").steps().get(1)).active()); - assertFalse(spec.requireInstance("default").concerns(Environment.test, Optional.empty())); - assertFalse(spec.requireInstance("default").concerns(Environment.staging, Optional.empty())); - assertTrue(spec.requireInstance("default").concerns(Environment.prod, Optional.of(RegionName.from("us-east1")))); - assertTrue(spec.requireInstance("default").concerns(Environment.prod, Optional.of(RegionName.from("us-west1")))); - assertFalse(spec.requireInstance("default").concerns(Environment.prod, Optional.of(RegionName.from("no-such-region")))); + assertFalse(spec.requireInstance("default").concerns(test, Optional.empty())); + assertFalse(spec.requireInstance("default").concerns(staging, Optional.empty())); + assertTrue(spec.requireInstance("default").concerns(prod, Optional.of(RegionName.from("us-east1")))); + assertTrue(spec.requireInstance("default").concerns(prod, Optional.of(RegionName.from("us-west1")))); + assertFalse(spec.requireInstance("default").concerns(prod, Optional.of(RegionName.from("no-such-region")))); assertFalse(spec.requireInstance("default").globalServiceId().isPresent()); assertEquals(DeploymentSpec.UpgradePolicy.defaultPolicy, spec.requireInstance("default").upgradePolicy()); @@ -293,7 +298,7 @@ public class DeploymentSpecTest { assertEquals(1, instance2.steps().size()); assertEquals(1, instance2.zones().size()); - assertTrue(instance2.steps().get(0).concerns(Environment.prod, Optional.of(RegionName.from("us-central1")))); + assertTrue(instance2.steps().get(0).concerns(prod, Optional.of(RegionName.from("us-central1")))); } @Test @@ -322,25 +327,25 @@ public class DeploymentSpecTest { assertEquals(5, instance.steps().size()); assertEquals(4, instance.zones().size()); - assertTrue(instance.steps().get(0).concerns(Environment.test)); + assertTrue(instance.steps().get(0).concerns(test)); - assertTrue(instance.steps().get(1).concerns(Environment.staging)); + assertTrue(instance.steps().get(1).concerns(staging)); - assertTrue(instance.steps().get(2).concerns(Environment.prod, Optional.of(RegionName.from("us-east1")))); + assertTrue(instance.steps().get(2).concerns(prod, Optional.of(RegionName.from("us-east1")))); assertFalse(((DeploymentSpec.DeclaredZone)instance.steps().get(2)).active()); assertTrue(instance.steps().get(3) instanceof DeploymentSpec.Delay); assertEquals(3 * 60 * 60 + 30 * 60, instance.steps().get(3).delay().getSeconds()); - assertTrue(instance.steps().get(4).concerns(Environment.prod, Optional.of(RegionName.from("us-west1")))); + assertTrue(instance.steps().get(4).concerns(prod, Optional.of(RegionName.from("us-west1")))); assertTrue(((DeploymentSpec.DeclaredZone)instance.steps().get(4)).active()); - assertTrue(instance.concerns(Environment.test, Optional.empty())); - assertTrue(instance.concerns(Environment.test, Optional.of(RegionName.from("region1")))); // test steps specify no region - assertTrue(instance.concerns(Environment.staging, Optional.empty())); - assertTrue(instance.concerns(Environment.prod, Optional.of(RegionName.from("us-east1")))); - assertTrue(instance.concerns(Environment.prod, Optional.of(RegionName.from("us-west1")))); - assertFalse(instance.concerns(Environment.prod, Optional.of(RegionName.from("no-such-region")))); + assertTrue(instance.concerns(test, Optional.empty())); + assertTrue(instance.concerns(test, Optional.of(RegionName.from("region1")))); // test steps specify no region + assertTrue(instance.concerns(staging, Optional.empty())); + assertTrue(instance.concerns(prod, Optional.of(RegionName.from("us-east1")))); + assertTrue(instance.concerns(prod, Optional.of(RegionName.from("us-west1")))); + assertFalse(instance.concerns(prod, Optional.of(RegionName.from("no-such-region")))); assertFalse(instance.globalServiceId().isPresent()); } @@ -563,7 +568,7 @@ public class DeploymentSpecTest { DeploymentInstanceSpec instance = spec.instances().get(0); assertEquals("default", instance.name().value()); - assertEquals("service", instance.athenzService(Environment.prod, RegionName.defaultName()).get().value()); + assertEquals("service", instance.athenzService(prod, RegionName.defaultName()).get().value()); } @Test @@ -695,9 +700,9 @@ public class DeploymentSpecTest { List<DeploymentSpec.Step> innerParallelSteps = secondSerialSteps.get(2).steps(); assertEquals(3, innerParallelSteps.size()); assertEquals("prod.ap-northeast-1", innerParallelSteps.get(0).toString()); - assertEquals("no-service", spec.requireInstance("instance").athenzService(Environment.prod, RegionName.from("ap-northeast-1")).get().value()); + assertEquals("no-service", spec.requireInstance("instance").athenzService(prod, RegionName.from("ap-northeast-1")).get().value()); assertEquals("prod.ap-southeast-2", innerParallelSteps.get(1).toString()); - assertEquals("in-service", spec.requireInstance("instance").athenzService(Environment.prod, RegionName.from("ap-southeast-2")).get().value()); + assertEquals("in-service", spec.requireInstance("instance").athenzService(prod, RegionName.from("ap-southeast-2")).get().value()); assertEquals("tests for prod.aws-us-east-1a", innerParallelSteps.get(2).toString()); } @@ -956,7 +961,7 @@ public class DeploymentSpecTest { DeploymentSpec spec = DeploymentSpec.fromXml(r); assertEquals("domain", spec.athenzDomain().get().value()); assertEquals("service", spec.athenzService().get().value()); - assertEquals("service", spec.requireInstance("instance1").athenzService(Environment.prod, + assertEquals("service", spec.requireInstance("instance1").athenzService(prod, RegionName.from("us-west-1")).get().value()); } @@ -979,11 +984,11 @@ public class DeploymentSpecTest { assertEquals("domain", spec.athenzDomain().get().value()); assertEquals("service", spec.athenzService().get().value()); - assertEquals("prod-service", spec.requireInstance("instance1").athenzService(Environment.prod, + assertEquals("prod-service", spec.requireInstance("instance1").athenzService(prod, RegionName.from("us-central-1")).get().value()); - assertEquals("prod-service", spec.requireInstance("instance1").athenzService(Environment.prod, + assertEquals("prod-service", spec.requireInstance("instance1").athenzService(prod, RegionName.from("us-west-1")).get().value()); - assertEquals("prod-service", spec.requireInstance("instance1").athenzService(Environment.prod, + assertEquals("prod-service", spec.requireInstance("instance1").athenzService(prod, RegionName.from("us-east-3")).get().value()); } @@ -1014,11 +1019,11 @@ public class DeploymentSpecTest { """; DeploymentSpec spec = DeploymentSpec.fromXml(r); assertEquals("domain", spec.athenzDomain().get().value()); - assertEquals("service", spec.requireInstance("instance1").athenzService(Environment.prod, + assertEquals("service", spec.requireInstance("instance1").athenzService(prod, RegionName.from("us-west-1")).get().value()); - assertEquals("service", spec.requireInstance("instance1").athenzService(Environment.prod, + assertEquals("service", spec.requireInstance("instance1").athenzService(prod, RegionName.from("us-east-3")).get().value()); - assertEquals("service", spec.requireInstance("instance2").athenzService(Environment.prod, + assertEquals("service", spec.requireInstance("instance2").athenzService(prod, RegionName.from("us-east-3")).get().value()); } @@ -1036,7 +1041,7 @@ public class DeploymentSpecTest { DeploymentSpec spec = DeploymentSpec.fromXml(r); assertEquals("domain", spec.athenzDomain().get().value()); assertEquals(Optional.empty(), spec.athenzService()); - assertEquals("service", spec.requireInstance("default").athenzService(Environment.prod, RegionName.from("us-west-1")).get().value()); + assertEquals("service", spec.requireInstance("default").athenzService(prod, RegionName.from("us-west-1")).get().value()); } @Test @@ -1054,13 +1059,13 @@ public class DeploymentSpecTest { ); DeploymentSpec spec = DeploymentSpec.fromXml(r); assertEquals("service", - spec.requireInstance("default").athenzService(Environment.test, + spec.requireInstance("default").athenzService(test, RegionName.from("us-east-1")).get().value()); assertEquals("staging-service", - spec.requireInstance("default").athenzService(Environment.staging, + spec.requireInstance("default").athenzService(staging, RegionName.from("us-north-1")).get().value()); assertEquals("prod-service", - spec.requireInstance("default").athenzService(Environment.prod, + spec.requireInstance("default").athenzService(prod, RegionName.from("us-west-1")).get().value()); } @@ -1273,8 +1278,8 @@ public class DeploymentSpecTest { assertEquals(List.of(RegionName.from("us-east")), spec.requireInstance("default").endpoints().get(0).regions()); - var zone = from(Environment.prod, RegionName.from("us-east")); - var testZone = from(Environment.test, RegionName.from("us-east")); + var zone = from(prod, RegionName.from("us-east")); + var testZone = from(test, RegionName.from("us-east")); assertEquals(ZoneEndpoint.defaultEndpoint, spec.zoneEndpoint(InstanceName.from("custom"), zone, ClusterSpec.Id.from("bax"))); assertEquals(ZoneEndpoint.defaultEndpoint, @@ -1778,23 +1783,142 @@ public class DeploymentSpecTest { """; DeploymentSpec spec = DeploymentSpec.fromXml(r); assertEquals(Optional.of(CloudAccount.from("100000000000")), spec.cloudAccount()); - assertCloudAccount("800000000000", spec.requireInstance("alpha"), Environment.prod, "us-east-1"); - assertCloudAccount("200000000000", spec.requireInstance("beta"), Environment.prod, "us-west-1"); - assertCloudAccount("600000000000", spec.requireInstance("beta"), Environment.staging, ""); - assertCloudAccount("700000000000", spec.requireInstance("beta"), Environment.perf, ""); - assertCloudAccount("200000000000", spec.requireInstance("beta"), Environment.dev, ""); - assertCloudAccount("300000000000", spec.requireInstance("main"), Environment.prod, "us-east-1"); - assertCloudAccount("100000000000", spec.requireInstance("main"), Environment.prod, "eu-west-1"); - assertCloudAccount("400000000000", spec.requireInstance("main"), Environment.dev, ""); - assertCloudAccount("500000000000", spec.requireInstance("main"), Environment.test, ""); - assertCloudAccount("100000000000", spec.requireInstance("main"), Environment.staging, ""); - assertCloudAccount("default", spec.requireInstance("beta"), Environment.prod, "us-west-2"); + assertCloudAccount("800000000000", spec.requireInstance("alpha"), prod, "us-east-1"); + assertCloudAccount("200000000000", spec.requireInstance("beta"), prod, "us-west-1"); + assertCloudAccount("600000000000", spec.requireInstance("beta"), staging, ""); + assertCloudAccount("700000000000", spec.requireInstance("beta"), perf, ""); + assertCloudAccount("200000000000", spec.requireInstance("beta"), dev, ""); + assertCloudAccount("300000000000", spec.requireInstance("main"), prod, "us-east-1"); + assertCloudAccount("100000000000", spec.requireInstance("main"), prod, "eu-west-1"); + assertCloudAccount("400000000000", spec.requireInstance("main"), dev, ""); + assertCloudAccount("500000000000", spec.requireInstance("main"), test, ""); + assertCloudAccount("100000000000", spec.requireInstance("main"), staging, ""); + assertCloudAccount("default", spec.requireInstance("beta"), prod, "us-west-2"); + } + + @Test + public void hostTTL() { + String r = + """ + <deployment version='1.0' cloud-account='100000000000' empty-host-ttl='1h'> + <instance id='alpha'> + <staging /> + <prod empty-host-ttl='1m'> + <region>us-east</region> + <region empty-host-ttl='2m'>us-west</region> + </prod> + </instance> + <instance id='beta'> + <staging empty-host-ttl='3d'/> + <perf empty-host-ttl='4h'/> + <prod> + <region>us-east</region> + <region empty-host-ttl='0d'>us-west</region> + </prod> + </instance> + <instance id='gamma' empty-host-ttl='6h'> + <dev empty-host-ttl='7d'/> + <prod> + <region>us-east</region> + </prod> + </instance> + </deployment> + """; + DeploymentSpec spec = DeploymentSpec.fromXml(r); + assertEquals(Optional.of(CloudAccount.from("100000000000")), spec.cloudAccount()); + + assertHostTTL(Duration.ofHours(1), spec, "alpha", test, null); + assertHostTTL(Duration.ofHours(1), spec, "alpha", staging, null); + assertHostTTL(Duration.ofHours(1), spec, "alpha", dev, null); + assertHostTTL(Duration.ofHours(1), spec, "alpha", perf, null); + assertHostTTL(Duration.ofMinutes(1), spec, "alpha", prod, "us-east"); + assertHostTTL(Duration.ofMinutes(2), spec, "alpha", prod, "us-west"); + + assertHostTTL(Duration.ofHours(1), spec, "beta", test, null); + assertHostTTL(Duration.ofDays(3), spec, "beta", staging, null); + assertHostTTL(Duration.ofHours(1), spec, "beta", dev, null); + assertHostTTL(Duration.ofHours(4), spec, "beta", perf, null); + assertHostTTL(Duration.ofHours(1), spec, "beta", prod, "us-east"); + assertHostTTL(Duration.ZERO, spec, "beta", prod, "us-west"); + + assertHostTTL(Duration.ofHours(6), spec, "gamma", test, null); + assertHostTTL(Duration.ofHours(6), spec, "gamma", staging, null); + assertHostTTL(Duration.ofDays(7), spec, "gamma", dev, null); + assertHostTTL(Duration.ofHours(6), spec, "gamma", perf, null); + assertHostTTL(Duration.ofHours(6), spec, "gamma", prod, "us-east"); + assertHostTTL(Duration.ofHours(6), spec, "gamma", prod, "us-west"); + + assertHostTTL(Duration.ofHours(1), spec, "nope", test, null); + assertHostTTL(Duration.ofHours(1), spec, "nope", staging, null); + assertHostTTL(Duration.ofHours(1), spec, "nope", dev, null); + assertHostTTL(Duration.ofHours(1), spec, "nope", perf, null); + assertHostTTL(Duration.ofHours(1), spec, "nope", prod, "us-east"); + assertHostTTL(Duration.ofHours(1), spec, "nope", prod, "us-west"); + + assertEquals("Host TTL can only be specified with custom cloud accounts", + assertThrows(IllegalArgumentException.class, + () -> DeploymentSpec.fromXml(""" + <deployment version='1.0' empty-host-ttl='0m'> + <instance id='main'> + <prod> + <region>us-east-1</region> + </prod> + </instance> + </deployment> + """)) + .getMessage()); + + assertEquals("Host TTL can only be specified with custom cloud accounts", + assertThrows(IllegalArgumentException.class, + () -> DeploymentSpec.fromXml(""" + <deployment version='1.0'> + <instance id='main' empty-host-ttl='0m'> + <prod> + <region>us-east-1</region> + </prod> + </instance> + </deployment> + """)) + .getMessage()); + + assertEquals("Host TTL can only be specified with custom cloud accounts", + assertThrows(IllegalArgumentException.class, + () -> DeploymentSpec.fromXml(""" + <deployment version='1.0'> + <instance id='main'> + <prod empty-host-ttl='0m'> + <region>us-east-1</region> + </prod> + </instance> + </deployment> + """)) + .getMessage()); + + assertEquals("Host TTL can only be specified with custom cloud accounts", + assertThrows(IllegalArgumentException.class, + () -> DeploymentSpec.fromXml(""" + <deployment version='1.0'> + <instance id='main'> + <prod> + <region empty-host-ttl='0m'>us-east-1</region> + </prod> + </instance> + </deployment> + """)) + .getMessage()); + } private void assertCloudAccount(String expected, DeploymentInstanceSpec instance, Environment environment, String region) { assertEquals(Optional.of(expected).map(CloudAccount::from), instance.cloudAccount(environment, Optional.of(region).filter(s -> !s.isEmpty()).map(RegionName::from))); } + private void assertHostTTL(Duration expected, DeploymentSpec spec, String instance, Environment environment, String region) { + assertEquals(Optional.of(expected), spec.instance(InstanceName.from(instance)) + .flatMap(iSpec -> iSpec.hostTTL(environment, Optional.ofNullable(region).map(RegionName::from))) + .or(spec::hostTTL)); + } + private static void assertInvalid(String deploymentSpec, String errorMessagePart) { assertInvalid(deploymentSpec, errorMessagePart, new ManualClock()); } diff --git a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecWithoutInstanceTest.java b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecWithoutInstanceTest.java index 38410cc5b37..ed8074ddc61 100644 --- a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecWithoutInstanceTest.java +++ b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecWithoutInstanceTest.java @@ -25,6 +25,9 @@ import java.util.stream.Collectors; import static com.yahoo.config.application.api.Notifications.Role.author; import static com.yahoo.config.application.api.Notifications.When.failing; import static com.yahoo.config.application.api.Notifications.When.failingCommit; +import static com.yahoo.config.provision.Environment.dev; +import static com.yahoo.config.provision.Environment.prod; +import static com.yahoo.config.provision.Environment.test; import static com.yahoo.config.provision.zone.ZoneId.defaultId; import static com.yahoo.config.provision.zone.ZoneId.from; import static org.junit.Assert.assertEquals; @@ -49,11 +52,11 @@ public class DeploymentSpecWithoutInstanceTest { assertEquals(specXml, spec.xmlForm()); assertEquals(1, spec.steps().size()); assertFalse(spec.majorVersion().isPresent()); - assertTrue(spec.steps().get(0).concerns(Environment.test)); - assertTrue(spec.requireInstance("default").concerns(Environment.test, Optional.empty())); - assertTrue(spec.requireInstance("default").concerns(Environment.test, Optional.of(RegionName.from("region1")))); // test steps specify no region + assertTrue(spec.steps().get(0).concerns(test)); + assertTrue(spec.requireInstance("default").concerns(test, Optional.empty())); + assertTrue(spec.requireInstance("default").concerns(test, Optional.of(RegionName.from("region1")))); // test steps specify no region assertFalse(spec.requireInstance("default").concerns(Environment.staging, Optional.empty())); - assertFalse(spec.requireInstance("default").concerns(Environment.prod, Optional.empty())); + assertFalse(spec.requireInstance("default").concerns(prod, Optional.empty())); assertFalse(spec.requireInstance("default").globalServiceId().isPresent()); } @@ -83,9 +86,9 @@ public class DeploymentSpecWithoutInstanceTest { assertEquals(1, spec.steps().size()); assertEquals(1, spec.requireInstance("default").steps().size()); assertTrue(spec.requireInstance("default").steps().get(0).concerns(Environment.staging)); - assertFalse(spec.requireInstance("default").concerns(Environment.test, Optional.empty())); + assertFalse(spec.requireInstance("default").concerns(test, Optional.empty())); assertTrue(spec.requireInstance("default").concerns(Environment.staging, Optional.empty())); - assertFalse(spec.requireInstance("default").concerns(Environment.prod, Optional.empty())); + assertFalse(spec.requireInstance("default").concerns(prod, Optional.empty())); assertFalse(spec.requireInstance("default").globalServiceId().isPresent()); } @@ -104,17 +107,17 @@ public class DeploymentSpecWithoutInstanceTest { assertEquals(1, spec.steps().size()); assertEquals(2, spec.requireInstance("default").steps().size()); - assertTrue(spec.requireInstance("default").steps().get(0).concerns(Environment.prod, Optional.of(RegionName.from("us-east1")))); + assertTrue(spec.requireInstance("default").steps().get(0).concerns(prod, Optional.of(RegionName.from("us-east1")))); assertFalse(((DeploymentSpec.DeclaredZone)spec.requireInstance("default").steps().get(0)).active()); - assertTrue(spec.requireInstance("default").steps().get(1).concerns(Environment.prod, Optional.of(RegionName.from("us-west1")))); + assertTrue(spec.requireInstance("default").steps().get(1).concerns(prod, Optional.of(RegionName.from("us-west1")))); assertTrue(((DeploymentSpec.DeclaredZone)spec.requireInstance("default").steps().get(1)).active()); - assertFalse(spec.requireInstance("default").concerns(Environment.test, Optional.empty())); + assertFalse(spec.requireInstance("default").concerns(test, Optional.empty())); assertFalse(spec.requireInstance("default").concerns(Environment.staging, Optional.empty())); - assertTrue(spec.requireInstance("default").concerns(Environment.prod, Optional.of(RegionName.from("us-east1")))); - assertTrue(spec.requireInstance("default").concerns(Environment.prod, Optional.of(RegionName.from("us-west1")))); - assertFalse(spec.requireInstance("default").concerns(Environment.prod, Optional.of(RegionName.from("no-such-region")))); + assertTrue(spec.requireInstance("default").concerns(prod, Optional.of(RegionName.from("us-east1")))); + assertTrue(spec.requireInstance("default").concerns(prod, Optional.of(RegionName.from("us-west1")))); + assertFalse(spec.requireInstance("default").concerns(prod, Optional.of(RegionName.from("no-such-region")))); assertFalse(spec.requireInstance("default").globalServiceId().isPresent()); assertEquals(DeploymentSpec.UpgradePolicy.defaultPolicy, spec.requireInstance("default").upgradePolicy()); @@ -139,25 +142,25 @@ public class DeploymentSpecWithoutInstanceTest { assertEquals(5, spec.requireInstance("default").steps().size()); assertEquals(4, spec.requireInstance("default").zones().size()); - assertTrue(spec.requireInstance("default").steps().get(0).concerns(Environment.test)); + assertTrue(spec.requireInstance("default").steps().get(0).concerns(test)); assertTrue(spec.requireInstance("default").steps().get(1).concerns(Environment.staging)); - assertTrue(spec.requireInstance("default").steps().get(2).concerns(Environment.prod, Optional.of(RegionName.from("us-east1")))); + assertTrue(spec.requireInstance("default").steps().get(2).concerns(prod, Optional.of(RegionName.from("us-east1")))); assertFalse(((DeploymentSpec.DeclaredZone)spec.requireInstance("default").steps().get(2)).active()); assertTrue(spec.requireInstance("default").steps().get(3) instanceof DeploymentSpec.Delay); assertEquals(3 * 60 * 60 + 30 * 60, spec.requireInstance("default").steps().get(3).delay().getSeconds()); - assertTrue(spec.requireInstance("default").steps().get(4).concerns(Environment.prod, Optional.of(RegionName.from("us-west1")))); + assertTrue(spec.requireInstance("default").steps().get(4).concerns(prod, Optional.of(RegionName.from("us-west1")))); assertTrue(((DeploymentSpec.DeclaredZone)spec.requireInstance("default").steps().get(4)).active()); - assertTrue(spec.requireInstance("default").concerns(Environment.test, Optional.empty())); - assertTrue(spec.requireInstance("default").concerns(Environment.test, Optional.of(RegionName.from("region1")))); // test steps specify no region + assertTrue(spec.requireInstance("default").concerns(test, Optional.empty())); + assertTrue(spec.requireInstance("default").concerns(test, Optional.of(RegionName.from("region1")))); // test steps specify no region assertTrue(spec.requireInstance("default").concerns(Environment.staging, Optional.empty())); - assertTrue(spec.requireInstance("default").concerns(Environment.prod, Optional.of(RegionName.from("us-east1")))); - assertTrue(spec.requireInstance("default").concerns(Environment.prod, Optional.of(RegionName.from("us-west1")))); - assertFalse(spec.requireInstance("default").concerns(Environment.prod, Optional.of(RegionName.from("no-such-region")))); + assertTrue(spec.requireInstance("default").concerns(prod, Optional.of(RegionName.from("us-east1")))); + assertTrue(spec.requireInstance("default").concerns(prod, Optional.of(RegionName.from("us-west1")))); + assertFalse(spec.requireInstance("default").concerns(prod, Optional.of(RegionName.from("no-such-region")))); assertFalse(spec.requireInstance("default").globalServiceId().isPresent()); } @@ -436,9 +439,9 @@ public class DeploymentSpecWithoutInstanceTest { List<DeploymentSpec.Step> innerParallelSteps = secondSerialSteps.get(2).steps(); assertEquals(3, innerParallelSteps.size()); assertEquals("prod.ap-northeast-1", innerParallelSteps.get(0).toString()); - assertEquals("no-service", spec.requireInstance("default").athenzService(Environment.prod, RegionName.from("ap-northeast-1")).get().value()); + assertEquals("no-service", spec.requireInstance("default").athenzService(prod, RegionName.from("ap-northeast-1")).get().value()); assertEquals("prod.ap-southeast-2", innerParallelSteps.get(1).toString()); - assertEquals("service", spec.requireInstance("default").athenzService(Environment.prod, RegionName.from("ap-southeast-2")).get().value()); + assertEquals("service", spec.requireInstance("default").athenzService(prod, RegionName.from("ap-southeast-2")).get().value()); assertEquals("tests for prod.aws-us-east-1a", innerParallelSteps.get(2).toString()); } @@ -534,7 +537,7 @@ public class DeploymentSpecWithoutInstanceTest { ); DeploymentSpec spec = DeploymentSpec.fromXml(r); assertEquals(spec.athenzDomain().get().value(), "domain"); - assertEquals(spec.requireInstance("default").athenzService(Environment.prod, RegionName.from("us-west-1")).get().value(), "service"); + assertEquals(spec.requireInstance("default").athenzService(prod, RegionName.from("us-west-1")).get().value(), "service"); } @Test @@ -553,11 +556,11 @@ public class DeploymentSpecWithoutInstanceTest { DeploymentSpec spec = DeploymentSpec.fromXml(r); assertEquals("domain", spec.athenzDomain().get().value()); assertEquals("service", spec.athenzService().get().value()); - assertEquals("prod-service", spec.requireInstance("default").athenzService(Environment.prod, RegionName.from("us-central-1")) + assertEquals("prod-service", spec.requireInstance("default").athenzService(prod, RegionName.from("us-central-1")) .get().value()); - assertEquals("prod-service", spec.requireInstance("default").athenzService(Environment.prod, RegionName.from("us-west-1")) + assertEquals("prod-service", spec.requireInstance("default").athenzService(prod, RegionName.from("us-west-1")) .get().value()); - assertEquals("prod-service", spec.requireInstance("default").athenzService(Environment.prod, RegionName.from("us-east-3")) + assertEquals("prod-service", spec.requireInstance("default").athenzService(prod, RegionName.from("us-east-3")) .get().value()); } @@ -575,9 +578,9 @@ public class DeploymentSpecWithoutInstanceTest { DeploymentSpec spec = DeploymentSpec.fromXml(r); assertEquals("service", spec.athenzService().get().value()); assertEquals(spec.athenzDomain().get().value(), "domain"); - assertEquals(spec.requireInstance("default").athenzService(Environment.test, RegionName.from("us-east-1")).get().value(), "service"); + assertEquals(spec.requireInstance("default").athenzService(test, RegionName.from("us-east-1")).get().value(), "service"); assertEquals(spec.requireInstance("default").athenzService(Environment.staging, RegionName.from("us-north-1")).get().value(), "staging-service"); - assertEquals(spec.requireInstance("default").athenzService(Environment.prod, RegionName.from("us-west-1")).get().value(), "prod-service"); + assertEquals(spec.requireInstance("default").athenzService(prod, RegionName.from("us-west-1")).get().value(), "prod-service"); } @Test(expected = IllegalArgumentException.class) @@ -694,7 +697,7 @@ public class DeploymentSpecWithoutInstanceTest { assertEquals(List.of(RegionName.from("us-east")), spec.requireInstance("default").endpoints().get(0).regions()); - var zone = from(Environment.prod, RegionName.from("us-east")); + var zone = from(prod, RegionName.from("us-east")); assertEquals(ZoneEndpoint.defaultEndpoint, spec.zoneEndpoint(InstanceName.from("custom"), zone, ClusterSpec.Id.from("bax"))); assertEquals(ZoneEndpoint.defaultEndpoint, @@ -742,8 +745,8 @@ public class DeploymentSpecWithoutInstanceTest { DeploymentSpec spec = DeploymentSpec.fromXml(r); DeploymentInstanceSpec instance = spec.requireInstance("default"); assertEquals(Optional.of(CloudAccount.from("012345678912")), spec.cloudAccount()); - assertEquals(Optional.of(CloudAccount.from("219876543210")), instance.cloudAccount(Environment.prod, Optional.of(RegionName.from("us-east-1")))); - assertEquals(Optional.of(CloudAccount.from("012345678912")), instance.cloudAccount(Environment.prod, Optional.of(RegionName.from("us-west-1")))); + assertEquals(Optional.of(CloudAccount.from("219876543210")), instance.cloudAccount(prod, Optional.of(RegionName.from("us-east-1")))); + assertEquals(Optional.of(CloudAccount.from("012345678912")), instance.cloudAccount(prod, Optional.of(RegionName.from("us-west-1")))); assertEquals(Optional.of(CloudAccount.from("012345678912")), instance.cloudAccount(Environment.staging, Optional.empty())); r = new StringReader( @@ -756,8 +759,41 @@ public class DeploymentSpecWithoutInstanceTest { ); spec = DeploymentSpec.fromXml(r); assertEquals(Optional.empty(), spec.cloudAccount()); - assertEquals(Optional.of(CloudAccount.from("219876543210")), spec.requireInstance("default").cloudAccount(Environment.prod, Optional.of(RegionName.from("us-east-1")))); - assertEquals(Optional.empty(), spec.requireInstance("default").cloudAccount(Environment.prod, Optional.of(RegionName.from("us-west-1")))); + assertEquals(Optional.of(CloudAccount.from("219876543210")), spec.requireInstance("default").cloudAccount(prod, Optional.of(RegionName.from("us-east-1")))); + assertEquals(Optional.empty(), spec.requireInstance("default").cloudAccount(prod, Optional.of(RegionName.from("us-west-1")))); + } + + @Test + public void productionSpecWithHostTTL() { + String r = """ + <deployment version='1.0' cloud-account='012345678912' empty-host-ttl='1d'> + <prod> + <region empty-host-ttl='1m'>us-east-1</region> + <region>us-west-1</region> + </prod> + </deployment> + """; + DeploymentSpec spec = DeploymentSpec.fromXml(r); + assertEquals(Optional.of(Duration.ofDays(1)), spec.hostTTL()); + DeploymentInstanceSpec instance = spec.requireInstance("default"); + assertEquals(Optional.of(Duration.ofMinutes(1)), instance.hostTTL(prod, Optional.of(RegionName.from("us-east-1")))); + assertEquals(Optional.of(Duration.ofDays(1)), instance.hostTTL(prod, Optional.of(RegionName.from("us-west-1")))); + assertEquals(Optional.of(Duration.ofDays(1)), instance.hostTTL(test, Optional.empty())); + + r = """ + <deployment version='1.0' cloud-account='012345678912'> + <prod empty-host-ttl='1d'> + <region empty-host-ttl='1m'>us-east-1</region> + <region>us-west-1</region> + </prod> + </deployment> + """; + spec = DeploymentSpec.fromXml(r); + assertEquals(Optional.empty(), spec.hostTTL()); + instance = spec.requireInstance("default"); + assertEquals(Optional.of(Duration.ofMinutes(1)), instance.hostTTL(prod, Optional.of(RegionName.from("us-east-1")))); + assertEquals(Optional.of(Duration.ofDays(1)), instance.hostTTL(prod, Optional.of(RegionName.from("us-west-1")))); + assertEquals(Optional.empty(), instance.hostTTL(test, Optional.empty())); } private static Set<String> endpointRegions(String endpointId, DeploymentSpec spec) { |