diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-04-12 12:32:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-12 12:32:03 +0100 |
commit | 84811bdfc924e30d5a5587d077502f9a2b8071c7 (patch) | |
tree | e40673df1220f874e7b91d59b3fa7202fdaa2c64 /controller-server/src | |
parent | a7e442ed1b38cb4d543c1242c61be4813eea418b (diff) | |
parent | b66db0a46b7038444b449d0b51d69eb05871658b (diff) |
Merge pull request #9107 from vespa-engine/jvenstad/application-deploy-key-API
Jvenstad/application deploy key api
Diffstat (limited to 'controller-server/src')
-rw-r--r-- | controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java | 2 | ||||
-rw-r--r-- | controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java | 36 | ||||
-rw-r--r-- | controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/testdata/complete-application.json | 3 | ||||
-rw-r--r-- | controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java | 17 | ||||
-rw-r--r-- | controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2-with-patches.json (renamed from controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2-with-majorVersion.json) | 1 |
5 files changed, 46 insertions, 13 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java index c82c0d1be06..943ede5197b 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java @@ -250,7 +250,7 @@ public class LockedApplication { metrics, pemDeployKey, rotation, rotationStatus); } - public LockedApplication withPemSubmissionKey(String pemDeployKey) { + public LockedApplication withPemDeployKey(String pemDeployKey) { return new LockedApplication(lock, id, createdAt, deploymentSpec, validationOverrides, deployments, deploymentJobs, change, outstandingChange, ownershipIssueId, owner, majorVersion, metrics, Optional.ofNullable(pemDeployKey), rotation, rotationStatus); 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 612c323fc31..74206d05009 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 @@ -19,6 +19,7 @@ import com.yahoo.restapi.Path; import com.yahoo.slime.Cursor; import com.yahoo.slime.Inspector; import com.yahoo.slime.Slime; +import com.yahoo.slime.Type; import com.yahoo.vespa.athenz.api.AthenzIdentity; import com.yahoo.vespa.athenz.api.AthenzPrincipal; import com.yahoo.vespa.athenz.api.AthenzUser; @@ -96,6 +97,7 @@ import java.util.Map; import java.util.Optional; import java.util.Scanner; import java.util.Set; +import java.util.StringJoiner; import java.util.logging.Level; import static java.util.stream.Collectors.joining; @@ -215,7 +217,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler { private HttpResponse handlePATCH(Path path, HttpRequest request) { if (path.matches("/application/v4/tenant/{tenant}/application/{application}")) - return setMajorVersion(path.get("tenant"), path.get("application"), request); + return patchApplication(path.get("tenant"), path.get("application"), request); return ErrorResponse.notFoundError("Nothing at " + path); } @@ -308,15 +310,27 @@ public class ApplicationApiHandler extends LoggingRequestHandler { return new SlimeJsonResponse(slime); } - private HttpResponse setMajorVersion(String tenantName, String applicationName, HttpRequest request) { - Application application = getApplication(tenantName, applicationName); - Inspector majorVersionField = toSlime(request.getData()).get().field("majorVersion"); - if ( ! majorVersionField.valid()) - throw new IllegalArgumentException("Request body must contain a majorVersion field"); - Integer majorVersion = majorVersionField.asLong() == 0 ? null : (int)majorVersionField.asLong(); - controller.applications().lockIfPresent(application.id(), - a -> controller.applications().store(a.withMajorVersion(majorVersion))); - return new MessageResponse("Set major version to " + ( majorVersion == null ? "empty" : majorVersion)); + private HttpResponse patchApplication(String tenantName, String applicationName, HttpRequest request) { + Inspector requestObject = toSlime(request.getData()).get(); + StringJoiner messageBuilder = new StringJoiner("\n").setEmptyValue("No applicable changes."); + controller.applications().lockOrThrow(ApplicationId.from(tenantName, applicationName, "default"), application -> { + Inspector majorVersionField = requestObject.field("majorVersion"); + if (majorVersionField.valid()) { + Integer majorVersion = majorVersionField.asLong() == 0 ? null : (int) majorVersionField.asLong(); + application = application.withMajorVersion(majorVersion); + messageBuilder.add("Set major version to " + (majorVersion == null ? "empty" : majorVersion)); + } + + Inspector pemDeployKeyField = requestObject.field("pemDeployKey"); + if (pemDeployKeyField.valid()) { + String pemDeployKey = pemDeployKeyField.type() == Type.NIX ? null : pemDeployKeyField.asString(); + application = application.withPemDeployKey(pemDeployKey); + messageBuilder.add("Set pem deploy key to " + (pemDeployKey == null ? "empty" : pemDeployKey)); + } + + controller.applications().store(application); + }); + return new MessageResponse(messageBuilder.toString()); } private Application getApplication(String tenantName, String applicationName) { @@ -526,6 +540,8 @@ public class ApplicationApiHandler extends LoggingRequestHandler { } } + application.pemDeployKey().ifPresent(key -> object.setString("pemDeployKey", key)); + // Metrics Cursor metricsObject = object.setObject("metrics"); metricsObject.setDouble("queryServiceQuality", application.metrics().queryServiceQuality()); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/testdata/complete-application.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/testdata/complete-application.json index eb3269fafc8..cb5e34b8dae 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/testdata/complete-application.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/testdata/complete-application.json @@ -510,5 +510,6 @@ }, "outstandingChangeField": false, "queryQuality": 100, - "writeQuality": 99.99894341115082 + "writeQuality": 99.99894341115082, + "pemDeployKey": "-----BEGIN PUBLIC KEY-----\n∠( ᐛ 」∠)_\n-----END PUBLIC KEY-----" } 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 f617dc0a447..d3f0f423089 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 @@ -329,15 +329,30 @@ public class ApplicationApiTest extends ControllerContainerTest { .userIdentity(USER_ID) .data("{\"majorVersion\":7}"), "{\"message\":\"Set major version to 7\"}"); + + // PATCH in a pem deploy key + tester.assertResponse(request("/application/v4/tenant/tenant2/application/application2", PATCH) + .userIdentity(USER_ID) + .data("{\"pemDeployKey\":\"-----BEGIN PUBLIC KEY-----\n∠( ᐛ 」∠)_\n-----END PUBLIC KEY-----\"}"), + "{\"message\":\"Set pem deploy key to -----BEGIN PUBLIC KEY-----\\n∠( ᐛ 」∠)_\\n-----END PUBLIC KEY-----\"}"); + // GET an application with a major version override tester.assertResponse(request("/application/v4/tenant/tenant2/application/application2", GET) .userIdentity(USER_ID), - new File("application2-with-majorVersion.json")); + new File("application2-with-patches.json")); + // PATCH in removal of the application major version override removal tester.assertResponse(request("/application/v4/tenant/tenant2/application/application2", PATCH) .userIdentity(USER_ID) .data("{\"majorVersion\":null}"), "{\"message\":\"Set major version to empty\"}"); + + // PATCH in removal of the pem deploy key + tester.assertResponse(request("/application/v4/tenant/tenant2/application/application2", PATCH) + .userIdentity(USER_ID) + .data("{\"pemDeployKey\":null}"), + "{\"message\":\"Set pem deploy key to empty\"}"); + tester.assertResponse(request("/application/v4/tenant/tenant2/application/application2", GET) .userIdentity(USER_ID), new File("application2.json")); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2-with-majorVersion.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2-with-patches.json index 1477e18b4b8..46f18f9d813 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2-with-majorVersion.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2-with-patches.json @@ -80,6 +80,7 @@ "majorVersion": 7, "globalRotations": [], "instances": [], + "pemDeployKey": "-----BEGIN PUBLIC KEY-----\n∠( ᐛ 」∠)_\n-----END PUBLIC KEY-----", "metrics": { "queryServiceQuality": 0.0, "writeServiceQuality": 0.0 |