diff options
author | Jon Bratseth <bratseth@vespa.ai> | 2023-05-09 12:49:50 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@vespa.ai> | 2023-05-09 12:49:50 +0200 |
commit | 232f4384b13af3c3b94a6bd25fc9d11114c87ff2 (patch) | |
tree | 25fdf78282a3d8b6a276841d5fa58b6b6c587729 /config-model | |
parent | 3cf58185936ca332f86214999c86a7b3c1213933 (diff) |
Support a default BCP deadline
Diffstat (limited to 'config-model')
3 files changed, 141 insertions, 6 deletions
diff --git a/config-model/src/main/resources/schema/deployment.rnc b/config-model/src/main/resources/schema/deployment.rnc index cc9db471120..48a5c6bf25a 100644 --- a/config-model/src/main/resources/schema/deployment.rnc +++ b/config-model/src/main/resources/schema/deployment.rnc @@ -173,6 +173,7 @@ Endpoints = element endpoints { } Bcp = element bcp { + attribute deadline { xsd:string }? & Group+ } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/ClusterInfoTest.java b/config-model/src/test/java/com/yahoo/vespa/model/ClusterInfoTest.java index 0abb153696c..82baed07997 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/ClusterInfoTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/ClusterInfoTest.java @@ -5,10 +5,14 @@ import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.deploy.TestProperties; import com.yahoo.config.model.provision.InMemoryProvisioner; import com.yahoo.config.model.test.MockApplicationPackage; +import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.ApplicationName; import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Environment; +import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.RegionName; +import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import org.junit.jupiter.api.Test; @@ -41,29 +45,158 @@ public class ClusterInfoTest { <prod> <region>us-west-1</region> <region>us-east-1</region> + <region>eu-west-1</region> </prod> - <bcp> + <bcp deadline='48h'> <group deadline='30m'> <region fraction='0.5'>us-east-1</region> <region>us-west-1</region> </group> - <group> + <group deadline='0m'> <region fraction='0.5'>us-east-1</region> </group> + <group> + <region>eu-west-1</region> + </group> </bcp> </deployment> """; - var requestedInUsEast1 = requestedCapacityIn("us-east-1", servicesXml, deploymentXml); + var requestedInUsEast1 = requestedCapacityIn("default", "us-east-1", servicesXml, deploymentXml); assertEquals(Duration.ofMinutes(0), requestedInUsEast1.get(new ClusterSpec.Id("testcontainer")).clusterInfo().bcpDeadline()); assertEquals(Duration.ofMinutes(0), requestedInUsEast1.get(new ClusterSpec.Id("testcontent")).clusterInfo().bcpDeadline()); - var requestedInUsWest1 = requestedCapacityIn("us-west-1", servicesXml, deploymentXml); + var requestedInUsWest1 = requestedCapacityIn("default", "us-west-1", servicesXml, deploymentXml); assertEquals(Duration.ofMinutes(30), requestedInUsWest1.get(new ClusterSpec.Id("testcontainer")).clusterInfo().bcpDeadline()); assertEquals(Duration.ofMinutes(30), requestedInUsWest1.get(new ClusterSpec.Id("testcontent")).clusterInfo().bcpDeadline()); + + var requestedInEuWest1 = requestedCapacityIn("default", "eu-west-1", servicesXml, deploymentXml); + assertEquals(Duration.ofHours(48), requestedInEuWest1.get(new ClusterSpec.Id("testcontainer")).clusterInfo().bcpDeadline()); + assertEquals(Duration.ofHours(48), requestedInEuWest1.get(new ClusterSpec.Id("testcontent")).clusterInfo().bcpDeadline()); + } + + /** A high default deadline only will cause no resources to be set aside for BCP. */ + @Test + void specifying_only_default_deadline_is_possible() throws Exception { + var servicesXml = """ + <services version='1.0'> + <container id='testcontainer' version='1.0'> + <nodes count='3'/> + </container> + <content id='testcontent' version='1.0'> + <redundancy>2</redundancy> + <documents/> + </content> + </services> + """; + + var deploymentXml = """ + <deployment version='1.0'> + <instance id='default'> + <prod> + <region>us-east-1</region> + <region>us-west-1</region> + </prod> + </instance> + <bcp deadline='2d'/> + </deployment> + """; + + var requestedInUsEast1 = requestedCapacityIn("default", "us-east-1", servicesXml, deploymentXml); + assertEquals(Duration.ofHours(48), requestedInUsEast1.get(new ClusterSpec.Id("testcontainer")).clusterInfo().bcpDeadline()); + assertEquals(Duration.ofHours(48), requestedInUsEast1.get(new ClusterSpec.Id("testcontent")).clusterInfo().bcpDeadline()); + + var requestedInUsWest1 = requestedCapacityIn("default", "us-west-1", servicesXml, deploymentXml); + assertEquals(Duration.ofHours(48), requestedInUsWest1.get(new ClusterSpec.Id("testcontainer")).clusterInfo().bcpDeadline()); + assertEquals(Duration.ofHours(48), requestedInUsWest1.get(new ClusterSpec.Id("testcontent")).clusterInfo().bcpDeadline()); + } + + /** This implicitly creates one BCP group (which gives the same result as above). */ + @Test + void specifying_bcp_without_explicit_groups() throws Exception { + var servicesXml = """ + <services version='1.0'> + <container id='testcontainer' version='1.0'> + <nodes count='3'/> + </container> + <content id='testcontent' version='1.0'> + <redundancy>2</redundancy> + <documents/> + </content> + </services> + """; + + var deploymentXml = """ + <deployment version='1.0'> + <instance id='default'> + <prod> + <region>us-east-1</region> + <region>us-west-1</region> + </prod> + <bcp deadline='48h'/> + </instance> + </deployment> + """; + + var requestedInUsEast1 = requestedCapacityIn("default", "us-east-1", servicesXml, deploymentXml); + assertEquals(Duration.ofHours(48), requestedInUsEast1.get(new ClusterSpec.Id("testcontainer")).clusterInfo().bcpDeadline()); + assertEquals(Duration.ofHours(48), requestedInUsEast1.get(new ClusterSpec.Id("testcontent")).clusterInfo().bcpDeadline()); + + var requestedInUsWest1 = requestedCapacityIn("default", "us-west-1", servicesXml, deploymentXml); + assertEquals(Duration.ofHours(48), requestedInUsWest1.get(new ClusterSpec.Id("testcontainer")).clusterInfo().bcpDeadline()); + assertEquals(Duration.ofHours(48), requestedInUsWest1.get(new ClusterSpec.Id("testcontent")).clusterInfo().bcpDeadline()); + } + + @Test + void default_bcp_with_multiple_instances() throws Exception { + var servicesXml = """ + <services version='1.0'> + <container id='testcontainer' version='1.0'> + <nodes count='3'/> + </container> + <content id='testcontent' version='1.0'> + <redundancy>2</redundancy> + <documents/> + </content> + </services> + """; + + var deploymentXml = """ + <deployment version='1.0'> + <instance id='i1'> + <prod> + <region>us-east-1</region> + <region>us-west-1</region> + </prod> + </instance> + <instance id='i2'> + <prod> + <region>us-east-1</region> + <region>eu-west-1</region> + </prod> + </instance> + <bcp deadline='48h'/> + </deployment> + """; + + var requestedInI1UsEast1 = requestedCapacityIn("i1", "us-east-1", servicesXml, deploymentXml); + assertEquals(Duration.ofHours(48), requestedInI1UsEast1.get(new ClusterSpec.Id("testcontainer")).clusterInfo().bcpDeadline()); + assertEquals(Duration.ofHours(48), requestedInI1UsEast1.get(new ClusterSpec.Id("testcontent")).clusterInfo().bcpDeadline()); + + var requestedInI1UsWest1 = requestedCapacityIn("i1", "us-west-1", servicesXml, deploymentXml); + assertEquals(Duration.ofHours(48), requestedInI1UsWest1.get(new ClusterSpec.Id("testcontainer")).clusterInfo().bcpDeadline()); + assertEquals(Duration.ofHours(48), requestedInI1UsWest1.get(new ClusterSpec.Id("testcontent")).clusterInfo().bcpDeadline()); + + var requestedInI2UsEast1 = requestedCapacityIn("i2", "us-east-1", servicesXml, deploymentXml); + assertEquals(Duration.ofHours(48), requestedInI2UsEast1.get(new ClusterSpec.Id("testcontainer")).clusterInfo().bcpDeadline()); + assertEquals(Duration.ofHours(48), requestedInI2UsEast1.get(new ClusterSpec.Id("testcontent")).clusterInfo().bcpDeadline()); + + var requestedInI2UsWest1 = requestedCapacityIn("i2", "eu-west-1", servicesXml, deploymentXml); + assertEquals(Duration.ofHours(48), requestedInI2UsWest1.get(new ClusterSpec.Id("testcontainer")).clusterInfo().bcpDeadline()); + assertEquals(Duration.ofHours(48), requestedInI2UsWest1.get(new ClusterSpec.Id("testcontent")).clusterInfo().bcpDeadline()); } - private Map<ClusterSpec.Id, Capacity> requestedCapacityIn(String region, String servicesXml, String deploymentXml) throws Exception { + private Map<ClusterSpec.Id, Capacity> requestedCapacityIn(String instance, String region, String servicesXml, String deploymentXml) throws Exception { var applicationPackage = new MockApplicationPackage.Builder() .withServices(servicesXml) .withDeploymentSpec(deploymentXml) @@ -74,6 +207,7 @@ public class ClusterInfoTest { .applicationPackage(applicationPackage) .zone(new Zone(Environment.prod, RegionName.from(region))) .properties(new TestProperties().setHostedVespa(true) + .setApplicationId(ApplicationId.from(TenantName.defaultName(), ApplicationName.defaultName(), InstanceName.from(instance))) .setZone(new Zone(Environment.prod, RegionName.from(region)))) .modelHostProvisioner(provisioner) .provisioned(provisioner.provisioned()) diff --git a/config-model/src/test/schema-test-files/deployment-with-instances.xml b/config-model/src/test/schema-test-files/deployment-with-instances.xml index 0c3409533d1..2d319197e79 100644 --- a/config-model/src/test/schema-test-files/deployment-with-instances.xml +++ b/config-model/src/test/schema-test-files/deployment-with-instances.xml @@ -30,7 +30,7 @@ </endpoint> <endpoint container-id="bar" /> </endpoints> - <bcp> + <bcp deadline="1d"> <group deadline="60m"> <endpoint id="foo" container-id="baz"/> <region>us-west-1</region> |