diff options
author | Jon Bratseth <bratseth@oath.com> | 2018-10-22 13:00:59 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@oath.com> | 2018-10-22 13:00:59 +0200 |
commit | e2670e779298ac8683aca7333e32bbf860c68033 (patch) | |
tree | 3bad508716965a99a86595f569b0ac1f63915800 /controller-server | |
parent | 23afd5993ba3e22334c42e1a4af7d146cf5da801 (diff) |
Add suspended to application/v4
Diffstat (limited to 'controller-server')
5 files changed, 47 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 79bc72f950d..776cb86fbac 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 @@ -610,6 +610,19 @@ public class ApplicationController { } } + /** + * Asks the config server whether this deployment is currently <i>suspended</i>: + * Not in a state where it should receive traffic. + */ + public boolean isSuspended(DeploymentId deploymentId) { + try { + return configServer.isSuspended(deploymentId); + } + catch (NoInstanceException e) { + throw new IllegalArgumentException("Could not check suspension of " + deploymentId + ": No such deployment"); + } + } + /** Deactivate application in the given zone */ public void deactivate(ApplicationId application, ZoneId zone) { lockOrThrow(application, lockedApplication -> store(deactivate(lockedApplication, zone))); 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 57133986654..2058c556464 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 @@ -175,6 +175,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler { if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/job/{jobtype}")) return JobControllerApiHandlerHelper.runResponse(controller.jobController().runs(appIdFromPath(path), jobTypeFromPath(path)), request.getUri()); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/job/{jobtype}/run/{number}")) return JobControllerApiHandlerHelper.runDetailsResponse(controller.jobController(), runIdFromPath(path), request.getProperty("after")); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}")) return deployment(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), request); + if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/suspended")) return suspended(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/service")) return services(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/service/{service}/{*}")) return service(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), path.get("service"), path.getRest(), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/global-rotation")) return rotationStatus(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region")); @@ -636,6 +637,16 @@ public class ApplicationApiHandler extends LoggingRequestHandler { return new SlimeJsonResponse(slime); } + private HttpResponse suspended(String tenantName, String applicationName, String instanceName, String environment, String region, HttpRequest request) { + DeploymentId deploymentId = new DeploymentId(ApplicationId.from(tenantName, applicationName, instanceName), + ZoneId.from(environment, region)); + boolean suspended = controller.applications().isSuspended(deploymentId); + Slime slime = new Slime(); + Cursor response = slime.setObject(); + response.setBool("suspended", suspended); + return new SlimeJsonResponse(slime); + } + private HttpResponse services(String tenantName, String applicationName, String instanceName, String environment, String region, HttpRequest request) { ApplicationView applicationView = controller.getApplicationView(tenantName, applicationName, instanceName, environment, region); ServiceApiResponse response = new ServiceApiResponse(ZoneId.from(environment, region), @@ -1246,4 +1257,5 @@ public class ApplicationApiHandler extends LoggingRequestHandler { applicationPackage.zippedContent(), dataParts.get(EnvironmentResource.APPLICATION_TEST_ZIP)); } + } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java index e29ffd824cd..887bbbfcba9 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java @@ -34,6 +34,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -53,6 +54,7 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer private final NodeRepositoryMock nodeRepository = new NodeRepositoryMock(); private final Map<DeploymentId, ServiceConvergence> serviceStatus = new HashMap<>(); private final Version initialVersion = new Version(6, 1, 0); + private final Set<DeploymentId> suspendedApplications = new HashSet<>(); private Version lastPrepareVersion = null; private RuntimeException prepareException = null; @@ -153,6 +155,13 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer return Optional.ofNullable(applications.get(id)); } + public void setSuspended(DeploymentId deployment, boolean suspend) { + if (suspend) + suspendedApplications.add(deployment); + else + suspendedApplications.remove(deployment); + } + @Override public NodeRepositoryMock nodeRepository() { return nodeRepository; @@ -236,6 +245,11 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer } @Override + public boolean isSuspended(DeploymentId deployment) { + return suspendedApplications.contains(deployment); + } + + @Override public void restart(DeploymentId deployment, Optional<Hostname> hostname) { nodeRepository().requestRestart(deployment, hostname.map(Identifier::id).map(HostName::from)); } 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 d620d78d3f0..07cef02501d 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 @@ -361,6 +361,11 @@ public class ApplicationApiTest extends ControllerContainerTest { .screwdriverIdentity(SCREWDRIVER_ID), "{\"error-code\":\"INTERNAL_SERVER_ERROR\",\"message\":\"No node with the hostname host1 is known.\"}", 500); + // GET suspended + tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1/environment/prod/region/corp-us-east-1/instance/default/suspended", GET) + .userIdentity(USER_ID), + new File("suspended.json")); + // GET services tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1/environment/prod/region/corp-us-east-1/instance/default/service", GET) .userIdentity(USER_ID), diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/suspended.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/suspended.json new file mode 100644 index 00000000000..a360474da49 --- /dev/null +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/suspended.json @@ -0,0 +1,3 @@ +{ + "suspended":false +}
\ No newline at end of file |