diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2020-08-25 17:06:47 +0200 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2020-08-25 17:06:47 +0200 |
commit | ab22c2320230889336f7ad5c3f642c6598d367cb (patch) | |
tree | d9d33cefc7a54bfaeae821179becf30c8ae740c4 /controller-server | |
parent | 1d5ffb9f0996c44f1b1fa29fd9773a14b477973c (diff) |
Allow deployment of application package without deployOptions
Diffstat (limited to 'controller-server')
3 files changed, 19 insertions, 3 deletions
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 20aa96e890d..7da8ac74936 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 @@ -1955,7 +1955,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler { } private static Map<String, byte[]> parseDataParts(HttpRequest request) { - String contentHash = request.getHeader("x-Content-Hash"); + String contentHash = request.getHeader("X-Content-Hash"); if (contentHash == null) return new MultipartParser().parse(request); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/MultipartParser.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/MultipartParser.java index 3125a8a363a..b49b47e0cc7 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/MultipartParser.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/MultipartParser.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.hosted.controller.restapi.application; import com.yahoo.container.jdisc.HttpRequest; +import com.yahoo.vespa.hosted.controller.api.application.v4.EnvironmentResource; import org.apache.commons.fileupload.MultipartStream; import org.apache.commons.fileupload.ParameterParser; @@ -38,8 +39,10 @@ public class MultipartParser { try { ParameterParser parameterParser = new ParameterParser(); Map<String, String> contentType = parameterParser.parse(contentTypeHeader, ';'); + if (contentType.containsKey("application/zip")) + return Map.of(EnvironmentResource.APPLICATION_ZIP, data.readAllBytes()); if ( ! contentType.containsKey("multipart/form-data")) - throw new IllegalArgumentException("Expected a multipart message, but got Content-Type: " + contentTypeHeader); + throw new IllegalArgumentException("Expected a multipart or application/zip message, but got Content-Type: " + contentTypeHeader); String boundary = contentType.get("boundary"); if (boundary == null) throw new IllegalArgumentException("Missing boundary property in Content-Type header"); 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 57397cfd856..2f514bd05cd 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 @@ -1367,7 +1367,6 @@ public class ApplicationApiTest extends ControllerContainerTest { .data(entity) .userIdentity(userId), "{\"message\":\"Deployment started in run 1 of dev-us-east-1 for tenant1.application1.new-user. This may take about 15 minutes the first time.\",\"run\":1}"); - } @Test @@ -1426,6 +1425,20 @@ public class ApplicationApiTest extends ControllerContainerTest { "{\"message\":\"Deployment started in run 2 of dev-us-east-1 for sandbox.myapp. This may take about 15 minutes the first time.\",\"run\":2}", 200); + + // POST (deploy) an application package as content type application/zip — not multipart + tester.assertResponse(request("/application/v4/tenant/sandbox/application/myapp/instance/default/deploy/dev-us-east-1", POST) + .data(applicationPackageInstance1.zippedContent()) + .contentType("application/zip") + .userIdentity(developer2), + "{\"message\":\"Deployment started in run 3 of dev-us-east-1 for sandbox.myapp. This may take about 15 minutes the first time.\",\"run\":3}"); + + // POST (deploy) an application package not as content type application/zip — not multipart — is disallowed + tester.assertResponse(request("/application/v4/tenant/sandbox/application/myapp/instance/default/deploy/dev-us-east-1", POST) + .data(applicationPackageInstance1.zippedContent()) + .contentType("application/gzip") + .userIdentity(developer2), + "{\"error-code\":\"BAD_REQUEST\",\"message\":\"Expected a multipart or application/zip message, but got Content-Type: application/gzip\"}", 400); } @Test |