summaryrefslogtreecommitdiffstats
path: root/controller-server/src
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2019-04-12 12:32:03 +0100
committerGitHub <noreply@github.com>2019-04-12 12:32:03 +0100
commit84811bdfc924e30d5a5587d077502f9a2b8071c7 (patch)
treee40673df1220f874e7b91d59b3fa7202fdaa2c64 /controller-server/src
parenta7e442ed1b38cb4d543c1242c61be4813eea418b (diff)
parentb66db0a46b7038444b449d0b51d69eb05871658b (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.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java36
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/testdata/complete-application.json3
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java17
-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