diff options
author | Harald Musum <musum@yahoo-inc.com> | 2017-09-25 18:47:02 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-25 18:47:02 +0200 |
commit | 2488a028448bb65570ecae8acb04b37c24f13c86 (patch) | |
tree | 541d6a8025fe46a0c2c82534caa1fe1698c8e9ec /controller-server | |
parent | 074c57c939511760b599b46ebd6324db2b713203 (diff) |
Revert "Remove self-triggering support"
Diffstat (limited to 'controller-server')
14 files changed, 142 insertions, 81 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java index c04e68b7a50..ccfcc0e4b0d 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java @@ -278,13 +278,17 @@ public class ApplicationController { Version version; if (options.deployCurrentVersion) version = application.currentVersion(controller, zone); + else if (application.deploymentJobs().isSelfTriggering()) // legacy mode: let the client decide + version = options.vespaVersion.map(Version::new).orElse(controller.systemVersion()); else if ( ! application.deploying().isPresent() && ! zone.environment().isManuallyDeployed()) return unexpectedDeployment(applicationId, zone, applicationPackage); else version = application.currentDeployVersion(controller, zone); // Ensure that the deploying change is tested - if ( ! zone.environment().isManuallyDeployed() && + // FIXME: For now only for non-self-triggering applications - VESPA-8418 + if ( ! application.deploymentJobs().isSelfTriggering() && + ! zone.environment().isManuallyDeployed() && ! application.deploymentJobs().isDeployableTo(zone.environment(), application.deploying())) throw new IllegalArgumentException("Rejecting deployment of " + application + " to " + zone + " as pending " + application.deploying().get() + diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentJobs.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentJobs.java index 722e8d10f40..b4ca00243b7 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentJobs.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentJobs.java @@ -31,23 +31,25 @@ public class DeploymentJobs { private final Optional<Long> projectId; private final ImmutableMap<JobType, JobStatus> status; private final Optional<String> jiraIssueId; + private final boolean selfTriggering; // TODO: Remove this when no projects are self-triggering. /** Creates an empty set of deployment jobs */ public DeploymentJobs(long projectId) { - this(Optional.of(projectId), ImmutableMap.of(), Optional.empty()); + this(Optional.of(projectId), ImmutableMap.of(), Optional.empty(),true); } - public DeploymentJobs(Optional<Long> projectId, Collection<JobStatus> jobStatusEntries, Optional<String> jiraIssueId) { - this(projectId, asMap(jobStatusEntries), jiraIssueId); + public DeploymentJobs(Optional<Long> projectId, Collection<JobStatus> jobStatusEntries, Optional<String> jiraIssueId, boolean selfTriggering) { + this(projectId, asMap(jobStatusEntries), jiraIssueId, selfTriggering); } - private DeploymentJobs(Optional<Long> projectId, Map<JobType, JobStatus> status, Optional<String> jiraIssueId) { + private DeploymentJobs(Optional<Long> projectId, Map<JobType, JobStatus> status, Optional<String> jiraIssueId, boolean selfTriggering) { Objects.requireNonNull(projectId, "projectId cannot be null"); Objects.requireNonNull(status, "status cannot be null"); Objects.requireNonNull(jiraIssueId, "jiraIssueId cannot be null"); this.projectId = projectId; this.status = ImmutableMap.copyOf(status); this.jiraIssueId = jiraIssueId; + this.selfTriggering = selfTriggering; } private static Map<JobType, JobStatus> asMap(Collection<JobStatus> jobStatusEntries) { @@ -64,7 +66,7 @@ public class DeploymentJobs { if (job == null) job = JobStatus.initial(report.jobType()); return job.withCompletion(report.jobError(), notificationTime, controller); }); - return new DeploymentJobs(Optional.of(report.projectId()), status, jiraIssueId); + return new DeploymentJobs(Optional.of(report.projectId()), status, jiraIssueId, report.selfTriggering()); } public DeploymentJobs withTriggering(JobType jobType, @@ -79,30 +81,33 @@ public class DeploymentJobs { change.isPresent() && change.get() instanceof Change.VersionChange, triggerTime); }); - return new DeploymentJobs(projectId, status, jiraIssueId); + return new DeploymentJobs(projectId, status, jiraIssueId, selfTriggering); } public DeploymentJobs withProjectId(long projectId) { - return new DeploymentJobs(Optional.of(projectId), status, jiraIssueId); + return new DeploymentJobs(Optional.of(projectId), status, jiraIssueId, selfTriggering); } public DeploymentJobs withJiraIssueId(Optional<String> jiraIssueId) { - return new DeploymentJobs(projectId, status, jiraIssueId); + return new DeploymentJobs(projectId, status, jiraIssueId, selfTriggering); } public DeploymentJobs without(JobType job) { Map<JobType, JobStatus> status = new HashMap<>(this.status); status.remove(job); - return new DeploymentJobs(projectId, status, jiraIssueId); + return new DeploymentJobs(projectId, status, jiraIssueId, selfTriggering); } public DeploymentJobs asSelfTriggering(boolean selfTriggering) { - return new DeploymentJobs(projectId, status, jiraIssueId); + return new DeploymentJobs(projectId, status, jiraIssueId, selfTriggering); } /** Returns an immutable map of the status entries in this */ public Map<JobType, JobStatus> jobStatus() { return status; } + /** Returns whether this application's deployment jobs trigger each other, and should be left alone, or not. */ + public boolean isSelfTriggering() { return selfTriggering; } + /** Returns whether this has some job status which is not a success */ public boolean hasFailures() { return status.values().stream().anyMatch(jobStatus -> ! jobStatus.isSuccess()); @@ -276,18 +281,19 @@ public class DeploymentJobs { private final long projectId; private final long buildNumber; private final Optional<JobError> jobError; + private final boolean selfTriggering; public JobReport(ApplicationId applicationId, JobType jobType, long projectId, long buildNumber, - Optional<JobError> jobError) { + Optional<JobError> jobError, boolean selfTriggering) { Objects.requireNonNull(applicationId, "applicationId cannot be null"); Objects.requireNonNull(jobType, "jobType cannot be null"); Objects.requireNonNull(jobError, "jobError cannot be null"); - this.applicationId = applicationId; this.projectId = projectId; this.buildNumber = buildNumber; this.jobType = jobType; this.jobError = jobError; + this.selfTriggering = selfTriggering; } public ApplicationId applicationId() { return applicationId; } @@ -296,6 +302,7 @@ public class DeploymentJobs { public long buildNumber() { return buildNumber; } public boolean success() { return !jobError.isPresent(); } public Optional<JobError> jobError() { return jobError; } + public boolean selfTriggering() { return selfTriggering; } } 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 c0e73a44444..d2af5fc50cb 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 @@ -280,6 +280,11 @@ public class DeploymentTrigger { return application; } + if (application.deploymentJobs().isSelfTriggering()) { + log.info("Not triggering " + jobType + " for self-triggering " + application); + return application; + } + log.info(String.format("Triggering %s for %s, %s: %s", jobType, application, application.deploying().map(d -> "deploying " + d).orElse("restarted deployment"), cause)); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java index 36363dd052e..607ad4fd9f0 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java @@ -125,6 +125,7 @@ public class ApplicationSerializer { deploymentJobs.projectId().ifPresent(projectId -> cursor.setLong(projectIdField, projectId)); jobStatusToSlime(deploymentJobs.jobStatus().values(), cursor.setArray(jobStatusField)); deploymentJobs.jiraIssueId().ifPresent(jiraIssueId -> cursor.setString(jiraIssueIdField, jiraIssueId)); + cursor.setBool(selfTriggeringField, deploymentJobs.isSelfTriggering()); } private void jobStatusToSlime(Collection<JobStatus> jobStatuses, Cursor jobStatusArray) { @@ -219,7 +220,7 @@ public class ApplicationSerializer { Optional<String> jiraIssueKey = optionalString(object.field(jiraIssueIdField)); boolean selfTriggering = object.field(selfTriggeringField).asBool(); - return new DeploymentJobs(projectId, jobStatusList, jiraIssueKey); + return new DeploymentJobs(projectId, jobStatusList, jiraIssueKey, selfTriggering); } private Optional<Change> changeFromSlime(Inspector object) { diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/screwdriver/ScrewdriverApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/screwdriver/ScrewdriverApiHandler.java index c2695554da7..3cc4d8c7f5c 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/screwdriver/ScrewdriverApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/screwdriver/ScrewdriverApiHandler.java @@ -147,7 +147,8 @@ public class ScrewdriverApiHandler extends LoggingRequestHandler { JobType.fromId(report.field("jobName").asString()), report.field("projectId").asLong(), report.field("buildNumber").asLong(), - jobError + jobError, + report.field("selfTriggering").asBool() ); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java index 7a6dce9f8fa..3ab98d31a82 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java @@ -101,7 +101,7 @@ public class ControllerTest { // staging job - succeeding Version version1 = Version.fromString("6.1"); // Set in config server mock Application app1 = tester.createApplication("app1", "tenant1", 1, 11L); - applications.notifyJobCompletion(mockReport(app1, component, true)); + applications.notifyJobCompletion(mockReport(app1, component, true, false)); assertFalse("Revision is currently not known", ((Change.ApplicationChange)tester.controller().applications().require(app1.id()).deploying().get()).revision().isPresent()); tester.deployAndNotify(app1, applicationPackage, true, systemTest); @@ -143,7 +143,7 @@ public class ControllerTest { tester.clock().advance(Duration.ofSeconds(1)); // system and staging test job - succeeding - applications.notifyJobCompletion(mockReport(app1, component, true)); + applications.notifyJobCompletion(mockReport(app1, component, true, false)); tester.deployAndNotify(app1, applicationPackage, true, systemTest); assertStatus(JobStatus.initial(systemTest) .withTriggering(version1, revision, false, tester.clock().instant()) @@ -170,7 +170,7 @@ public class ControllerTest { .environment(Environment.prod) .region("us-east-3") .build(); - applications.notifyJobCompletion(mockReport(app1, component, true)); + applications.notifyJobCompletion(mockReport(app1, component, true, false)); try { tester.deploy(systemTest, app1, applicationPackage); fail("Expected exception due to unallowed production deployment removal"); @@ -210,7 +210,7 @@ public class ControllerTest { applications.store(app1.with(app1.deploymentJobs().asSelfTriggering(false)), applications.lock(app1.id())); // First deployment: An application change - applications.notifyJobCompletion(mockReport(app1, component, true)); + applications.notifyJobCompletion(mockReport(app1, component, true, false)); tester.deployAndNotify(app1, applicationPackage, true, systemTest); tester.deployAndNotify(app1, applicationPackage, true, stagingTest); tester.deployAndNotify(app1, applicationPackage, true, productionUsWest1); @@ -233,7 +233,7 @@ public class ControllerTest { .region("us-west-1") .region("us-east-3") .build(); - applications.notifyJobCompletion(mockReport(app1, component, true)); + applications.notifyJobCompletion(mockReport(app1, component, true, false)); tester.deployAndNotify(app1, applicationPackage, true, systemTest); tester.deployAndNotify(app1, applicationPackage, true, stagingTest); tester.deployAndNotify(app1, applicationPackage, true, productionUsWest1); @@ -404,6 +404,23 @@ public class ControllerTest { } @Test + public void selfTriggeringApplicationIsNotTriggered() { + ControllerTester tester = new ControllerTester(); + ApplicationController applications = tester.controller().applications(); + + // Create application and report completion from component job + long projectId = 1; + TenantId tenant = tester.createTenant("tenant", "domain", 1L); + Application application = tester.createApplication(tenant, "application", "default", projectId); + applications.notifyJobCompletion(mockReport(application, component, true, true)); + + // Only component completion status is persisted and no further jobs are triggered + assertEquals(1, applications.get(application.id()).get().deploymentJobs().jobStatus().size()); + assertStatus(JobStatus.initial(component).withCompletion(Optional.empty(), tester.clock().instant(), tester.controller()), + application.id(), tester.controller()); + } + + @Test public void requeueOutOfCapacityStagingJob() { DeploymentTester tester = new DeploymentTester(); @@ -474,18 +491,19 @@ public class ControllerTest { assertEquals(expectedStatus, existingStatus); } - private JobReport mockReport(Application application, JobType jobType, Optional<JobError> jobError) { + private JobReport mockReport(Application application, JobType jobType, Optional<JobError> jobError, boolean selfTriggering) { return new JobReport( application.id(), jobType, application.deploymentJobs().projectId().get(), 42, - jobError + jobError, + selfTriggering ); } - private JobReport mockReport(Application application, JobType jobType, boolean success) { - return mockReport(application, jobType, JobError.from(success)); + private JobReport mockReport(Application application, JobType jobType, boolean success, boolean selfTriggering) { + return mockReport(application, jobType, JobError.from(success), selfTriggering); } @Test @@ -515,6 +533,44 @@ public class ControllerTest { } @Test + public void testLegacyDeployments() { + // Setup system + DeploymentTester tester = new DeploymentTester(); + ApplicationController applications = tester.controller().applications(); + ApplicationPackage applicationPackage = new ApplicationPackageBuilder() + .environment(Environment.prod) + .region("us-east-3") + .build(); + Version systemVersion = tester.controller().versionStatus().systemVersion().get().versionNumber(); + + Application app1 = tester.createApplication("application1", "tenant1", 1, 1L); + applications.store(app1.with(app1.deploymentJobs().asSelfTriggering(true)), applications.lock(app1.id())); + + // Scenario: App already on 6.0, Upgrade to 6.1 (systemversion) + Zone prodZone = new Zone(Environment.prod, RegionName.from("us-east-3")); + Zone stagingZone = new Zone(Environment.staging, RegionName.from("us-east-3")); + Version existingVersion = Version.fromString("6.0"); + + // Add deployment on existing version + legacyDeploy(tester.controller(), app1, applicationPackage, prodZone, Optional.of(existingVersion), false); + + // Add dev/perf deployment on old version to verify that this does not affect Initialize staging step. VESPA-8469 + Version devVersion = Version.fromString("5.0"); + legacyDeploy(tester.controller(), app1, applicationPackage, new Zone(Environment.dev, RegionName.from("us-east-1")), Optional.of(devVersion), false); + legacyDeploy(tester.controller(), app1, applicationPackage, new Zone(Environment.perf, RegionName.from("us-east-3")), Optional.of(devVersion), false); + + // Initialize staging on existing version + legacyDeploy(tester.controller(), app1, applicationPackage, stagingZone, Optional.of(systemVersion), true); + app1 = applications.require(app1.id()); + assertEquals(existingVersion, app1.currentDeployVersion(tester.controller(), stagingZone)); + + // Upgrade to the new version in staging + legacyDeploy(tester.controller(), app1, applicationPackage, stagingZone, Optional.of(systemVersion), false); + app1 = applications.require(app1.id()); + assertEquals(systemVersion, app1.currentDeployVersion(tester.controller(), stagingZone)); + } + + @Test public void testDeployUntestedChangeFails() { ControllerTester tester = new ControllerTester(); ApplicationController applications = tester.controller().applications();TenantId tenant = tester.createTenant("tenant1", "domain1", 11L); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java index 70e370da502..63feb01f1f2 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java @@ -9,6 +9,7 @@ import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import com.yahoo.test.ManualClock; +import com.yahoo.vespa.curator.Lock; import com.yahoo.vespa.hosted.controller.api.Tenant; import com.yahoo.vespa.hosted.controller.api.application.v4.model.DeployOptions; import com.yahoo.vespa.hosted.controller.api.application.v4.model.GitRevision; @@ -21,8 +22,6 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.Property; import com.yahoo.vespa.hosted.controller.api.identifiers.PropertyId; import com.yahoo.vespa.hosted.controller.api.identifiers.ScrewdriverId; import com.yahoo.vespa.hosted.controller.api.identifiers.TenantId; -import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensDbMock; -import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensMock; import com.yahoo.vespa.hosted.controller.api.integration.chef.ChefMock; import com.yahoo.vespa.hosted.controller.api.integration.dns.MemoryNameService; import com.yahoo.vespa.hosted.controller.api.integration.entity.MemoryEntityService; @@ -30,6 +29,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.github.GitHubMock; import com.yahoo.vespa.hosted.controller.api.integration.jira.JiraMock; import com.yahoo.vespa.hosted.controller.api.integration.routing.MemoryGlobalRoutingService; import com.yahoo.vespa.hosted.controller.application.ApplicationPackage; +import com.yahoo.vespa.hosted.controller.application.Change; import com.yahoo.vespa.hosted.controller.cost.CostMock; import com.yahoo.vespa.hosted.controller.cost.MockInsightBackend; import com.yahoo.vespa.hosted.controller.integration.MockMetricsService; @@ -40,6 +40,8 @@ import com.yahoo.vespa.hosted.controller.persistence.MockCuratorDb; import com.yahoo.vespa.hosted.controller.routing.MockRoutingGenerator; import com.yahoo.vespa.hosted.controller.versions.VersionStatus; import com.yahoo.vespa.hosted.rotation.MemoryRotationRepository; +import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensMock; +import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensDbMock; import java.util.Optional; @@ -107,6 +109,13 @@ public final class ControllerTester { public GitHubMock gitHubClientMock () { return gitHubMock; } + /** Set the application with the given id to currently be in the progress of rolling out the given change */ + public void setDeploying(ApplicationId id, Optional<Change> change) { + try (Lock lock = controller.applications().lock(id)) { + controller.applications().store(controller.applications().require(id).withDeploying(change), lock); + } + } + /** Creates the given tenant and application and deploys it */ public Application createAndDeploy(String tenantName, String domainName, String applicationName, Environment environment, long projectId, Long propertyId) { return createAndDeploy(tenantName, domainName, applicationName, toZone(environment), projectId, propertyId); 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 dc62de5cb52..3edbcea9843 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 @@ -194,7 +194,8 @@ public class DeploymentTester { jobType, application.deploymentJobs().projectId().get(), 42, - jobError + jobError, + false ); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/MockBuildService.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/MockBuildService.java index 0293ea08d65..b9e66b354de 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/MockBuildService.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/MockBuildService.java @@ -161,7 +161,8 @@ public class MockBuildService implements BuildService { jobType, projectId, 42, - JobError.from(success) + JobError.from(success), + false )); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/PolledBuildSystemTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/PolledBuildSystemTest.java index c869bd90924..779af370ff4 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/PolledBuildSystemTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/PolledBuildSystemTest.java @@ -2,9 +2,12 @@ package com.yahoo.vespa.hosted.controller.deployment; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.Environment; +import com.yahoo.vespa.curator.mock.MockCurator; +import com.yahoo.vespa.hosted.controller.ControllerTester; import com.yahoo.vespa.hosted.controller.api.integration.BuildService.BuildJob; -import com.yahoo.vespa.hosted.controller.application.ApplicationPackage; import com.yahoo.vespa.hosted.controller.application.DeploymentJobs.JobType; +import com.yahoo.vespa.hosted.controller.persistence.CuratorDb; import com.yahoo.vespa.hosted.controller.persistence.MockCuratorDb; import org.junit.Test; import org.junit.runner.RunWith; @@ -34,16 +37,15 @@ public class PolledBuildSystemTest { @Test public void throttle_capacity_constrained_jobs() { - DeploymentTester tester = new DeploymentTester(); + ControllerTester tester = new ControllerTester(); BuildSystem buildSystem = new PolledBuildSystem(tester.controller(), new MockCuratorDb()); - int fooProjectId = 1; - int barProjectId = 2; - ApplicationPackage applicationPackage = new ApplicationPackageBuilder() - .region("us-west-1") - .build(); - ApplicationId foo = tester.createAndDeploy("app1", fooProjectId, applicationPackage).id(); - ApplicationId bar = tester.createAndDeploy("app2", barProjectId, applicationPackage).id(); + long fooProjectId = 1; + long barProjectId = 2; + ApplicationId foo = tester.createAndDeploy("tenant1", "domain1", "app1", + Environment.prod, fooProjectId).id(); + ApplicationId bar = tester.createAndDeploy("tenant2", "domain2", "app2", + Environment.prod, barProjectId).id(); // Trigger jobs in capacity constrained environment buildSystem.addJob(foo, jobType, false); 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 5b758957571..4c53a6d37e4 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 @@ -1,22 +1,16 @@ // 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.maintenance; +import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.Zone; -import com.yahoo.vespa.hosted.controller.Application; -import com.yahoo.vespa.hosted.controller.application.ApplicationPackage; -import com.yahoo.vespa.hosted.controller.application.Deployment; -import com.yahoo.vespa.hosted.controller.deployment.ApplicationPackageBuilder; -import com.yahoo.vespa.hosted.controller.deployment.DeploymentTester; +import com.yahoo.vespa.hosted.controller.ControllerTester; import com.yahoo.vespa.hosted.controller.persistence.MockCuratorDb; -import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.time.Duration; -import java.util.List; -import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; @@ -25,50 +19,28 @@ import static org.junit.Assert.assertEquals; */ public class DeploymentExpirerTest { - private DeploymentTester tester; - - @Before - public void before() { - tester = new DeploymentTester(); - } - @Test public void testDeploymentExpiry() throws IOException, InterruptedException { - tester.controllerTester().getZoneRegistryMock().setDeploymentTimeToLive(new Zone(Environment.dev, RegionName.from("us-east-1")), Duration.ofDays(14)); + ControllerTester tester = new ControllerTester(); + tester.getZoneRegistryMock().setDeploymentTimeToLive(new Zone(Environment.dev, RegionName.from("us-east-1")), Duration.ofDays(14)); DeploymentExpirer expirer = new DeploymentExpirer(tester.controller(), Duration.ofDays(10), tester.clock(), new JobControl(new MockCuratorDb())); - Application devApp = tester.createApplication("app1", "tenant1", 123L, 1L); - Application prodApp = tester.createApplication("app2", "tenant2", 456L, 2L); - - // Deploy dev - tester.controllerTester().deploy(devApp, tester.controllerTester().toZone(Environment.dev)); + ApplicationId devApp = tester.createAndDeploy("tenant1", "domain1", "app1", Environment.dev, 123).id(); + ApplicationId prodApp = tester.createAndDeploy("tenant2", "domain2", "app2", Environment.prod, 456).id(); - // Deploy prod - ApplicationPackage prodAppPackage = new ApplicationPackageBuilder() - .region("us-west-1") - .build(); - tester.deployCompletely(prodApp, prodAppPackage); - - assertEquals(1, permanentDeployments(devApp).size()); - assertEquals(1, permanentDeployments(prodApp).size()); + assertEquals(1, tester.controller().applications().get(devApp).get().deployments().size()); + assertEquals(1, tester.controller().applications().get(prodApp).get().deployments().size()); // Not expired at first expirer.maintain(); - assertEquals(1, permanentDeployments(devApp).size()); - assertEquals(1, permanentDeployments(prodApp).size()); + assertEquals(1, tester.controller().applications().get(devApp).get().deployments().size()); + assertEquals(1, tester.controller().applications().get(prodApp).get().deployments().size()); // The dev application is removed tester.clock().advance(Duration.ofDays(15)); expirer.maintain(); - assertEquals(0, permanentDeployments(devApp).size()); - assertEquals(1, permanentDeployments(prodApp).size()); - } - - private List<Deployment> permanentDeployments(Application application) { - return tester.controller().applications().get(application.id()).get().deployments().values().stream() - .filter(deployment -> deployment.zone().environment() != Environment.test && - deployment.zone().environment() != Environment.staging) - .collect(Collectors.toList()); + assertEquals(0, tester.controller().applications().get(devApp).get().deployments().size()); + assertEquals(1, tester.controller().applications().get(prodApp).get().deployments().size()); } } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java index 8babd181d36..1aaf41350f2 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java @@ -67,7 +67,7 @@ public class ApplicationSerializerTest { .withTriggering(Version.fromString("5.6.6"), Optional.empty(), true, Instant.ofEpochMilli(5)) .withCompletion(Optional.of(JobError.unknown), Instant.ofEpochMilli(6), tester.controller())); - DeploymentJobs deploymentJobs = new DeploymentJobs(projectId, statusList, Optional.empty()); + DeploymentJobs deploymentJobs = new DeploymentJobs(projectId, statusList, Optional.empty(), false); Application original = new Application(ApplicationId.from("t1", "a1", "i1"), deploymentSpec, @@ -98,6 +98,7 @@ public class ApplicationSerializerTest { assertEquals( original.deploymentJobs().jobStatus().get(DeploymentJobs.JobType.stagingTest), serialized.deploymentJobs().jobStatus().get(DeploymentJobs.JobType.stagingTest)); assertEquals(original.deploymentJobs().failingSince(), serialized.deploymentJobs().failingSince()); + assertEquals(original.deploymentJobs().isSelfTriggering(), serialized.deploymentJobs().isSelfTriggering()); assertEquals(original.hasOutstandingChange(), serialized.hasOutstandingChange()); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerControllerTester.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerControllerTester.java index ed7378ac6b5..ef606a0eced 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerControllerTester.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerControllerTester.java @@ -89,8 +89,8 @@ public class ContainerControllerTester { public void notifyJobCompletion(ApplicationId applicationId, long projectId, boolean success, DeploymentJobs.JobType job) { controller().applications().notifyJobCompletion(new DeploymentJobs.JobReport(applicationId, job, projectId, 42, - success ? Optional.empty() : Optional.of(DeploymentJobs.JobError.unknown) - )); + success ? Optional.empty() : Optional.of(DeploymentJobs.JobError.unknown), + false)); } public AthensDomain addTenantAthensDomain(String domainName, String userName) { diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java index 1de9603bde0..a2fb5f38457 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java @@ -274,7 +274,8 @@ public class VersionStatusTest { jobType, application.deploymentJobs().projectId().get(), 42, - JobError.from(success) + JobError.from(success), + false ); } |