diff options
author | Jon Marius Venstad <jonmv@users.noreply.github.com> | 2023-06-20 11:54:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-20 11:54:05 +0200 |
commit | 570991b8dedd6b7b493aa2880425ffd41e53016b (patch) | |
tree | 4b350d22cc4bdd9505be6a6bd83198e4e85cea8f | |
parent | 61860ea094ff79c9e8ca6492c04ad351eeb984f9 (diff) | |
parent | b505914dd607fb48bb99fd5da67722b7154a18cb (diff) |
Merge pull request #27489 from vespa-engine/jonmv/misc
Jonmv/misc
5 files changed, 75 insertions, 66 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java index 1ce6902abd0..0532a81617f 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java @@ -94,7 +94,7 @@ public class ApplicationApiHandler extends SessionHandler { compressedStream = createFromCompressedStream(appPackagePart.data(), appPackagePart.contentType(), maxApplicationPackageSize); } catch (IOException e) { // Multipart exception happens when controller abandons the request due to other exceptions while deploying. - log.log(e instanceof MultiPartFormParser.MultiPartException ? INFO : WARNING, + log.log(e instanceof MultiPartFormParser.MultiPartException ? FINE : WARNING, "Unable to parse multipart in deploy from tenant '" + tenantName.value() + "': " + Exceptions.toMessageString(e)); var message = "Deploy request from '" + tenantName.value() + "' contains invalid data: " + e.getMessage(); 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 fbe6789db33..1e9fe91fff9 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 @@ -273,7 +273,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}")) return instance(path.get("tenant"), path.get("application"), path.get("instance"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/deploying")) return deploying(path.get("tenant"), path.get("application"), path.get("instance"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/job")) return JobControllerApiHandlerHelper.jobTypeResponse(controller, appIdFromPath(path), request.getUri()); - if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/job/{jobtype}")) return JobControllerApiHandlerHelper.runResponse(controller.applications().requireApplication(TenantAndApplicationId.from(path.get("tenant"), path.get("application"))), controller.jobController().runs(appIdFromPath(path), jobTypeFromPath(path)).descendingMap(), Optional.ofNullable(request.getProperty("limit")), request.getUri()); // (((\(✘෴✘)/))) + if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/job/{jobtype}")) return JobControllerApiHandlerHelper.runResponse(controller, new JobId(appIdFromPath(path), jobTypeFromPath(path)), Optional.ofNullable(request.getProperty("limit")), request.getUri()); // (((\(✘෴✘)/))) if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/job/{jobtype}/package")) return devApplicationPackage(appIdFromPath(path), jobTypeFromPath(path)); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/job/{jobtype}/diff/{number}")) return devApplicationPackageDiff(runIdFromPath(path)); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/job/{jobtype}/test-config")) return testConfig(appIdFromPath(path), jobTypeFromPath(path)); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java index b0a6ad214d8..43c8e7c9469 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java @@ -51,7 +51,9 @@ import java.util.Collection; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.NavigableMap; import java.util.Optional; +import java.util.SortedMap; import java.util.stream.Stream; import static com.yahoo.config.application.api.DeploymentSpec.UpgradePolicy.canary; @@ -99,12 +101,18 @@ class JobControllerApiHandlerHelper { } /** Returns a response with the runs for the given job type. */ - static HttpResponse runResponse(Application application, Map<RunId, Run> runs, Optional<String> limitStr, URI baseUriForJobType) { + static HttpResponse runResponse(Controller controller, JobId id, Optional<String> limitStr, URI baseUriForJobType) { Slime slime = new Slime(); Cursor cursor = slime.setObject(); + Application application = controller.applications().requireApplication(TenantAndApplicationId.from(id.application())); + NavigableMap<RunId, Run> runs = controller.jobController().runs(id).descendingMap(); int limit = limitStr.map(Integer::parseInt).orElse(Integer.MAX_VALUE); toSlime(cursor.setArray("runs"), runs.values(), application, limit, baseUriForJobType); + controller.applications().decideCloudAccountOf(new DeploymentId(id.application(), + runs.lastEntry().getValue().id().job().type().zone()), // Urgh, must use a job with actual zone. + application.deploymentSpec()) + .ifPresent(cloudAccount -> cursor.setObject("enclave").setString("cloudAccount", cloudAccount.value())); return new SlimeJsonResponse(slime); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java index d999514597a..93937bdc4af 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java @@ -10,6 +10,7 @@ import com.yahoo.slime.SlimeUtils; import com.yahoo.vespa.flags.PermanentFlags; import com.yahoo.vespa.hosted.controller.ControllerTester; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException; +import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobId; import com.yahoo.vespa.hosted.controller.api.integration.deployment.RevisionId; import com.yahoo.vespa.hosted.controller.api.integration.deployment.RunId; import com.yahoo.vespa.hosted.controller.api.integration.deployment.TestReport; @@ -141,14 +142,14 @@ public class JobControllerApiHandlerHelperTest { // Only us-east-3 is verified, on revision1. // staging-test has 5 runs: one success without sources on revision1, one success from revision1 to revision2, // one success from revision2 to revision3 and two failures from revision1 to revision3. - assertResponse(JobControllerApiHandlerHelper.runResponse(app.application(), tester.jobs().runs(app.instanceId(), stagingTest), Optional.empty(), URI.create("https://some.url:43/root")), "staging-runs.json"); + assertResponse(JobControllerApiHandlerHelper.runResponse(tester.controller(), new JobId(app.instanceId(), stagingTest), Optional.empty(), URI.create("https://some.url:43/root")), "staging-runs.json"); assertResponse(JobControllerApiHandlerHelper.runDetailsResponse(tester.jobs(), tester.jobs().last(app.instanceId(), stagingTest).get().id(), "0"), "staging-test-log.json"); assertResponse(JobControllerApiHandlerHelper.runDetailsResponse(tester.jobs(), tester.jobs().last(app.instanceId(), productionUsEast3).get().id(), "0"), "us-east-3-log-without-first.json"); assertResponse(JobControllerApiHandlerHelper.jobTypeResponse(tester.controller(), app.instanceId(), URI.create("https://some.url:43/root/")), "overview.json"); var userApp = tester.newDeploymentContext(app.instanceId().tenant().value(), app.instanceId().application().value(), "user"); userApp.runJob(devAwsUsEast2a, applicationPackage); - assertResponse(JobControllerApiHandlerHelper.runResponse(app.application(), tester.jobs().runs(userApp.instanceId(), devAwsUsEast2a), Optional.empty(), URI.create("https://some.url:43/root")), "dev-aws-us-east-2a-runs.json"); + assertResponse(JobControllerApiHandlerHelper.runResponse(tester.controller(), new JobId(userApp.instanceId(), devAwsUsEast2a), Optional.empty(), URI.create("https://some.url:43/root")), "dev-aws-us-east-2a-runs.json"); assertResponse(JobControllerApiHandlerHelper.jobTypeResponse(tester.controller(), userApp.instanceId(), URI.create("https://some.url:43/root/")), "overview-user-instance.json"); assertResponse(JobControllerApiHandlerHelper.overviewResponse(tester.controller(), app.application().id(), URI.create("https://some.url:43/root/")), "deployment-overview-2.json"); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/staging-runs.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/staging-runs.json index a98ae5c678d..6c966f0de4d 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/staging-runs.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/staging-runs.json @@ -1,14 +1,21 @@ { "runs": [ { - "id": 1, - "url": "https://some.url:43/root/run/1", - "start": 0, - "end": 0, - "status": "success", + "id": 5, + "url": "https://some.url:43/root/run/5", + "start": 14503000, + "end": 14503000, + "status": "installationFailed", "versions": { "targetPlatform": "6.1.0", "targetApplication": { + "build": 3, + "compileVersion": "6.1.0", + "sourceUrl": "repository1/tree/commit1", + "commit": "commit1" + }, + "sourcePlatform": "6.1.0", + "sourceApplication": { "build": 1, "compileVersion": "6.1.0", "sourceUrl": "repository1/tree/commit1", @@ -22,7 +29,7 @@ }, { "name": "installTester", - "status": "succeeded" + "status": "unfinished" }, { "name": "deployInitialReal", @@ -30,31 +37,31 @@ }, { "name": "installInitialReal", - "status": "succeeded" + "status": "failed" }, { "name": "startStagingSetup", - "status": "succeeded" + "status": "unfinished" }, { "name": "endStagingSetup", - "status": "succeeded" + "status": "unfinished" }, { "name": "deployReal", - "status": "succeeded" + "status": "unfinished" }, { "name": "installReal", - "status": "succeeded" + "status": "unfinished" }, { "name": "startTests", - "status": "succeeded" + "status": "unfinished" }, { "name": "endTests", - "status": "succeeded" + "status": "unfinished" }, { "name": "copyVespaLogs", @@ -75,15 +82,15 @@ ] }, { - "id": 2, - "url": "https://some.url:43/root/run/2", - "start": 1000, - "end": 1000, - "status": "success", + "id": 4, + "url": "https://some.url:43/root/run/4", + "start": 14403000, + "end": 14403000, + "status": "installationFailed", "versions": { "targetPlatform": "6.1.0", "targetApplication": { - "build": 2, + "build": 3, "compileVersion": "6.1.0", "sourceUrl": "repository1/tree/commit1", "commit": "commit1" @@ -103,7 +110,7 @@ }, { "name": "installTester", - "status": "succeeded" + "status": "unfinished" }, { "name": "deployInitialReal", @@ -111,31 +118,31 @@ }, { "name": "installInitialReal", - "status": "succeeded" + "status": "failed" }, { "name": "startStagingSetup", - "status": "succeeded" + "status": "unfinished" }, { "name": "endStagingSetup", - "status": "succeeded" + "status": "unfinished" }, { "name": "deployReal", - "status": "succeeded" + "status": "unfinished" }, { "name": "installReal", - "status": "succeeded" + "status": "unfinished" }, { "name": "startTests", - "status": "succeeded" + "status": "unfinished" }, { "name": "endTests", - "status": "succeeded" + "status": "unfinished" }, { "name": "copyVespaLogs", @@ -237,15 +244,15 @@ ] }, { - "id": 4, - "url": "https://some.url:43/root/run/4", - "start": 14403000, - "end": 14403000, - "status": "installationFailed", + "id": 2, + "url": "https://some.url:43/root/run/2", + "start": 1000, + "end": 1000, + "status": "success", "versions": { "targetPlatform": "6.1.0", "targetApplication": { - "build": 3, + "build": 2, "compileVersion": "6.1.0", "sourceUrl": "repository1/tree/commit1", "commit": "commit1" @@ -265,7 +272,7 @@ }, { "name": "installTester", - "status": "unfinished" + "status": "succeeded" }, { "name": "deployInitialReal", @@ -273,31 +280,31 @@ }, { "name": "installInitialReal", - "status": "failed" + "status": "succeeded" }, { "name": "startStagingSetup", - "status": "unfinished" + "status": "succeeded" }, { "name": "endStagingSetup", - "status": "unfinished" + "status": "succeeded" }, { "name": "deployReal", - "status": "unfinished" + "status": "succeeded" }, { "name": "installReal", - "status": "unfinished" + "status": "succeeded" }, { "name": "startTests", - "status": "unfinished" + "status": "succeeded" }, { "name": "endTests", - "status": "unfinished" + "status": "succeeded" }, { "name": "copyVespaLogs", @@ -318,21 +325,14 @@ ] }, { - "id": 5, - "url": "https://some.url:43/root/run/5", - "start": 14503000, - "end": 14503000, - "status": "installationFailed", + "id": 1, + "url": "https://some.url:43/root/run/1", + "start": 0, + "end": 0, + "status": "success", "versions": { "targetPlatform": "6.1.0", "targetApplication": { - "build": 3, - "compileVersion": "6.1.0", - "sourceUrl": "repository1/tree/commit1", - "commit": "commit1" - }, - "sourcePlatform": "6.1.0", - "sourceApplication": { "build": 1, "compileVersion": "6.1.0", "sourceUrl": "repository1/tree/commit1", @@ -346,7 +346,7 @@ }, { "name": "installTester", - "status": "unfinished" + "status": "succeeded" }, { "name": "deployInitialReal", @@ -354,31 +354,31 @@ }, { "name": "installInitialReal", - "status": "failed" + "status": "succeeded" }, { "name": "startStagingSetup", - "status": "unfinished" + "status": "succeeded" }, { "name": "endStagingSetup", - "status": "unfinished" + "status": "succeeded" }, { "name": "deployReal", - "status": "unfinished" + "status": "succeeded" }, { "name": "installReal", - "status": "unfinished" + "status": "succeeded" }, { "name": "startTests", - "status": "unfinished" + "status": "succeeded" }, { "name": "endTests", - "status": "unfinished" + "status": "succeeded" }, { "name": "copyVespaLogs", |