diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-02-27 09:44:33 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2019-02-27 09:44:33 +0100 |
commit | ac8e514c25340390750ce8ef71545bbf962a5a4e (patch) | |
tree | 7b51897b218d98168e38e5546584fd45528772d5 /controller-server | |
parent | c975bdf233d3cf01d225b5e507aea7b8194b5a8a (diff) |
Expose per-cluster rotations in application API
Diffstat (limited to 'controller-server')
4 files changed, 55 insertions, 0 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java index a5e952b76c1..d68b3652675 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java @@ -46,6 +46,7 @@ import com.yahoo.vespa.hosted.controller.application.Deployment; import com.yahoo.vespa.hosted.controller.application.JobList; import com.yahoo.vespa.hosted.controller.application.JobStatus; import com.yahoo.vespa.hosted.controller.application.JobStatus.JobRun; +import com.yahoo.vespa.hosted.controller.application.RoutingPolicy; import com.yahoo.vespa.hosted.controller.application.SystemApplication; import com.yahoo.vespa.hosted.controller.athenz.impl.ZmsClientFacade; import com.yahoo.vespa.hosted.controller.concurrent.Once; @@ -699,10 +700,16 @@ public class ApplicationController { application, zone, platformVersion, applicationVersion, deployment.version(), deployment.applicationVersion())); } + /** Returns the rotation repository, used for managing global rotation assignments */ public RotationRepository rotationRepository() { return rotationRepository; } + /** Returns all known routing policies for given application */ + public Set<RoutingPolicy> routingPolicies(ApplicationId application) { + return curator.readRoutingPolicies(application); + } + /** Sort given list of applications by application ID */ private static List<Application> sort(List<Application> applications) { return applications.stream().sorted(Comparator.comparing(Application::id)).collect(Collectors.toList()); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java index a22f8ff37fd..0d5130b8aeb 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java @@ -9,6 +9,7 @@ import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ApplicationName; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.RegionName; +import com.yahoo.config.provision.RotationName; import com.yahoo.config.provision.TenantName; import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.container.jdisc.HttpResponse; @@ -63,8 +64,10 @@ import com.yahoo.vespa.hosted.controller.application.Deployment; import com.yahoo.vespa.hosted.controller.application.DeploymentCost; import com.yahoo.vespa.hosted.controller.application.DeploymentJobs; import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics; +import com.yahoo.vespa.hosted.controller.application.GlobalDnsName; import com.yahoo.vespa.hosted.controller.application.JobStatus; import com.yahoo.vespa.hosted.controller.application.RotationStatus; +import com.yahoo.vespa.hosted.controller.application.RoutingPolicy; import com.yahoo.vespa.hosted.controller.application.SystemApplication; import com.yahoo.vespa.hosted.controller.athenz.impl.ZmsClientFacade; import com.yahoo.vespa.hosted.controller.deployment.DeploymentTrigger; @@ -98,6 +101,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Scanner; +import java.util.Set; import java.util.logging.Level; import static java.util.stream.Collectors.joining; @@ -483,6 +487,15 @@ public class ApplicationApiHandler extends LoggingRequestHandler { object.setString("rotationId", application.rotation().get().asString()); }); + // Per-cluster rotations + Set<RoutingPolicy> routingPolicies = controller.applications().routingPolicies(application.id()); + for (RoutingPolicy policy : routingPolicies) { + for (RotationName rotation : policy.rotations()) { + GlobalDnsName dnsName = new GlobalDnsName(application.id(), controller.system(), rotation); + globalRotationsArray.addString(dnsName.oathUrl().toString()); + } + } + // Deployments sorted according to deployment spec List<Deployment> deployments = controller.applications().deploymentTrigger() .steps(application.deploymentSpec()) diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java index 8705945c75c..e2bf6a20684 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java @@ -10,6 +10,7 @@ import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.RegionName; +import com.yahoo.config.provision.RotationName; import com.yahoo.config.provision.TenantName; import com.yahoo.slime.Cursor; import com.yahoo.slime.Inspector; @@ -44,6 +45,7 @@ import com.yahoo.vespa.hosted.controller.application.DeploymentJobs; import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics; import com.yahoo.vespa.hosted.controller.application.JobStatus; import com.yahoo.vespa.hosted.controller.application.RotationStatus; +import com.yahoo.vespa.hosted.controller.application.RoutingPolicy; import com.yahoo.vespa.hosted.controller.athenz.ApplicationAction; import com.yahoo.vespa.hosted.controller.athenz.HostedAthenzIdentities; import com.yahoo.vespa.hosted.controller.athenz.mock.AthenzClientFactoryMock; @@ -76,6 +78,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.TreeMap; import java.util.function.Supplier; @@ -1285,6 +1288,20 @@ public class ApplicationApiTest extends ControllerContainerTest { assertEquals(DeploymentJobs.JobError.outOfCapacity, jobStatus.jobError().get()); } + @Test + public void applicationWithPerClusterGlobalRotation() { + Application app = controllerTester.createApplication(); + RoutingPolicy policy = new RoutingPolicy(app.id(), ZoneId.from(Environment.prod, RegionName.from("us-west-1")), + HostName.from("lb-0"), HostName.from("lb-0-canonical-name"), + Optional.of("dns-zone-1"), Set.of(RotationName.from("c0"))); + tester.controller().curator().writeRoutingPolicies(app.id(), Set.of(policy)); + + // GET application + tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1", GET) + .userIdentity(USER_ID), + new File("application-cluster-global-rotation.json")); + } + private void notifyCompletion(DeploymentJobs.JobReport report, ContainerControllerTester tester) { assertResponse(request("/application/v4/tenant/tenant1/application/application1/jobreport", POST) .userIdentity(HOSTED_VESPA_OPERATOR) diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application-cluster-global-rotation.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application-cluster-global-rotation.json new file mode 100644 index 00000000000..d23662b024b --- /dev/null +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application-cluster-global-rotation.json @@ -0,0 +1,18 @@ +{ + "application": "application1", + "instance": "default", + "deployments": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/default/job/", + "deployedInternally": false, + "deploymentJobs": [], + "changeBlockers": [], + "compileVersion": "7.0.0", + "globalRotations": [ + "https://c0--application1--tenant1.global.vespa.oath.cloud:4443/" + ], + "instances": [], + "metrics": { + "queryServiceQuality": 0.0, + "writeServiceQuality": 0.0 + }, + "activity": {} +} |