summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Marius Venstad <jonmv@users.noreply.github.com>2023-06-20 11:54:05 +0200
committerGitHub <noreply@github.com>2023-06-20 11:54:05 +0200
commit570991b8dedd6b7b493aa2880425ffd41e53016b (patch)
tree4b350d22cc4bdd9505be6a6bd83198e4e85cea8f
parent61860ea094ff79c9e8ca6492c04ad351eeb984f9 (diff)
parentb505914dd607fb48bb99fd5da67722b7154a18cb (diff)
Merge pull request #27489 from vespa-engine/jonmv/misc
Jonmv/misc
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java10
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java5
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/staging-runs.json122
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",