diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2019-11-05 14:45:03 +0100 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2019-11-06 12:08:46 +0100 |
commit | 2b443676094eecbf8d1cc3dac4e4c3207d900220 (patch) | |
tree | 3b6ffc7f8cca33af02f972721a9220457e6bfd72 /controller-server | |
parent | b43e388c526e8718797195c39b21244d3ddd74ce (diff) |
Base DeploymentSteps on a single DeploymentInstanceSpec
Diffstat (limited to 'controller-server')
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": [] }, |