summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorHarald Musum <musum@yahoo-inc.com>2017-09-25 18:47:02 +0200
committerGitHub <noreply@github.com>2017-09-25 18:47:02 +0200
commit2488a028448bb65570ecae8acb04b37c24f13c86 (patch)
tree541d6a8025fe46a0c2c82534caa1fe1698c8e9ec /controller-server
parent074c57c939511760b599b46ebd6324db2b713203 (diff)
Revert "Remove self-triggering support"
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java6
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentJobs.java31
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java5
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java3
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/screwdriver/ScrewdriverApiHandler.java3
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java74
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java13
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTester.java3
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/MockBuildService.java3
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/PolledBuildSystemTest.java20
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentExpirerTest.java52
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java3
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerControllerTester.java4
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java3
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
);
}