summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-03-12 14:41:21 +0100
committerMartin Polden <mpolden@mpolden.no>2020-03-12 15:20:01 +0100
commit0e389e39ae3dd48bc3ef35441fbb6591c2c085d9 (patch)
treef4a7eed9e6cc040c00e23990f3717923b1fe5cdd
parent6e9f61e2ea76c4abf74931d742cdcb29fbbd2de9 (diff)
Require override for endpoint cluster change
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationPackageValidator.java12
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java23
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/RotationStatusUpdaterTest.java2
3 files changed, 31 insertions, 6 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationPackageValidator.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationPackageValidator.java
index a7d2d7ef385..c2a5389000b 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationPackageValidator.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationPackageValidator.java
@@ -108,7 +108,7 @@ public class ApplicationPackageValidator {
var newEndpoints = allEndpointsOf(applicationPackage.deploymentSpec().requireInstance(instanceName));
if (newEndpoints.containsAll(endpoints)) return; // Adding new endpoints is fine
- if (containsAllRegions(newEndpoints, endpoints)) return; // Adding regions to endpoints is fine
+ if (containsAllDestinationsOf(endpoints, newEndpoints)) return; // Adding destinations is fine
var removedEndpoints = new ArrayList<>(endpoints);
removedEndpoints.removeAll(newEndpoints);
@@ -122,19 +122,23 @@ public class ApplicationPackageValidator {
". " + ValidationOverrides.toAllowMessage(validationId));
}
- /** Returns whether endpoint regions in newEndpoints contains all regions of corresponding endpoint in endpoints */
- private static boolean containsAllRegions(List<Endpoint> newEndpoints, List<Endpoint> endpoints) {
+ /** Returns whether newEndpoints contains all destinations in endpoints */
+ private static boolean containsAllDestinationsOf(List<Endpoint> endpoints, List<Endpoint> newEndpoints) {
var containsAllRegions = true;
+ var hasSameCluster = true;
for (var endpoint : endpoints) {
var endpointContainsAllRegions = false;
+ var endpointHasSameCluster = false;
for (var newEndpoint : newEndpoints) {
if (endpoint.endpointId().equals(newEndpoint.endpointId())) {
endpointContainsAllRegions = newEndpoint.regions().containsAll(endpoint.regions());
+ endpointHasSameCluster = newEndpoint.containerId().equals(endpoint.containerId());
}
}
containsAllRegions &= endpointContainsAllRegions;
+ hasSameCluster &= endpointHasSameCluster;
}
- return containsAllRegions;
+ return containsAllRegions && hasSameCluster;
}
/** Returns all configued endpoints of given deployment instance spec */
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java
index 875e067156d..ad8c7d7c328 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java
@@ -906,13 +906,34 @@ public class ControllerTest {
assertEquals(ClusterSpec.Id.from("foo"), tester.applications().requireInstance(context.instanceId())
.rotations().get(0).clusterId());
- // Redeploy with endpoint cluster changed
+ // Redeploy with endpoint cluster changed needs override
applicationPackage = new ApplicationPackageBuilder()
.environment(Environment.prod)
.endpoint("default", "bar")
.region(west.region().value())
.region(east.region().value())
.build();
+ try {
+ context.submit(applicationPackage).deploy();
+ fail("Expected exception");
+ } catch (IllegalArgumentException e) {
+ assertEquals("global-endpoint-change: application 'tenant.application' has endpoints [endpoint " +
+ "'default' (cluster foo) -> us-east-3, us-west-1], but does not include all of these in " +
+ "deployment.xml. Deploying given deployment.xml will remove " +
+ "[endpoint 'default' (cluster foo) -> us-east-3, us-west-1] and add " +
+ "[endpoint 'default' (cluster bar) -> us-east-3, us-west-1]. To allow this add " +
+ "<allow until='yyyy-mm-dd'>global-endpoint-change</allow> to validation-overrides.xml, see " +
+ "https://docs.vespa.ai/documentation/reference/validation-overrides.html", e.getMessage());
+ }
+
+ // Redeploy with override succeeds
+ applicationPackage = new ApplicationPackageBuilder()
+ .environment(Environment.prod)
+ .endpoint("default", "bar")
+ .region(west.region().value())
+ .region(east.region().value())
+ .allow(ValidationId.globalEndpointChange)
+ .build();
context.submit(applicationPackage).deploy();
assertEquals(ClusterSpec.Id.from("bar"), tester.applications().requireInstance(context.instanceId())
.rotations().get(0).clusterId());
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/RotationStatusUpdaterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/RotationStatusUpdaterTest.java
index d7a28708049..77567a58ed2 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/RotationStatusUpdaterTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/RotationStatusUpdaterTest.java
@@ -65,7 +65,7 @@ public class RotationStatusUpdaterTest {
.region(zone1.region().value())
.region(zone2.region().value())
.region(zone3.region().value())
- .endpoint("default", "default", "us-east-3", "us-west-1")
+ .endpoint("default", "foo", "us-east-3", "us-west-1")
.endpoint("eu", "default", "eu-west-1")
.build();
context.submit(applicationPackage)