summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorJon Marius Venstad <venstad@gmail.com>2019-11-05 14:45:03 +0100
committerJon Marius Venstad <venstad@gmail.com>2019-11-06 12:08:46 +0100
commit2b443676094eecbf8d1cc3dac4e4c3207d900220 (patch)
tree3b6ffc7f8cca33af02f972721a9220457e6bfd72 /controller-server
parentb43e388c526e8718797195c39b21244d3ddd74ce (diff)
Base DeploymentSteps on a single DeploymentInstanceSpec
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationPackageValidator.java20
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentSteps.java9
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java33
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java4
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java135
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java11
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java6
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2-with-patches.json2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2.json2
10 files changed, 121 insertions, 103 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationPackageValidator.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationPackageValidator.java
index 5ee269f8448..d7347b46f52 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationPackageValidator.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationPackageValidator.java
@@ -50,15 +50,17 @@ public class ApplicationPackageValidator {
/** Verify that each of the production zones listed in the deployment spec exist in this system */
private void validateSteps(DeploymentSpec deploymentSpec) {
- new DeploymentSteps(deploymentSpec, controller::system).jobs();
- deploymentSpec.instances().stream().flatMap(instance -> instance.zones().stream())
- .filter(zone -> zone.environment() == Environment.prod)
- .forEach(zone -> {
- if ( ! controller.zoneRegistry().hasZone(ZoneId.from(zone.environment(),
- zone.region().orElse(null)))) {
- throw new IllegalArgumentException("Zone " + zone + " in deployment spec was not found in this system!");
- }
- });
+ for (var spec : deploymentSpec.instances()) {
+ new DeploymentSteps(spec, controller::system).jobs();
+ spec.zones().stream()
+ .filter(zone -> zone.environment() == Environment.prod)
+ .forEach(zone -> {
+ if ( ! controller.zoneRegistry().hasZone(ZoneId.from(zone.environment(),
+ zone.region().orElseThrow()))) {
+ throw new IllegalArgumentException("Zone " + zone + " in deployment spec was not found in this system!");
+ }
+ });
+ }
}
/** Verify that no single endpoint contains regions in different clouds */
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentSteps.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentSteps.java
index d4fb97a6d87..6af592cad37 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentSteps.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentSteps.java
@@ -1,12 +1,14 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller.deployment;
+import com.yahoo.config.application.api.DeploymentInstanceSpec;
import com.yahoo.config.application.api.DeploymentSpec;
import com.yahoo.config.provision.Environment;
+import com.yahoo.config.provision.InstanceName;
import com.yahoo.config.provision.SystemName;
import com.yahoo.config.provision.zone.ZoneId;
-import com.yahoo.vespa.hosted.controller.application.Deployment;
import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType;
+import com.yahoo.vespa.hosted.controller.application.Deployment;
import com.yahoo.vespa.hosted.controller.application.JobStatus;
import java.util.Collection;
@@ -14,7 +16,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
-import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@@ -28,10 +29,10 @@ import static java.util.stream.Collectors.collectingAndThen;
*/
public class DeploymentSteps {
- private final DeploymentSpec spec;
+ private final DeploymentInstanceSpec spec;
private final Supplier<SystemName> system;
- public DeploymentSteps(DeploymentSpec spec, Supplier<SystemName> system) {
+ public DeploymentSteps(DeploymentInstanceSpec spec, Supplier<SystemName> system) {
this.spec = Objects.requireNonNull(spec, "spec cannot be null");
this.system = Objects.requireNonNull(system, "system cannot be null");
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
index a1a66570299..73e3739a772 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
@@ -1,6 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller.deployment;
+import com.yahoo.config.application.api.DeploymentInstanceSpec;
import com.yahoo.config.application.api.DeploymentSpec;
import com.yahoo.config.application.api.DeploymentSpec.Step;
import com.yahoo.config.provision.ApplicationId;
@@ -92,7 +93,7 @@ public class DeploymentTrigger {
this.jobs = controller.jobController();
}
- public DeploymentSteps steps(DeploymentSpec spec) {
+ public DeploymentSteps steps(DeploymentInstanceSpec spec) {
return new DeploymentSteps(spec, controller::system);
}
@@ -333,7 +334,7 @@ public class DeploymentTrigger {
.<Instant>flatMap(job -> job.lastSuccess().map(JobRun::at)));
String reason = "New change available";
List<Job> testJobs = null; // null means "uninitialised", while empty means "don't run any jobs".
- DeploymentSteps steps = steps(application.deploymentSpec());
+ DeploymentSteps steps = steps(application.deploymentSpec().requireInstance(instance.name()));
if (change.hasTargets()) {
for (Step step : steps.production()) {
@@ -541,19 +542,23 @@ public class DeploymentTrigger {
}
private Change remainingChange(Application application) {
- DeploymentSteps steps = steps(application.deploymentSpec());
- List<JobType> jobs = steps.production().isEmpty()
- ? steps.testJobs()
- : steps.productionJobs();
-
Change change = application.change();
- for (Instance instance : application.instances().values()) {
- if (jobs.stream().allMatch(job -> isComplete(application.change().withoutApplication(), application.change(), instance, job)))
- change = change.withoutPlatform();
- if (jobs.stream().allMatch(job -> isComplete(application.change().withoutPlatform(), application.change(), instance, job)))
- change = change.withoutApplication();
- }
+ if (application.deploymentSpec().instances().stream()
+ .allMatch(spec -> {
+ DeploymentSteps steps = new DeploymentSteps(spec, controller::system);
+ return (steps.productionJobs().isEmpty() ? steps.testJobs() : steps.productionJobs())
+ .stream().allMatch(job -> isComplete(application.change().withoutApplication(), application.change(), application.require(spec.name()), job));
+ }))
+ change = change.withoutPlatform();
+
+ if (application.deploymentSpec().instances().stream()
+ .allMatch(spec -> {
+ DeploymentSteps steps = new DeploymentSteps(spec, controller::system);
+ return (steps.productionJobs().isEmpty() ? steps.testJobs() : steps.productionJobs())
+ .stream().allMatch(job -> isComplete(application.change().withoutPlatform(), application.change(), application.require(spec.name()), job));
+ }))
+ change = change.withoutApplication();
return change;
}
@@ -575,7 +580,7 @@ public class DeploymentTrigger {
private List<Job> testJobs(DeploymentSpec deploymentSpec, Change change, Instance instance, Versions versions,
String reason, Instant availableSince, Predicate<JobType> condition) {
List<Job> jobs = new ArrayList<>();
- for (JobType jobType : steps(deploymentSpec).testJobs()) {
+ for (JobType jobType : List.of(systemTest, stagingTest)) { // TODO jonmv: Allow cross-instance validation
Optional<JobRun> completion = successOn(instance, jobType, versions)
.filter(run -> versions.sourcesMatchIfPresent(run) || jobType == systemTest);
if (completion.isEmpty() && condition.test(jobType))
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java
index cc483dff765..3deca255bad 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java
@@ -469,7 +469,9 @@ public class JobController {
/** Returns a URI which points at a badge showing current status for all jobs for the given application. */
public URI overviewBadge(ApplicationId id) {
- DeploymentSteps steps = new DeploymentSteps(controller.applications().requireApplication(TenantAndApplicationId.from(id)).deploymentSpec(), controller::system);
+ DeploymentSteps steps = new DeploymentSteps(controller.applications().requireApplication(TenantAndApplicationId.from(id))
+ .deploymentSpec().requireInstance(id.instance()),
+ controller::system);
return badges.overview(id,
steps.jobs().stream()
.map(type -> last(id, type))
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 4537f480706..611e099e6aa 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
@@ -71,6 +71,7 @@ import com.yahoo.vespa.hosted.controller.application.JobStatus;
import com.yahoo.vespa.hosted.controller.application.RoutingPolicy;
import com.yahoo.vespa.hosted.controller.application.SystemApplication;
import com.yahoo.vespa.hosted.controller.application.TenantAndApplicationId;
+import com.yahoo.vespa.hosted.controller.deployment.DeploymentSteps;
import com.yahoo.vespa.hosted.controller.deployment.DeploymentTrigger;
import com.yahoo.vespa.hosted.controller.deployment.DeploymentTrigger.ChangesToCancel;
import com.yahoo.vespa.hosted.controller.deployment.TestConfigSerializer;
@@ -717,35 +718,38 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
private void toSlime(Cursor object, Instance instance, DeploymentSpec deploymentSpec, HttpRequest request) {
object.setString("instance", instance.name().value());
- // Jobs sorted according to deployment spec
- List<JobStatus> jobStatus = controller.applications().deploymentTrigger()
- .steps(deploymentSpec)
- .sortedJobs(instance.deploymentJobs().jobStatus().values());
-
-
- Cursor deploymentJobsArray = object.setArray("deploymentJobs");
- for (JobStatus job : jobStatus) {
- Cursor jobObject = deploymentJobsArray.addObject();
- jobObject.setString("type", job.type().jobName());
- jobObject.setBool("success", job.isSuccess());
- job.lastTriggered().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("lastTriggered")));
- job.lastCompleted().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("lastCompleted")));
- job.firstFailing().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("firstFailing")));
- job.lastSuccess().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("lastSuccess")));
- }
- // Change blockers
- Cursor changeBlockers = object.setArray("changeBlockers");
- deploymentSpec.instance(instance.name()).ifPresent(spec -> spec.changeBlocker().forEach(changeBlocker -> {
- Cursor changeBlockerObject = changeBlockers.addObject();
- changeBlockerObject.setBool("versions", changeBlocker.blocksVersions());
- changeBlockerObject.setBool("revisions", changeBlocker.blocksRevisions());
- changeBlockerObject.setString("timeZone", changeBlocker.window().zone().getId());
- Cursor days = changeBlockerObject.setArray("days");
- changeBlocker.window().days().stream().map(DayOfWeek::getValue).forEach(days::addLong);
- Cursor hours = changeBlockerObject.setArray("hours");
- changeBlocker.window().hours().forEach(hours::addLong);
- }));
+ if (deploymentSpec.instance(instance.name()).isPresent()) {
+ // Jobs sorted according to deployment spec
+ List<JobStatus> jobStatus = controller.applications().deploymentTrigger()
+ .steps(deploymentSpec.requireInstance(instance.name()))
+ .sortedJobs(instance.deploymentJobs().jobStatus().values());
+
+
+ Cursor deploymentJobsArray = object.setArray("deploymentJobs");
+ for (JobStatus job : jobStatus) {
+ Cursor jobObject = deploymentJobsArray.addObject();
+ jobObject.setString("type", job.type().jobName());
+ jobObject.setBool("success", job.isSuccess());
+ job.lastTriggered().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("lastTriggered")));
+ job.lastCompleted().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("lastCompleted")));
+ job.firstFailing().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("firstFailing")));
+ job.lastSuccess().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("lastSuccess")));
+ }
+
+ // Change blockers
+ Cursor changeBlockers = object.setArray("changeBlockers");
+ deploymentSpec.instance(instance.name()).ifPresent(spec -> spec.changeBlocker().forEach(changeBlocker -> {
+ Cursor changeBlockerObject = changeBlockers.addObject();
+ changeBlockerObject.setBool("versions", changeBlocker.blocksVersions());
+ changeBlockerObject.setBool("revisions", changeBlocker.blocksRevisions());
+ changeBlockerObject.setString("timeZone", changeBlocker.window().zone().getId());
+ Cursor days = changeBlockerObject.setArray("days");
+ changeBlocker.window().days().stream().map(DayOfWeek::getValue).forEach(days::addLong);
+ Cursor hours = changeBlockerObject.setArray("hours");
+ changeBlocker.window().hours().forEach(hours::addLong);
+ }));
+ }
// Rotation
Cursor globalRotationsArray = object.setArray("globalRotations");
@@ -772,9 +776,10 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
}
// Deployments sorted according to deployment spec
- List<Deployment> deployments = controller.applications().deploymentTrigger()
- .steps(deploymentSpec)
- .sortedDeployments(instance.deployments().values());
+ List<Deployment> deployments = deploymentSpec.instance(instance.name())
+ .map(spec -> new DeploymentSteps(spec, controller::system))
+ .map(steps -> steps.sortedDeployments(instance.deployments().values()))
+ .orElse(List.copyOf(instance.deployments().values()));
Cursor deploymentsArray = object.setArray("deployments");
for (Deployment deployment : deployments) {
@@ -822,36 +827,38 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
toSlime(object.setObject("outstandingChange"), application.outstandingChange());
}
- // Jobs sorted according to deployment spec
- List<JobStatus> jobStatus = controller.applications().deploymentTrigger()
- .steps(application.deploymentSpec())
- .sortedJobs(instance.deploymentJobs().jobStatus().values());
-
- object.setBool("deployedInternally", application.internal());
- Cursor deploymentsArray = object.setArray("deploymentJobs");
- for (JobStatus job : jobStatus) {
- Cursor jobObject = deploymentsArray.addObject();
- jobObject.setString("type", job.type().jobName());
- jobObject.setBool("success", job.isSuccess());
-
- job.lastTriggered().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("lastTriggered")));
- job.lastCompleted().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("lastCompleted")));
- job.firstFailing().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("firstFailing")));
- job.lastSuccess().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("lastSuccess")));
- }
+ if (application.deploymentSpec().instance(instance.name()).isPresent()) {
+ // Jobs sorted according to deployment spec
+ List<JobStatus> jobStatus = controller.applications().deploymentTrigger()
+ .steps(application.deploymentSpec().requireInstance(instance.name()))
+ .sortedJobs(instance.deploymentJobs().jobStatus().values());
+
+ object.setBool("deployedInternally", application.internal());
+ Cursor deploymentsArray = object.setArray("deploymentJobs");
+ for (JobStatus job : jobStatus) {
+ Cursor jobObject = deploymentsArray.addObject();
+ jobObject.setString("type", job.type().jobName());
+ jobObject.setBool("success", job.isSuccess());
+
+ job.lastTriggered().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("lastTriggered")));
+ job.lastCompleted().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("lastCompleted")));
+ job.firstFailing().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("firstFailing")));
+ job.lastSuccess().ifPresent(jobRun -> toSlime(jobRun, jobObject.setObject("lastSuccess")));
+ }
- // Change blockers
- Cursor changeBlockers = object.setArray("changeBlockers");
- application.deploymentSpec().instance(instance.name()).ifPresent(spec -> spec.changeBlocker().forEach(changeBlocker -> {
- Cursor changeBlockerObject = changeBlockers.addObject();
- changeBlockerObject.setBool("versions", changeBlocker.blocksVersions());
- changeBlockerObject.setBool("revisions", changeBlocker.blocksRevisions());
- changeBlockerObject.setString("timeZone", changeBlocker.window().zone().getId());
- Cursor days = changeBlockerObject.setArray("days");
- changeBlocker.window().days().stream().map(DayOfWeek::getValue).forEach(days::addLong);
- Cursor hours = changeBlockerObject.setArray("hours");
- changeBlocker.window().hours().forEach(hours::addLong);
- }));
+ // Change blockers
+ Cursor changeBlockers = object.setArray("changeBlockers");
+ application.deploymentSpec().instance(instance.name()).ifPresent(spec -> spec.changeBlocker().forEach(changeBlocker -> {
+ Cursor changeBlockerObject = changeBlockers.addObject();
+ changeBlockerObject.setBool("versions", changeBlocker.blocksVersions());
+ changeBlockerObject.setBool("revisions", changeBlocker.blocksRevisions());
+ changeBlockerObject.setString("timeZone", changeBlocker.window().zone().getId());
+ Cursor days = changeBlockerObject.setArray("days");
+ changeBlocker.window().days().stream().map(DayOfWeek::getValue).forEach(days::addLong);
+ Cursor hours = changeBlockerObject.setArray("hours");
+ changeBlocker.window().hours().forEach(hours::addLong);
+ }));
+ }
// Compile version. The version that should be used when building an application
object.setString("compileVersion", compileVersion(application.id()).toFullString());
@@ -883,9 +890,11 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
}
// Deployments sorted according to deployment spec
- List<Deployment> deployments = controller.applications().deploymentTrigger()
- .steps(application.deploymentSpec())
- .sortedDeployments(instance.deployments().values());
+ List<Deployment> deployments =
+ application.deploymentSpec().instance(instance.name())
+ .map(spec -> new DeploymentSteps(spec, controller::system))
+ .map(steps -> steps.sortedDeployments(instance.deployments().values()))
+ .orElse(List.copyOf(instance.deployments().values()));
Cursor instancesArray = object.setArray("instances");
for (Deployment deployment : deployments) {
Cursor deploymentObject = instancesArray.addObject();
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 0f1cd9495bf..9fb20ef4f81 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
@@ -76,7 +76,7 @@ class JobControllerApiHandlerHelper {
Application application = controller.applications().requireApplication(TenantAndApplicationId.from(id));
Instance instance = application.require(id.instance());
Change change = application.change();
- DeploymentSteps steps = new DeploymentSteps(application.deploymentSpec(), controller::system);
+ DeploymentSteps steps = new DeploymentSteps(application.deploymentSpec().requireInstance(id.instance()), controller::system);
// The logic for pending runs imitates DeploymentTrigger logic; not good, but the trigger wiring must be re-written to reuse :S
Map<JobType, Versions> pendingProduction =
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java
index b8d6689a9d9..d0eb86c3ba1 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java
@@ -172,10 +172,11 @@ public class DeploymentContext {
.allMatch(deployments -> deployments.stream()
.allMatch(deployment -> deployment.version().equals(version))));
- for (JobType type : new DeploymentSteps(application().deploymentSpec(), tester.controller()::system).productionJobs())
- assertTrue(tester.configServer().nodeRepository()
- .list(type.zone(tester.controller().system()), applicationId.defaultInstance()).stream() // TODO jonmv: support more
- .allMatch(node -> node.currentVersion().equals(version)));
+ for (var spec : application().deploymentSpec().instances())
+ for (JobType type : new DeploymentSteps(spec, tester.controller()::system).productionJobs())
+ assertTrue(tester.configServer().nodeRepository()
+ .list(type.zone(tester.controller().system()), applicationId.defaultInstance()).stream() // TODO jonmv: support more
+ .allMatch(node -> node.currentVersion().equals(version)));
assertFalse(application().change().hasTargets());
return this;
@@ -267,7 +268,7 @@ public class DeploymentContext {
triggerJobs();
}
else
- throw new AssertionError("Job '" + run.id().type() + "' was run twice for '" + instanceId + "'");
+ throw new AssertionError("Job '" + run.id() + "' was run twice");
assertFalse("Change should have no targets, but was " + application().change(), application().change().hasTargets());
if (!deferDnsUpdates) {
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java
index de5c04af80b..52db1061655 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java
@@ -869,8 +869,10 @@ public class DeploymentTriggerTest {
.environment(Environment.prod)
.region("us-east-3")
.build();
- var app = tester.newDeploymentContext().submit(applicationPackage); // TODO jonmv: support instances in deployment context>
- app.deploy();
+ var app = tester.newDeploymentContext("tenant1", "application1", "instance1").submit(applicationPackage); // TODO jonmv: support instances in deployment context>
+ var otherInstance = tester.newDeploymentContext("tenant1", "application1", "instance2"); // TODO jonmv: support instances in deployment context>
+ app.runJob(systemTest).runJob(stagingTest).runJob(productionUsEast3);
+ otherInstance.runJob(systemTest).runJob(stagingTest).runJob(productionUsEast3);
assertEquals(2, app.application().instances().size());
assertEquals(2, app.application().productionDeployments().values().stream()
.mapToInt(Collection::size)
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2-with-patches.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2-with-patches.json
index 267c8b01330..a7fe50485da 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2-with-patches.json
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2-with-patches.json
@@ -31,8 +31,6 @@
"instances": [
{
"instance": "default",
- "deploymentJobs": [],
- "changeBlockers": [],
"globalRotations": [],
"deployments": []
},
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2.json
index 8a1ed245fae..cdf011524d2 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2.json
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application2.json
@@ -30,8 +30,6 @@
"instances": [
{
"instance": "default",
- "deploymentJobs": [],
- "changeBlockers": [],
"globalRotations": [],
"deployments": []
},