diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2019-11-04 10:35:48 +0100 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2019-11-04 11:19:47 +0100 |
commit | 88f48f2f433c9b59a783e44c9d25d66ca474459c (patch) | |
tree | ee26fa65cb723e559887b68787e630a11d0a7dd4 /controller-server | |
parent | 2180cc01b9600355602af8cd6308601c4215d39d (diff) |
Use DeploymentContext instead of DeploymentTester directly
Diffstat (limited to 'controller-server')
8 files changed, 199 insertions, 337 deletions
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 58d1c3e3ced..28057c3787a 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 @@ -138,6 +138,8 @@ public class DeploymentContext { return instanceId; } + public TesterId testerId() { return testerId; } + public DeploymentId deploymentIdIn(ZoneId zone) { return new DeploymentId(instanceId, zone); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTester.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTester.java index c9e2b2c0954..9316ea632cf 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTester.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTester.java @@ -1,7 +1,6 @@ // Copyright 2018 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.component.Version; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.log.LogLevel; @@ -14,13 +13,9 @@ import com.yahoo.vespa.hosted.controller.Instance; import com.yahoo.vespa.hosted.controller.api.identifiers.DeploymentId; import com.yahoo.vespa.hosted.controller.api.integration.athenz.AthenzDbMock; import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationVersion; -import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType; -import com.yahoo.vespa.hosted.controller.api.integration.deployment.RunId; -import com.yahoo.vespa.hosted.controller.api.integration.deployment.SourceRevision; import com.yahoo.vespa.hosted.controller.api.integration.deployment.TesterId; import com.yahoo.vespa.hosted.controller.api.integration.routing.RoutingGeneratorMock; import com.yahoo.vespa.hosted.controller.api.integration.stubs.MockTesterCloud; -import com.yahoo.vespa.hosted.controller.application.ApplicationPackage; import com.yahoo.vespa.hosted.controller.application.TenantAndApplicationId; import com.yahoo.vespa.hosted.controller.integration.ConfigServerMock; import com.yahoo.vespa.hosted.controller.maintenance.JobControl; @@ -36,12 +31,8 @@ import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.Collections; -import java.util.Optional; import java.util.logging.Logger; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; /** @@ -59,7 +50,6 @@ public class DeploymentTester { public static final ApplicationId instanceId = appId.defaultInstance(); public static final TesterId testerId = TesterId.of(instanceId); - private final DeploymentContext defaultContext; private final ControllerTester tester; private final JobController jobs; private final RoutingGeneratorMock routing; @@ -104,7 +94,6 @@ public class DeploymentTester { outstandingChangeDeployer = new OutstandingChangeDeployer(tester.controller(), maintenanceInterval, jobControl); nameServiceDispatcher = new NameServiceDispatcher(tester.controller(), maintenanceInterval, jobControl, Integer.MAX_VALUE); - defaultContext = newDeploymentContext(instanceId); routing.putEndpoints(new DeploymentId(null, null), Collections.emptyList()); // Turn off default behaviour for the mock. // Get deployment job logs to stderr. @@ -159,29 +148,6 @@ public class DeploymentTester { return newDeploymentContext(tenantName, applicationName, instanceName).application(); } - /** Submits a new application, and returns the version of the new submission. */ - public ApplicationVersion newSubmission(TenantAndApplicationId id, ApplicationPackage applicationPackage, SourceRevision sourceRevision) { - return newDeploymentContext(id.defaultInstance()).submit(applicationPackage, sourceRevision).lastSubmission().get(); - } - - public ApplicationVersion newSubmission(TenantAndApplicationId id, ApplicationPackage applicationPackage) { - return newSubmission(id, applicationPackage, DeploymentContext.defaultSourceRevision); - } - - /** - * Submits a new application package, and returns the version of the new submission. - */ - public ApplicationVersion newSubmission(ApplicationPackage applicationPackage) { - return newSubmission(appId, applicationPackage); - } - - /** - * Submits a new application, and returns the version of the new submission. - */ - public ApplicationVersion newSubmission() { - return defaultContext.submit().lastSubmission().get(); - } - /** * Sets a single endpoint in the routing mock; this matches that required for the tester. */ @@ -189,34 +155,6 @@ public class DeploymentTester { newDeploymentContext(id).setEndpoints(zone); } - /** Completely deploys the given application version, assuming it is the last to be submitted. */ - public void deployNewSubmission(ApplicationVersion version) { - deployNewSubmission(appId, version); - } - - /** Completely deploys the given application version, assuming it is the last to be submitted. */ - public void deployNewSubmission(TenantAndApplicationId id, ApplicationVersion version) { - var context = newDeploymentContext(id.defaultInstance()); - var application = context.application(); - assertFalse(application.instances().values().stream() - .anyMatch(instance -> instance.deployments().values().stream() - .anyMatch(deployment -> deployment.applicationVersion().equals(version)))); - assertEquals(version, application.change().application().get()); - assertFalse(application.change().platform().isPresent()); - context.completeRollout(); - assertFalse(context.application().change().hasTargets()); - } - - /** Completely deploys the given, new platform. */ - public void deployNewPlatform(Version version) { - deployNewPlatform(appId, version); - } - - /** Completely deploys the given, new platform. */ - public void deployNewPlatform(TenantAndApplicationId id, Version version) { - newDeploymentContext(id.defaultInstance()).deployPlatform(version); - } - /** Aborts and finishes all running jobs. */ public void abortAll() { triggerJobs(); @@ -234,63 +172,4 @@ public class DeploymentTester { return triggered; } - /** Starts a manual deployment of the given package, and then runs the whole of the given job, successfully. */ - public void runJob(ApplicationId instanceId, JobType type, ApplicationPackage applicationPackage) { - jobs.deploy(instanceId, type, Optional.empty(), applicationPackage); - newDeploymentContext(instanceId).runJob(type); - } - - /** Pulls the ready job trigger, and then runs the whole of the given job, successfully. */ - public void runJob(JobType type) { - defaultContext.runJob(type); - } - - /** Pulls the ready job trigger, and then runs the whole of the given job, successfully. */ - public void runJob(ApplicationId instanceId, JobType type) { - if (type.environment().isManuallyDeployed()) - throw new IllegalArgumentException("Use overload with application package for dev/perf jobs"); - newDeploymentContext(instanceId).runJob(type); - } - - public void failDeployment(JobType type) { - defaultContext.failDeployment(type); - } - - public void failDeployment(ApplicationId instanceId, JobType type) { - newDeploymentContext(instanceId).failDeployment(type); - } - - public void timeOutUpgrade(JobType type) { - defaultContext.timeOutUpgrade(type); - } - - public void timeOutUpgrade(ApplicationId instanceId, JobType type) { - newDeploymentContext(instanceId).timeOutConvergence(type); - } - - public void timeOutConvergence(JobType type) { - defaultContext.timeOutConvergence(type); - } - - public void timeOutConvergence(ApplicationId instanceId, JobType type) { - newDeploymentContext(instanceId).timeOutConvergence(type); - } - - public RunId startSystemTestTests() { - return defaultContext.startSystemTestTests(); - } - - /** Creates and submits a new application, and then starts the job of the given type. Use only once per test. */ - public RunId newRun(JobType type) { - return defaultContext.newRun(type); - } - - public void assertRunning(JobType type) { - assertRunning(instanceId, type); - } - - public void assertRunning(ApplicationId id, JobType type) { - assertTrue(jobs.active().stream().anyMatch(run -> run.id().application().equals(id) && run.id().type() == type)); - } - } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java index e0f11a0b925..d50399c6c78 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java @@ -53,7 +53,6 @@ import static com.yahoo.vespa.hosted.controller.api.integration.LogEntry.Type.wa import static com.yahoo.vespa.hosted.controller.deployment.DeploymentTester.instanceId; import static com.yahoo.vespa.hosted.controller.deployment.DeploymentContext.applicationPackage; import static com.yahoo.vespa.hosted.controller.deployment.DeploymentContext.publicCdApplicationPackage; -import static com.yahoo.vespa.hosted.controller.deployment.DeploymentTester.testerId; import static com.yahoo.vespa.hosted.controller.deployment.Step.Status.failed; import static com.yahoo.vespa.hosted.controller.deployment.Step.Status.succeeded; import static com.yahoo.vespa.hosted.controller.deployment.Step.Status.unfinished; @@ -70,6 +69,7 @@ import static org.junit.Assert.fail; public class InternalStepRunnerTest { private DeploymentTester tester; + private DeploymentContext app; @Before public void setup() { @@ -83,15 +83,16 @@ public class InternalStepRunnerTest { @Test public void canRegisterAndRunDirectly() { - tester.deploymentContext().submit().deploy(); + app.submit().deploy(); } @Test public void testerHasAthenzIdentity() { - tester.newRun(JobType.stagingTest); + app.submit(); + tester.triggerJobs(); tester.runner().run(); DeploymentSpec spec = tester.configServer() - .application(DeploymentTester.testerId.id(), JobType.stagingTest.zone(system())).get() + .application(app.testerId().id(), JobType.stagingTest.zone(system())).get() .applicationPackage().deploymentSpec(); assertEquals("domain", spec.athenzDomain().get().value()); ZoneId zone = JobType.stagingTest.zone(system()); @@ -100,21 +101,21 @@ public class InternalStepRunnerTest { @Test public void refeedRequirementBlocksDeployment() { - RunId id = tester.newRun(JobType.stagingTest); + RunId id = app.newRun(JobType.stagingTest); - tester.setEndpoints(testerId.id(), JobType.stagingTest.zone(system())); + tester.setEndpoints(app.testerId().id(), JobType.stagingTest.zone(system())); tester.runner().run(); assertEquals(unfinished, tester.jobs().run(id).get().steps().get(Step.installInitialReal)); - tester.setEndpoints(instanceId, JobType.stagingTest.zone(system())); - tester.configServer().convergeServices(instanceId, JobType.stagingTest.zone(system())); + tester.setEndpoints(app.instanceId(), JobType.stagingTest.zone(system())); + tester.configServer().convergeServices(app.instanceId(), JobType.stagingTest.zone(system())); tester.configServer().setConfigChangeActions(new ConfigChangeActions(Collections.emptyList(), - singletonList(new RefeedAction("Refeed", - false, - "doctype", - "cluster", - Collections.emptyList(), - singletonList("Refeed it!"))))); + singletonList(new RefeedAction("Refeed", + false, + "doctype", + "cluster", + Collections.emptyList(), + singletonList("Refeed it!"))))); tester.runner().run(); assertEquals(failed, tester.jobs().run(id).get().steps().get(Step.deployReal)); @@ -122,11 +123,11 @@ public class InternalStepRunnerTest { @Test public void restartsServicesAndWaitsForRestartAndReboot() { - RunId id = tester.newRun(JobType.productionUsCentral1); + RunId id = app.newRun(JobType.productionUsCentral1); ZoneId zone = id.type().zone(system()); HostName host = tester.configServer().hostFor(instanceId, zone); - tester.setEndpoints(testerId.id(), JobType.productionUsCentral1.zone(system())); + tester.setEndpoints(app.testerId().id(), JobType.productionUsCentral1.zone(system())); tester.runner().run(); tester.configServer().setConfigChangeActions(new ConfigChangeActions(singletonList(new RestartAction("cluster", @@ -141,11 +142,11 @@ public class InternalStepRunnerTest { tester.runner().run(); assertEquals(succeeded, tester.jobs().run(id).get().steps().get(Step.deployReal)); - tester.configServer().convergeServices(instanceId, zone); + tester.configServer().convergeServices(app.instanceId(), zone); assertEquals(unfinished, tester.jobs().run(id).get().steps().get(Step.installReal)); - tester.configServer().nodeRepository().doRestart(new DeploymentId(instanceId, zone), Optional.of(host)); - tester.configServer().nodeRepository().requestReboot(new DeploymentId(instanceId, zone), Optional.of(host)); + tester.configServer().nodeRepository().doRestart(app.deploymentIdIn(zone), Optional.of(host)); + tester.configServer().nodeRepository().requestReboot(app.deploymentIdIn(zone), Optional.of(host)); tester.runner().run(); assertEquals(unfinished, tester.jobs().run(id).get().steps().get(Step.installReal)); @@ -156,85 +157,85 @@ public class InternalStepRunnerTest { @Test public void waitsForEndpointsAndTimesOut() { - tester.newRun(JobType.systemTest); + app.newRun(JobType.systemTest); // Tester fails to show up for staging tests, and the real deployment for system tests. - tester.setEndpoints(testerId.id(), JobType.systemTest.zone(system())); - tester.setEndpoints(instanceId, JobType.stagingTest.zone(system())); + tester.setEndpoints(app.testerId().id(), JobType.systemTest.zone(system())); + tester.setEndpoints(app.instanceId(), JobType.stagingTest.zone(system())); tester.runner().run(); - tester.configServer().convergeServices(instanceId, JobType.stagingTest.zone(system())); + tester.configServer().convergeServices(app.instanceId(), JobType.stagingTest.zone(system())); tester.runner().run(); - tester.configServer().convergeServices(instanceId, JobType.systemTest.zone(system())); - tester.configServer().convergeServices(testerId.id(), JobType.systemTest.zone(system())); - tester.configServer().convergeServices(instanceId, JobType.stagingTest.zone(system())); - tester.configServer().convergeServices(testerId.id(), JobType.stagingTest.zone(system())); + tester.configServer().convergeServices(app.instanceId(), JobType.systemTest.zone(system())); + tester.configServer().convergeServices(app.testerId().id(), JobType.systemTest.zone(system())); + tester.configServer().convergeServices(app.instanceId(), JobType.stagingTest.zone(system())); + tester.configServer().convergeServices(app.testerId().id(), JobType.stagingTest.zone(system())); tester.runner().run(); tester.clock().advance(InternalStepRunner.endpointTimeout.plus(Duration.ofSeconds(1))); tester.runner().run(); - assertEquals(failed, tester.jobs().last(instanceId, JobType.systemTest).get().steps().get(Step.installReal)); - assertEquals(failed, tester.jobs().last(instanceId, JobType.stagingTest).get().steps().get(Step.installTester)); + assertEquals(failed, tester.jobs().last(app.instanceId(), JobType.systemTest).get().steps().get(Step.installReal)); + assertEquals(failed, tester.jobs().last(app.instanceId(), JobType.stagingTest).get().steps().get(Step.installTester)); } @Test public void installationFailsIfDeploymentExpires() { - tester.newRun(JobType.systemTest); + app.newRun(JobType.systemTest); tester.runner().run(); - tester.configServer().convergeServices(instanceId, JobType.systemTest.zone(system())); - tester.setEndpoints(instanceId, JobType.systemTest.zone(system())); + tester.configServer().convergeServices(app.instanceId(), JobType.systemTest.zone(system())); + tester.setEndpoints(app.instanceId(), JobType.systemTest.zone(system())); tester.runner().run(); - assertEquals(succeeded, tester.jobs().last(instanceId, JobType.systemTest).get().steps().get(Step.installReal)); + assertEquals(succeeded, tester.jobs().last(app.instanceId(), JobType.systemTest).get().steps().get(Step.installReal)); - tester.applications().deactivate(instanceId, JobType.systemTest.zone(system())); + tester.applications().deactivate(app.instanceId(), JobType.systemTest.zone(system())); tester.runner().run(); - assertEquals(failed, tester.jobs().last(instanceId, JobType.systemTest).get().steps().get(Step.installTester)); - assertTrue(tester.jobs().last(instanceId, JobType.systemTest).get().hasEnded()); - assertTrue(tester.jobs().last(instanceId, JobType.systemTest).get().hasFailed()); + assertEquals(failed, tester.jobs().last(app.instanceId(), JobType.systemTest).get().steps().get(Step.installTester)); + assertTrue(tester.jobs().last(app.instanceId(), JobType.systemTest).get().hasEnded()); + assertTrue(tester.jobs().last(app.instanceId(), JobType.systemTest).get().hasFailed()); } @Test public void startTestsFailsIfDeploymentExpires() { - tester.newRun(JobType.systemTest); + app.newRun(JobType.systemTest); tester.runner().run(); - tester.configServer().convergeServices(instanceId, JobType.systemTest.zone(system())); - tester.configServer().convergeServices(testerId.id(), JobType.systemTest.zone(system())); + tester.configServer().convergeServices(app.instanceId(), JobType.systemTest.zone(system())); + tester.configServer().convergeServices(app.testerId().id(), JobType.systemTest.zone(system())); tester.runner().run(); - tester.applications().deactivate(instanceId, JobType.systemTest.zone(system())); + tester.applications().deactivate(app.instanceId(), JobType.systemTest.zone(system())); tester.runner().run(); - assertEquals(unfinished, tester.jobs().last(instanceId, JobType.systemTest).get().steps().get(Step.startTests)); + assertEquals(unfinished, tester.jobs().last(app.instanceId(), JobType.systemTest).get().steps().get(Step.startTests)); } @Test public void alternativeEndpointsAreDetected() { - tester.newRun(JobType.systemTest); + app.newRun(JobType.systemTest); tester.runner().run();; - tester.configServer().convergeServices(instanceId, JobType.systemTest.zone(system())); - tester.configServer().convergeServices(testerId.id(), JobType.systemTest.zone(system())); - assertEquals(unfinished, tester.jobs().last(instanceId, JobType.systemTest).get().steps().get(Step.installReal)); - assertEquals(unfinished, tester.jobs().last(instanceId, JobType.systemTest).get().steps().get(Step.installTester)); - - tester.controller().curator().writeRoutingPolicies(instanceId, Set.of(new RoutingPolicy(instanceId, + tester.configServer().convergeServices(app.instanceId(), JobType.systemTest.zone(system())); + tester.configServer().convergeServices(app.testerId().id(), JobType.systemTest.zone(system())); + assertEquals(unfinished, tester.jobs().last(app.instanceId(), JobType.systemTest).get().steps().get(Step.installReal)); + assertEquals(unfinished, tester.jobs().last(app.instanceId(), JobType.systemTest).get().steps().get(Step.installTester)); + + tester.controller().curator().writeRoutingPolicies(app.instanceId(), Set.of(new RoutingPolicy(app.instanceId(), + ClusterSpec.Id.from("default"), + JobType.systemTest.zone(system()), + HostName.from("host"), + Optional.empty(), + emptySet()))); + tester.controller().curator().writeRoutingPolicies(app.testerId().id(), Set.of(new RoutingPolicy(app.testerId().id(), ClusterSpec.Id.from("default"), JobType.systemTest.zone(system()), HostName.from("host"), Optional.empty(), emptySet()))); - tester.controller().curator().writeRoutingPolicies(testerId.id(), Set.of(new RoutingPolicy(testerId.id(), - ClusterSpec.Id.from("default"), - JobType.systemTest.zone(system()), - HostName.from("host"), - Optional.empty(), - emptySet()))); tester.runner().run();; - assertEquals(succeeded, tester.jobs().last(instanceId, JobType.systemTest).get().steps().get(Step.installReal)); - assertEquals(succeeded, tester.jobs().last(instanceId, JobType.systemTest).get().steps().get(Step.installTester)); + assertEquals(succeeded, tester.jobs().last(app.instanceId(), JobType.systemTest).get().steps().get(Step.installReal)); + assertEquals(succeeded, tester.jobs().last(app.instanceId(), JobType.systemTest).get().steps().get(Step.installTester)); } @Test public void testsFailIfTesterRestarts() { - RunId id = tester.startSystemTestTests(); + RunId id = app.startSystemTestTests(); tester.cloud().set(TesterCloud.Status.NOT_STARTED); tester.runner().run(); assertEquals(failed, tester.jobs().run(id).get().steps().get(Step.endTests)); @@ -242,7 +243,7 @@ public class InternalStepRunnerTest { @Test public void testsFailIfTestsFailRemotely() { - RunId id = tester.startSystemTestTests(); + RunId id = app.startSystemTestTests(); tester.cloud().add(new LogEntry(123, Instant.ofEpochMilli(321), error, "Failure!")); tester.cloud().set(TesterCloud.Status.FAILURE); @@ -256,7 +257,7 @@ public class InternalStepRunnerTest { @Test public void testsFailIfTestsErr() { - RunId id = tester.startSystemTestTests(); + RunId id = app.startSystemTestTests(); tester.cloud().add(new LogEntry(0, Instant.ofEpochMilli(123), error, "Error!")); tester.cloud().set(TesterCloud.Status.ERROR); @@ -270,13 +271,13 @@ public class InternalStepRunnerTest { @Test public void testsSucceedWhenTheyDoRemotely() { - RunId id = tester.startSystemTestTests(); + RunId id = app.startSystemTestTests(); tester.runner().run(); assertEquals(unfinished, tester.jobs().run(id).get().steps().get(Step.endTests)); - assertEquals(URI.create(tester.routing().endpoints(new DeploymentId(testerId.id(), JobType.systemTest.zone(system()))).get(0).endpoint()), + assertEquals(URI.create(tester.routing().endpoints(new DeploymentId(app.testerId().id(), JobType.systemTest.zone(system()))).get(0).endpoint()), tester.cloud().testerUrl()); Inspector configObject = SlimeUtils.jsonToSlime(tester.cloud().config()).get(); - assertEquals(instanceId.serializedForm(), configObject.field("application").asString()); + assertEquals(app.instanceId().serializedForm(), configObject.field("application").asString()); assertEquals(JobType.systemTest.zone(system()).value(), configObject.field("zone").asString()); assertEquals(system().value(), configObject.field("system").asString()); assertEquals(1, configObject.field("endpoints").children()); @@ -309,36 +310,36 @@ public class InternalStepRunnerTest { @Test public void deployToDev() { ZoneId zone = JobType.devUsEast1.zone(system()); - tester.jobs().deploy(instanceId, JobType.devUsEast1, Optional.empty(), applicationPackage); + tester.jobs().deploy(app.instanceId(), JobType.devUsEast1, Optional.empty(), applicationPackage); tester.runner().run(); - RunId id = tester.jobs().last(instanceId, JobType.devUsEast1).get().id(); + RunId id = tester.jobs().last(app.instanceId(), JobType.devUsEast1).get().id(); assertEquals(unfinished, tester.jobs().run(id).get().steps().get(Step.installReal)); Version version = new Version("7.8.9"); Future<?> concurrentDeployment = Executors.newSingleThreadExecutor().submit(() -> { - tester.jobs().deploy(instanceId, JobType.devUsEast1, Optional.of(version), applicationPackage); + tester.jobs().deploy(app.instanceId(), JobType.devUsEast1, Optional.of(version), applicationPackage); }); while ( ! concurrentDeployment.isDone()) tester.runner().run(); - assertEquals(id.number() + 1, tester.jobs().last(instanceId, JobType.devUsEast1).get().id().number()); + assertEquals(id.number() + 1, tester.jobs().last(app.instanceId(), JobType.devUsEast1).get().id().number()); ApplicationPackage otherPackage = new ApplicationPackageBuilder().region("us-central-1").build(); - tester.jobs().deploy(instanceId, JobType.perfUsEast3, Optional.empty(), otherPackage); + tester.jobs().deploy(app.instanceId(), JobType.perfUsEast3, Optional.empty(), otherPackage); tester.runner().run(); // Job run order determined by JobType enum order per application. - tester.configServer().convergeServices(instanceId, zone); - tester.setEndpoints(instanceId, zone); + tester.configServer().convergeServices(app.instanceId(), zone); + tester.setEndpoints(app.instanceId(), zone); assertEquals(unfinished, tester.jobs().run(id).get().steps().get(Step.installReal)); - assertEquals(applicationPackage.hash(), tester.configServer().application(instanceId, zone).get().applicationPackage().hash()); - assertEquals(otherPackage.hash(), tester.configServer().application(instanceId, JobType.perfUsEast3.zone(system())).get().applicationPackage().hash()); + assertEquals(applicationPackage.hash(), tester.configServer().application(app.instanceId(), zone).get().applicationPackage().hash()); + assertEquals(otherPackage.hash(), tester.configServer().application(app.instanceId(), JobType.perfUsEast3.zone(system())).get().applicationPackage().hash()); - tester.configServer().setVersion(instanceId, zone, version); + tester.configServer().setVersion(app.instanceId(), zone, version); tester.runner().run(); assertEquals(1, tester.jobs().active().size()); - assertEquals(version, tester.instance(instanceId).deployments().get(zone).version()); + assertEquals(version, tester.instance(app.instanceId()).deployments().get(zone).version()); try { - tester.jobs().deploy(instanceId, JobType.productionApNortheast1, Optional.empty(), applicationPackage); + tester.jobs().deploy(app.instanceId(), JobType.productionApNortheast1, Optional.empty(), applicationPackage); fail("Deployments outside dev should not be allowed."); } catch (IllegalArgumentException expected) { } @@ -346,10 +347,10 @@ public class InternalStepRunnerTest { @Test public void notificationIsSent() { - tester.startSystemTestTests(); + app.startSystemTestTests(); tester.cloud().set(TesterCloud.Status.NOT_STARTED); tester.runner().run(); - MockMailer mailer = ((MockMailer) tester.controller().serviceRegistry().mailer()); + MockMailer mailer = tester.controllerTester().serviceRegistry().mailer(); assertEquals(1, mailer.inbox("a@b").size()); assertEquals("Vespa application tenant.application: System test failing due to system error", mailer.inbox("a@b").get(0).subject()); @@ -360,7 +361,7 @@ public class InternalStepRunnerTest { @Test public void vespaLogIsCopied() { - RunId id = tester.startSystemTestTests(); + RunId id = app.startSystemTestTests(); tester.cloud().set(TesterCloud.Status.ERROR); tester.configServer().setLogStream(vespaLog); long lastId = tester.jobs().details(id).get().lastId().getAsLong(); @@ -385,11 +386,11 @@ public class InternalStepRunnerTest { public void certificateTimeoutAbortsJob() { tester.controllerTester().zoneRegistry().setSystemName(SystemName.PublicCd); tester.controllerTester().zoneRegistry().setZones(ZoneApiMock.fromId("prod.aws-us-east-1c")); - RunId id = tester.startSystemTestTests(); + RunId id = app.startSystemTestTests(); List<X509Certificate> trusted = new ArrayList<>(publicCdApplicationPackage.trustedCertificates()); trusted.add(tester.jobs().run(id).get().testerCertificate().get()); - assertEquals(trusted, tester.configServer().application(instanceId, id.type().zone(system())).get().applicationPackage().trustedCertificates()); + assertEquals(trusted, tester.configServer().application(app.instanceId(), id.type().zone(system())).get().applicationPackage().trustedCertificates()); tester.clock().advance(InternalStepRunner.certificateTimeout.plus(Duration.ofSeconds(1))); tester.runner().run(); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ApplicationOwnershipConfirmerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ApplicationOwnershipConfirmerTest.java index 88d1626b834..8997f34fb98 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ApplicationOwnershipConfirmerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ApplicationOwnershipConfirmerTest.java @@ -2,15 +2,12 @@ package com.yahoo.vespa.hosted.controller.maintenance; import com.yahoo.config.provision.InstanceName; -import com.yahoo.vespa.hosted.controller.Application; import com.yahoo.vespa.hosted.controller.LockedTenant; import com.yahoo.vespa.hosted.controller.api.integration.organization.ApplicationSummary; import com.yahoo.vespa.hosted.controller.api.integration.organization.Contact; import com.yahoo.vespa.hosted.controller.api.integration.organization.IssueId; import com.yahoo.vespa.hosted.controller.api.integration.organization.OwnershipIssues; import com.yahoo.vespa.hosted.controller.api.integration.organization.User; -import com.yahoo.vespa.hosted.controller.application.TenantAndApplicationId; -import com.yahoo.vespa.hosted.controller.deployment.DeploymentContext; import com.yahoo.vespa.hosted.controller.deployment.DeploymentTester; import com.yahoo.vespa.hosted.controller.persistence.MockCuratorDb; import com.yahoo.vespa.hosted.controller.tenant.UserTenant; @@ -20,7 +17,6 @@ import org.junit.Test; import java.time.Duration; import java.util.List; import java.util.Optional; -import java.util.function.Supplier; import static com.yahoo.vespa.hosted.controller.deployment.DeploymentTester.appId; import static org.junit.Assert.assertEquals; @@ -46,20 +42,18 @@ public class ApplicationOwnershipConfirmerTest { @Test public void testConfirmation() { Optional<Contact> contact = Optional.of(tester.controllerTester().serviceRegistry().contactRetrieverMock().contact()); + var propertyApp = tester.newDeploymentContext(); tester.controller().tenants().lockOrThrow(appId.tenant(), LockedTenant.Athenz.class, tenant -> tester.controller().tenants().store(tenant.with(contact.get()))); - Supplier<Application> propertyApp = tester::application; - tester.deployNewSubmission(tester.newSubmission()); + propertyApp.submit().deploy(); UserTenant user = UserTenant.create("by-user", contact); tester.controller().tenants().createUser(user); - tester.createApplication(user.name().value(), "application", "default"); - TenantAndApplicationId userAppId = TenantAndApplicationId.from("by-user", "application"); - Supplier<Application> userApp = () -> tester.controller().applications().requireApplication(userAppId); - tester.deployNewSubmission(userAppId, tester.newSubmission(userAppId, DeploymentContext.applicationPackage)); + var userApp = tester.newDeploymentContext("by-user", "application", "default"); + userApp.submit().deploy(); - assertFalse("No issue is initially stored for a new application.", propertyApp.get().ownershipIssueId().isPresent()); - assertFalse("No issue is initially stored for a new application.", userApp.get().ownershipIssueId().isPresent()); + assertFalse("No issue is initially stored for a new application.", propertyApp.application().ownershipIssueId().isPresent()); + assertFalse("No issue is initially stored for a new application.", userApp.application().ownershipIssueId().isPresent()); assertFalse("No escalation has been attempted for a new application", issues.escalatedToContact || issues.escalatedToTerminator); // Set response from the issue mock, which will be obtained by the maintainer on issue filing. @@ -67,14 +61,14 @@ public class ApplicationOwnershipConfirmerTest { issues.response = issueId; confirmer.maintain(); - assertFalse("No issue is stored for an application newer than 3 months.", propertyApp.get().ownershipIssueId().isPresent()); - assertFalse("No issue is stored for an application newer than 3 months.", userApp.get().ownershipIssueId().isPresent()); + assertFalse("No issue is stored for an application newer than 3 months.", propertyApp.application().ownershipIssueId().isPresent()); + assertFalse("No issue is stored for an application newer than 3 months.", userApp.application().ownershipIssueId().isPresent()); tester.clock().advance(Duration.ofDays(91)); confirmer.maintain(); - assertEquals("Confirmation issue has been filed for property owned application.", issueId, propertyApp.get().ownershipIssueId()); - assertEquals("Confirmation issue has been filed for user owned application.", issueId, userApp.get().ownershipIssueId()); + assertEquals("Confirmation issue has been filed for property owned application.", issueId, propertyApp.application().ownershipIssueId()); + assertEquals("Confirmation issue has been filed for user owned application.", issueId, userApp.application().ownershipIssueId()); assertTrue(issues.escalatedToTerminator); assertTrue("Both applications have had their responses ensured.", issues.escalatedToContact); @@ -82,14 +76,14 @@ public class ApplicationOwnershipConfirmerTest { issues.response = Optional.empty(); confirmer.maintain(); - assertEquals("Confirmation issue reference is not updated when no issue id is returned.", issueId, propertyApp.get().ownershipIssueId()); - assertEquals("Confirmation issue reference is not updated when no issue id is returned.", issueId, userApp.get().ownershipIssueId()); + assertEquals("Confirmation issue reference is not updated when no issue id is returned.", issueId, propertyApp.application().ownershipIssueId()); + assertEquals("Confirmation issue reference is not updated when no issue id is returned.", issueId, userApp.application().ownershipIssueId()); // The user deletes all production deployments — see that the issue is forgotten. - assertEquals("Confirmation issue for user is still open.", issueId, userApp.get().ownershipIssueId()); - userApp.get().productionDeployments().values().stream().flatMap(List::stream) - .forEach(deployment -> tester.controller().applications().deactivate(userAppId.defaultInstance(), deployment.zone())); - assertTrue("No production deployments are listed for user.", userApp.get().require(InstanceName.defaultName()).productionDeployments().isEmpty()); + assertEquals("Confirmation issue for user is still open.", issueId, userApp.application().ownershipIssueId()); + userApp.application().productionDeployments().values().stream().flatMap(List::stream) + .forEach(deployment -> tester.controller().applications().deactivate(userApp.instanceId(), deployment.zone())); + assertTrue("No production deployments are listed for user.", userApp.application().require(InstanceName.defaultName()).productionDeployments().isEmpty()); confirmer.maintain(); // Time has passed, and a new confirmation issue is in order for the property which is still in production. @@ -97,13 +91,13 @@ public class ApplicationOwnershipConfirmerTest { issues.response = issueId2; confirmer.maintain(); - assertEquals("A new confirmation issue id is stored when something is returned to the maintainer.", issueId2, propertyApp.get().ownershipIssueId()); - assertEquals("Confirmation issue for application without production deployments has not been filed.", issueId, userApp.get().ownershipIssueId()); + assertEquals("A new confirmation issue id is stored when something is returned to the maintainer.", issueId2, propertyApp.application().ownershipIssueId()); + assertEquals("Confirmation issue for application without production deployments has not been filed.", issueId, userApp.application().ownershipIssueId()); - assertFalse("No owner is stored for application", propertyApp.get().owner().isPresent()); + assertFalse("No owner is stored for application", propertyApp.application().owner().isPresent()); issues.owner = Optional.of(User.from("username")); confirmer.maintain(); - assertEquals("Owner has been added to application", propertyApp.get().owner().get().username(), "username"); + assertEquals("Owner has been added to application", propertyApp.application().owner().get().username(), "username"); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirerTest.java index 4df1336ac1f..258dad3b6d6 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirerTest.java @@ -35,35 +35,32 @@ public class DeploymentExpirerTest { ); DeploymentExpirer expirer = new DeploymentExpirer(tester.controller(), Duration.ofDays(10), new JobControl(new MockCuratorDb())); - Application devApp = tester.createApplication("tenant1", "app1", "default"); - Application prodApp = tester.createApplication("tenant2", "app2", "default"); + var devApp = tester.newDeploymentContext("tenant1", "app1", "default"); + var prodApp = tester.newDeploymentContext("tenant2", "app2", "default"); ApplicationPackage appPackage = new ApplicationPackageBuilder() .region("us-west-1") .build(); - Instance devInstance = tester.instance(devApp.id().defaultInstance()); - Instance prodInstance = tester.instance(prodApp.id().defaultInstance()); - // Deploy dev - tester.runJob(devInstance.id(), JobType.devUsEast1, appPackage); + devApp.runJob(JobType.devUsEast1, appPackage); // Deploy prod - tester.deployNewSubmission(prodApp.id(), tester.newSubmission(prodApp.id(), appPackage)); + prodApp.submit(appPackage).deploy(); - assertEquals(1, permanentDeployments(devInstance).size()); - assertEquals(1, permanentDeployments(prodInstance).size()); + assertEquals(1, permanentDeployments(devApp.instance()).size()); + assertEquals(1, permanentDeployments(prodApp.instance()).size()); // Not expired at first expirer.maintain(); - assertEquals(1, permanentDeployments(devInstance).size()); - assertEquals(1, permanentDeployments(prodInstance).size()); + assertEquals(1, permanentDeployments(devApp.instance()).size()); + assertEquals(1, permanentDeployments(prodApp.instance()).size()); // The dev application is removed tester.clock().advance(Duration.ofDays(15)); expirer.maintain(); - assertEquals(0, permanentDeployments(devInstance).size()); - assertEquals(1, permanentDeployments(prodInstance).size()); + assertEquals(0, permanentDeployments(devApp.instance()).size()); + assertEquals(1, permanentDeployments(prodApp.instance()).size()); } private List<Deployment> permanentDeployments(Instance instance) { diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentIssueReporterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentIssueReporterTest.java index 070171ad399..0afe7377d40 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentIssueReporterTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentIssueReporterTest.java @@ -13,6 +13,7 @@ import com.yahoo.vespa.hosted.controller.application.ApplicationPackage; import com.yahoo.vespa.hosted.controller.application.Change; import com.yahoo.vespa.hosted.controller.application.TenantAndApplicationId; import com.yahoo.vespa.hosted.controller.deployment.ApplicationPackageBuilder; +import com.yahoo.vespa.hosted.controller.deployment.DeploymentContext; import com.yahoo.vespa.hosted.controller.deployment.DeploymentTester; import com.yahoo.vespa.hosted.controller.persistence.MockCuratorDb; import com.yahoo.vespa.hosted.controller.versions.VespaVersion; @@ -65,33 +66,28 @@ public class DeploymentIssueReporterTest { tester.controllerTester().upgradeSystem(Version.fromString("6.2")); // Create and deploy one application for each of three tenants. - Application app1 = tester.createApplication("application1", "tenant1", "default"); - Application app2 = tester.createApplication("application2", "tenant2", "default"); - Application app3 = tester.createApplication("application3", "tenant3", "default"); + var app1 = tester.newDeploymentContext("application1", "tenant1", "default"); + var app2 = tester.newDeploymentContext("application2", "tenant2", "default"); + var app3 = tester.newDeploymentContext("application3", "tenant3", "default"); Contact contact = tester.controllerTester().serviceRegistry().contactRetrieverMock().contact(); - tester.controller().tenants().lockOrThrow(app1.id().tenant(), LockedTenant.Athenz.class, tenant -> + tester.controller().tenants().lockOrThrow(app1.instanceId().tenant(), LockedTenant.Athenz.class, tenant -> tester.controller().tenants().store(tenant.with(contact))); - tester.controller().tenants().lockOrThrow(app2.id().tenant(), LockedTenant.Athenz.class, tenant -> + tester.controller().tenants().lockOrThrow(app2.instanceId().tenant(), LockedTenant.Athenz.class, tenant -> tester.controller().tenants().store(tenant.with(contact))); - tester.controller().tenants().lockOrThrow(app3.id().tenant(), LockedTenant.Athenz.class, tenant -> + tester.controller().tenants().lockOrThrow(app3.instanceId().tenant(), LockedTenant.Athenz.class, tenant -> tester.controller().tenants().store(tenant.with(contact))); // NOTE: All maintenance should be idempotent within a small enough time interval, so maintain is called twice in succession throughout. // app 1 fails staging tests. - tester.newSubmission(app1.id(), applicationPackage); - tester.runJob(app1.id().defaultInstance(), systemTest); - tester.timeOutConvergence(app1.id().defaultInstance(), stagingTest); + app1.submit(applicationPackage).runJob(systemTest).timeOutConvergence(stagingTest); // app2 is successful, but will fail later. - tester.deployNewSubmission(app2.id(), tester.newSubmission(app2.id(), applicationPackage)); + app2.submit(applicationPackage).deploy(); // app 3 fails a production job. - tester.newSubmission(app3.id(), applicationPackage); - tester.runJob(app3.id().defaultInstance(), systemTest); - tester.runJob(app3.id().defaultInstance(), stagingTest); - tester.failDeployment(app3.id().defaultInstance(), productionUsWest1); + app3.submit(applicationPackage).runJob(systemTest).runJob(stagingTest).failDeployment(productionUsWest1); reporter.maintain(); reporter.maintain(); @@ -103,53 +99,52 @@ public class DeploymentIssueReporterTest { reporter.maintain(); reporter.maintain(); - assertTrue("One issue is produced for app1.", issues.isOpenFor(app1.id())); - assertFalse("No issues are produced for app2.", issues.isOpenFor(app2.id())); - assertTrue("One issue is produced for app3.", issues.isOpenFor(app3.id())); + assertTrue("One issue is produced for app1.", issues.isOpenFor(app1.application().id())); + assertFalse("No issues are produced for app2.", issues.isOpenFor(app2.application().id())); + assertTrue("One issue is produced for app3.", issues.isOpenFor(app3.application().id())); // app3 closes their issue prematurely; see that it is refiled. - issues.closeFor(app3.id()); - assertFalse("No issue is open for app3.", issues.isOpenFor(app3.id())); + issues.closeFor(app3.application().id()); + assertFalse("No issue is open for app3.", issues.isOpenFor(app3.application().id())); reporter.maintain(); reporter.maintain(); - assertTrue("Issue is re-filed for app3.", issues.isOpenFor(app3.id())); + assertTrue("Issue is re-filed for app3.", issues.isOpenFor(app3.application().id())); // Some time passes; tenant1 leaves her issue unattended, while tenant3 starts work and updates the issue. tester.clock().advance(maxInactivity.plus(maxFailureAge)); - issues.touchFor(app3.id()); + issues.touchFor(app3.application().id()); reporter.maintain(); reporter.maintain(); - assertEquals("The issue for app1 is escalated once.", 1, issues.escalationLevelFor(app1.id())); + assertEquals("The issue for app1 is escalated once.", 1, issues.escalationLevelFor(app1.application().id())); // app3 fixes their problems, but the ticket for app3 is left open; see the resolved ticket is not escalated when another escalation period has passed. - tester.runJob(app3.id().defaultInstance(), productionUsWest1); + app3.runJob(productionUsWest1); tester.clock().advance(maxInactivity.plus(Duration.ofDays(1))); reporter.maintain(); reporter.maintain(); assertFalse("We no longer have a platform issue.", issues.platformIssue()); - assertEquals("The issue for app1 is escalated once more.", 2, issues.escalationLevelFor(app1.id())); - assertEquals("The issue for app3 is not escalated.", 0, issues.escalationLevelFor(app3.id())); + assertEquals("The issue for app1 is escalated once more.", 2, issues.escalationLevelFor(app1.application().id())); + assertEquals("The issue for app3 is not escalated.", 0, issues.escalationLevelFor(app3.application().id())); // app3 now has a new failure past max failure age; see that a new issue is filed. - tester.newSubmission(app3.id(), applicationPackage); - tester.failDeployment(app3.id().defaultInstance(), systemTest); + app3.submit(applicationPackage).failDeployment(systemTest); tester.clock().advance(maxInactivity.plus(maxFailureAge)); reporter.maintain(); reporter.maintain(); - assertTrue("A new issue is filed for app3.", issues.isOpenFor(app3.id())); + assertTrue("A new issue is filed for app3.", issues.isOpenFor(app3.application().id())); - // App2 is changed to be a canary - tester.deployNewSubmission(app2.id(), tester.newSubmission(app2.id(), canaryPackage)); - assertEquals(canary, tester.applications().requireApplication(app2.id()).deploymentSpec().requireInstance("default").upgradePolicy()); - assertEquals(Change.empty(), tester.applications().requireApplication(app2.id()).change()); + // app2 is changed to be a canary + app2.submit(canaryPackage).deploy(); + assertEquals(canary, app2.application().deploymentSpec().requireInstance("default").upgradePolicy()); + assertEquals(Change.empty(), app2.application().change()); // Bump system version to upgrade canary app2. Version version = Version.fromString("6.3"); @@ -157,7 +152,7 @@ public class DeploymentIssueReporterTest { tester.upgrader().maintain(); assertEquals(version, tester.controller().versionStatus().systemVersion().get().versionNumber()); - tester.timeOutUpgrade(app2.id().defaultInstance(), systemTest); + app2.timeOutUpgrade(systemTest); tester.controllerTester().upgradeSystem(version); assertEquals(VespaVersion.Confidence.broken, tester.controller().versionStatus().systemVersion().get().confidence()); @@ -169,7 +164,7 @@ public class DeploymentIssueReporterTest { reporter.maintain(); reporter.maintain(); assertTrue("We get a platform issue when confidence is broken", issues.platformIssue()); - assertFalse("No deployment issue is filed for app2, which has a version upgrade failure.", issues.isOpenFor(app2.id())); + assertFalse("No deployment issue is filed for app2, which has a version upgrade failure.", issues.isOpenFor(app2.application().id())); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OutstandingChangeDeployerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OutstandingChangeDeployerTest.java index 0be873f80ed..11c77304dd0 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OutstandingChangeDeployerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OutstandingChangeDeployerTest.java @@ -37,45 +37,40 @@ public class OutstandingChangeDeployerTest { .region("us-west-1") .build(); - Application app1 = tester.createApplication("tenant", "app1", "default"); - tester.deployNewSubmission(app1.id(), tester.newSubmission(app1.id(), applicationPackage)); + var app1 = tester.newDeploymentContext("tenant", "app1", "default").submit(applicationPackage).deploy(); Version version = new Version(6, 2); - tester.deploymentTrigger().triggerChange(app1.id(), Change.of(version)); + tester.deploymentTrigger().triggerChange(app1.application().id(), Change.of(version)); tester.deploymentTrigger().triggerReadyJobs(); - assertEquals(Change.of(version), tester.application(app1.id()).change()); - assertFalse(tester.application(app1.id()).outstandingChange().hasTargets()); + assertEquals(Change.of(version), app1.application().change()); + assertFalse(app1.application().outstandingChange().hasTargets()); - assertEquals(1, tester.application(app1.id()).latestVersion().get().buildNumber().getAsLong()); - tester.newSubmission(app1.id(), applicationPackage, new SourceRevision("repository1", "master", "cafed00d")); + assertEquals(1, app1.application().latestVersion().get().buildNumber().getAsLong()); + app1.submit(applicationPackage, new SourceRevision("repository1", "master", "cafed00d")); - ApplicationId instanceId = app1.id().defaultInstance(); - assertTrue(tester.application(app1.id()).outstandingChange().hasTargets()); - assertEquals("1.0.2-cafed00d", tester.application(app1.id()).outstandingChange().application().get().id()); - tester.assertRunning(instanceId, JobType.systemTest); - tester.assertRunning(instanceId, JobType.stagingTest); + assertTrue(app1.application().outstandingChange().hasTargets()); + assertEquals("1.0.2-cafed00d", app1.application().outstandingChange().application().get().id()); + app1.assertRunning(JobType.systemTest); + app1.assertRunning(JobType.stagingTest); assertEquals(2, tester.jobs().active().size()); deployer.maintain(); - tester.deploymentTrigger().triggerReadyJobs(); + tester.triggerJobs(); assertEquals("No effect as job is in progress", 2, tester.jobs().active().size()); - assertEquals("1.0.2-cafed00d", tester.application(app1.id()).outstandingChange().application().get().id()); + assertEquals("1.0.2-cafed00d", app1.application().outstandingChange().application().get().id()); - tester.runJob(instanceId, JobType.systemTest); - tester.runJob(instanceId, JobType.stagingTest); - tester.runJob(instanceId, JobType.productionUsWest1); - tester.runJob(instanceId, JobType.systemTest); - tester.runJob(instanceId, JobType.stagingTest); + app1.runJob(JobType.systemTest).runJob(JobType.stagingTest).runJob(JobType.productionUsWest1) + .runJob(JobType.stagingTest).runJob(JobType.systemTest); assertEquals("Upgrade done", 0, tester.jobs().active().size()); deployer.maintain(); - tester.deploymentTrigger().triggerReadyJobs(); - assertEquals("1.0.2-cafed00d", tester.application(app1.id()).change().application().get().id()); + tester.triggerJobs(); + assertEquals("1.0.2-cafed00d", app1.application().change().application().get().id()); List<Run> runs = tester.jobs().active(); assertEquals(1, runs.size()); - tester.assertRunning(instanceId, JobType.productionUsWest1); - assertFalse(tester.application(app1.id()).outstandingChange().hasTargets()); + app1.assertRunning(JobType.productionUsWest1); + assertFalse(app1.application().outstandingChange().hasTargets()); } } 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 daf1a4c2ea7..8e3a3b8d727 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 @@ -33,9 +33,7 @@ import static com.yahoo.vespa.hosted.controller.api.integration.deployment.JobTy import static com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType.stagingTest; import static com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType.systemTest; import static com.yahoo.vespa.hosted.controller.api.integration.deployment.TesterCloud.Status.FAILURE; -import static com.yahoo.vespa.hosted.controller.deployment.DeploymentTester.instanceId; import static com.yahoo.vespa.hosted.controller.deployment.DeploymentContext.applicationPackage; -import static com.yahoo.vespa.hosted.controller.deployment.DeploymentTester.testerId; import static com.yahoo.vespa.hosted.controller.deployment.RunStatus.deploymentFailed; import static com.yahoo.vespa.hosted.controller.deployment.RunStatus.installationFailed; import static com.yahoo.vespa.hosted.controller.deployment.RunStatus.running; @@ -51,60 +49,59 @@ public class JobControllerApiHandlerHelperTest { @Test public void testResponses() { DeploymentTester tester = new DeploymentTester(); + var app = tester.newDeploymentContext(); tester.clock().setInstant(Instant.EPOCH); // Revision 1 gets deployed everywhere. - ApplicationVersion revision1 = tester.newSubmission(); - tester.deployNewSubmission(revision1); + app.submit().deploy(); + ApplicationVersion revision1 = app.lastSubmission().get(); assertEquals(1000, tester.application().projectId().getAsLong()); tester.clock().advance(Duration.ofMillis(1000)); // Revision 2 gets deployed everywhere except in us-east-3. - ApplicationVersion revision2 = tester.newSubmission(); - tester.runJob(systemTest); - tester.runJob(stagingTest); - tester.runJob(productionUsCentral1); + ApplicationVersion revision2 = app.submit().lastSubmission().get(); + app.runJob(systemTest); + app.runJob(stagingTest); + app.runJob(productionUsCentral1); tester.triggerJobs(); // us-east-3 eats the deployment failure and fails before deployment, while us-west-1 fails after. tester.configServer().throwOnNextPrepare(new ConfigServerException(URI.create("url"), "ERROR!", INVALID_APPLICATION_PACKAGE, null)); tester.runner().run(); - assertEquals(deploymentFailed, tester.jobs().last(instanceId, productionUsEast3).get().status()); + assertEquals(deploymentFailed, tester.jobs().last(app.instanceId(), productionUsEast3).get().status()); ZoneId usWest1 = productionUsWest1.zone(tester.controller().system()); - tester.configServer().convergeServices(instanceId, usWest1); - tester.configServer().convergeServices(testerId.id(), usWest1); - tester.setEndpoints(instanceId, usWest1); - tester.setEndpoints(testerId.id(), usWest1); + tester.configServer().convergeServices(app.instanceId(), usWest1); + tester.configServer().convergeServices(app.testerId().id(), usWest1); + tester.setEndpoints(app.instanceId(), usWest1); + tester.setEndpoints(app.testerId().id(), usWest1); tester.runner().run(); tester.cloud().set(FAILURE); tester.runner().run(); - assertEquals(testFailure, tester.jobs().last(instanceId, productionUsWest1).get().status()); - assertEquals(revision2, tester.instance().deployments().get(productionUsCentral1.zone(tester.controller().system())).applicationVersion()); - assertEquals(revision1, tester.instance().deployments().get(productionUsEast3.zone(tester.controller().system())).applicationVersion()); - assertEquals(revision2, tester.instance().deployments().get(productionUsWest1.zone(tester.controller().system())).applicationVersion()); + assertEquals(testFailure, tester.jobs().last(app.instanceId(), productionUsWest1).get().status()); + assertEquals(revision2, app.deployment(productionUsCentral1.zone(tester.controller().system())).applicationVersion()); + assertEquals(revision1, app.deployment(productionUsEast3.zone(tester.controller().system())).applicationVersion()); + assertEquals(revision2, app.deployment(productionUsWest1.zone(tester.controller().system())).applicationVersion()); tester.clock().advance(Duration.ofMillis(1000)); // Revision 3 starts. - tester.newSubmission(); - tester.runJob(systemTest); - tester.runJob(stagingTest); - tester.triggerJobs(); // Starts a run for us-central-1. - tester.triggerJobs(); // Starts a new staging test run. + app.submit() + .runJob(systemTest).runJob(stagingTest); + tester.triggerJobs(); // Starts runs for us-central-1 and a new staging test run. tester.runner().run(); - assertEquals(running, tester.jobs().last(instanceId, productionUsCentral1).get().status()); - assertEquals(running, tester.jobs().last(instanceId, stagingTest).get().status()); + assertEquals(running, tester.jobs().last(app.instanceId(), productionUsCentral1).get().status()); + assertEquals(running, tester.jobs().last(app.instanceId(), stagingTest).get().status()); - // Staging is expired, and the job fails and won't be retried immediately. - tester.controller().applications().deactivate(instanceId, stagingTest.zone(tester.controller().system())); + // Staging deployment expires, the job fails, and won't be retried immediately. + tester.controller().applications().deactivate(app.instanceId(), stagingTest.zone(tester.controller().system())); tester.runner().run(); - assertEquals(installationFailed, tester.jobs().last(instanceId, stagingTest).get().status()); + assertEquals(installationFailed, tester.jobs().last(app.instanceId(), stagingTest).get().status()); tester.clock().advance(Duration.ofMillis(100_000)); // More than the minute within which there are immediate retries. tester.triggerJobs(); - assertEquals(installationFailed, tester.jobs().last(instanceId, stagingTest).get().status()); + assertEquals(installationFailed, tester.jobs().last(app.instanceId(), stagingTest).get().status()); // System upgrades to a new version, which won't yet start. Version platform = new Version("7.1"); @@ -117,36 +114,38 @@ public class JobControllerApiHandlerHelperTest { // Only us-east-3 is verified, on revision1. // staging-test has 4 runs: one success without sources on revision1, one success from revision1 to revision2, // one success from revision2 to revision3 and one failure from revision1 to revision3. - assertResponse(JobControllerApiHandlerHelper.runResponse(tester.jobs().runs(instanceId, stagingTest), URI.create("https://some.url:43/root")), "staging-runs.json"); - assertResponse(JobControllerApiHandlerHelper.runDetailsResponse(tester.jobs(), tester.jobs().last(instanceId, productionUsEast3).get().id(), "0"), "us-east-3-log-without-first.json"); - assertResponse(JobControllerApiHandlerHelper.jobTypeResponse(tester.controller(), instanceId, URI.create("https://some.url:43/root/")), "overview.json"); + assertResponse(JobControllerApiHandlerHelper.runResponse(tester.jobs().runs(app.instanceId(), stagingTest), URI.create("https://some.url:43/root")), "staging-runs.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"); - tester.runJob(instanceId, JobType.devAwsUsEast2a, applicationPackage); - assertResponse(JobControllerApiHandlerHelper.runResponse(tester.jobs().runs(instanceId, devAwsUsEast2a), URI.create("https://some.url:43/root")), "dev-aws-us-east-2a-runs.json"); + app.runJob(devAwsUsEast2a, applicationPackage); + assertResponse(JobControllerApiHandlerHelper.runResponse(tester.jobs().runs(app.instanceId(), devAwsUsEast2a), URI.create("https://some.url:43/root")), "dev-aws-us-east-2a-runs.json"); } @Test public void testDevResponses() { DeploymentTester tester = new DeploymentTester(); + var app = tester.newDeploymentContext(); tester.clock().setInstant(Instant.EPOCH); ZoneId zone = JobType.devUsEast1.zone(tester.controller().system()); - tester.jobs().deploy(instanceId, JobType.devUsEast1, Optional.empty(), applicationPackage); + tester.jobs().deploy(app.instanceId(), JobType.devUsEast1, Optional.empty(), applicationPackage); tester.configServer().setLogStream("1554970337.935104\t17491290-v6-1.ostk.bm2.prod.ne1.yahoo.com\t5480\tcontainer\tstdout\tinfo\tERROR: Bundle canary-application [71] Unable to get module class path. (java.lang.NullPointerException)\n"); - assertResponse(JobControllerApiHandlerHelper.runDetailsResponse(tester.jobs(), tester.jobs().last(instanceId, devUsEast1).get().id(), null), "dev-us-east-1-log-first-part.json"); + assertResponse(JobControllerApiHandlerHelper.runDetailsResponse(tester.jobs(), tester.jobs().last(app.instanceId(), devUsEast1).get().id(), null), "dev-us-east-1-log-first-part.json"); tester.configServer().setLogStream("Nope, this won't be logged"); - tester.configServer().convergeServices(instanceId, zone); - tester.setEndpoints(instanceId, zone); + tester.configServer().convergeServices(app.instanceId(), zone); + tester.setEndpoints(app.instanceId(), zone); tester.runner().run(); - assertResponse(JobControllerApiHandlerHelper.jobTypeResponse(tester.controller(), instanceId, URI.create("https://some.url:43/root")), "dev-overview.json"); - assertResponse(JobControllerApiHandlerHelper.runDetailsResponse(tester.jobs(), tester.jobs().last(instanceId, devUsEast1).get().id(), "9"), "dev-us-east-1-log-second-part.json"); + assertResponse(JobControllerApiHandlerHelper.jobTypeResponse(tester.controller(), app.instanceId(), URI.create("https://some.url:43/root")), "dev-overview.json"); + assertResponse(JobControllerApiHandlerHelper.runDetailsResponse(tester.jobs(), tester.jobs().last(app.instanceId(), devUsEast1).get().id(), "9"), "dev-us-east-1-log-second-part.json"); } @Test public void testResponsesWithDirectDeployment() { var tester = new DeploymentTester(); + var app = tester.newDeploymentContext(); tester.clock().setInstant(Instant.EPOCH); var region = "us-west-1"; var applicationPackage = new ApplicationPackageBuilder().region(region).build(); @@ -155,7 +154,7 @@ public class JobControllerApiHandlerHelperTest { Optional.of(applicationPackage), new DeployOptions(true, Optional.empty(), false, false)); - assertResponse(JobControllerApiHandlerHelper.jobTypeResponse(tester.controller(), instanceId, URI.create("https://some.url:43/root/")), + assertResponse(JobControllerApiHandlerHelper.jobTypeResponse(tester.controller(), app.instanceId(), URI.create("https://some.url:43/root/")), "jobs-direct-deployment.json"); } |