summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2018-01-26 14:03:17 +0100
committerJon Bratseth <bratseth@oath.com>2018-01-26 14:03:17 +0100
commitb0e92a15e902416d40909bc856a488eae12822d3 (patch)
tree302a16cc966d7b34cf369660505cae17d9a061e2
parent010b7d16f28e1598c0205977973faab3594f6f9f (diff)
Make Application.deploying mandatory
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java18
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java8
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java8
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java18
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Change.java26
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentJobs.java10
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java31
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java22
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java14
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java9
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTester.java12
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java5
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OutstandingChangeDeployerTest.java12
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java22
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java20
15 files changed, 128 insertions, 107 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java
index bb1f64c121c..abfd94f87a2 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java
@@ -42,7 +42,7 @@ public class Application {
private final ValidationOverrides validationOverrides;
private final Map<ZoneId, Deployment> deployments;
private final DeploymentJobs deploymentJobs;
- private final Optional<Change> deploying;
+ private final Change deploying;
private final boolean outstandingChange;
private final Optional<IssueId> ownershipIssueId;
private final ApplicationMetrics metrics;
@@ -52,13 +52,13 @@ public class Application {
public Application(ApplicationId id) {
this(id, DeploymentSpec.empty, ValidationOverrides.empty, Collections.emptyMap(),
new DeploymentJobs(Optional.empty(), Collections.emptyList(), Optional.empty()),
- Optional.empty(), false, Optional.empty(), new ApplicationMetrics(0, 0),
+ Change.empty(), false, Optional.empty(), new ApplicationMetrics(0, 0),
Optional.empty());
}
/** Used from persistence layer: Do not use */
public Application(ApplicationId id, DeploymentSpec deploymentSpec, ValidationOverrides validationOverrides,
- List<Deployment> deployments, DeploymentJobs deploymentJobs, Optional<Change> deploying,
+ List<Deployment> deployments, DeploymentJobs deploymentJobs, Change deploying,
boolean outstandingChange, Optional<IssueId> ownershipIssueId, ApplicationMetrics metrics,
Optional<RotationId> rotation) {
this(id, deploymentSpec, validationOverrides,
@@ -67,7 +67,7 @@ public class Application {
}
Application(ApplicationId id, DeploymentSpec deploymentSpec, ValidationOverrides validationOverrides,
- Map<ZoneId, Deployment> deployments, DeploymentJobs deploymentJobs, Optional<Change> deploying,
+ Map<ZoneId, Deployment> deployments, DeploymentJobs deploymentJobs, Change deploying,
boolean outstandingChange, Optional<IssueId> ownershipIssueId, ApplicationMetrics metrics,
Optional<RotationId> rotation) {
Objects.requireNonNull(id, "id cannot be null");
@@ -124,7 +124,7 @@ public class Application {
* Returns the change that is currently in the process of being deployed on this application,
* or empty if no change is currently being deployed.
*/
- public Optional<Change> deploying() { return deploying; }
+ public Change deploying() { return deploying; }
/**
* Returns whether this has an outstanding change (in the source repository), which
@@ -152,8 +152,8 @@ public class Application {
/** Returns the version a new deployment to this zone should use for this application */
public Version deployVersionIn(ZoneId zone, Controller controller) {
- if (deploying().isPresent() && deploying().get() instanceof VersionChange)
- return ((Change.VersionChange) deploying().get()).version();
+ if (deploying() instanceof VersionChange)
+ return ((Change.VersionChange) deploying()).version();
return versionIn(zone, controller);
}
@@ -166,8 +166,8 @@ public class Application {
/** Returns the application version a deployment to this zone should use, or empty if we don't know */
public Optional<ApplicationVersion> deployApplicationVersionIn(ZoneId zone) {
- if (deploying().isPresent() && deploying().get() instanceof Change.ApplicationChange) {
- ApplicationVersion version = ((Change.ApplicationChange) deploying().get()).version();
+ if (deploying() instanceof Change.ApplicationChange) {
+ ApplicationVersion version = ((Change.ApplicationChange) deploying()).version();
if (version == ApplicationVersion.unknown)
return Optional.empty();
else
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 603f6c3ad12..dc39268c48d 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
@@ -322,9 +322,9 @@ public class ApplicationController {
validate(applicationPackage.deploymentSpec());
// TODO: Remove after introducing new application version number
- if (!options.deployCurrentVersion && applicationPackageFromDeployer.isPresent()) {
- if (application.deploying().isPresent() && application.deploying().get() instanceof Change.ApplicationChange) {
- application = application.withDeploying(Optional.of(Change.ApplicationChange.of(applicationVersion)));
+ if ( ! options.deployCurrentVersion && applicationPackageFromDeployer.isPresent()) {
+ if (application.deploying() instanceof Change.ApplicationChange) {
+ application = application.withDeploying(Change.ApplicationChange.of(applicationVersion));
}
if (!canDeployDirectlyTo(zone, options) && jobType.isPresent()) {
// Update with (potentially) missing information about what we triggered:
@@ -361,7 +361,7 @@ public class ApplicationController {
if (!canDeployDirectlyTo(zone, options)) {
if (!application.deploymentJobs().isDeployableTo(zone.environment(), application.deploying())) {
throw new IllegalArgumentException("Rejecting deployment of " + application + " to " + zone +
- " as " + application.deploying().get() + " is not tested");
+ " as " + application.deploying() + " is not tested");
}
Deployment existingDeployment = application.deployments().get(zone);
if (zone.environment().isProduction() && existingDeployment != null &&
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java
index e84409296dd..9dd849d736a 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java
@@ -64,7 +64,7 @@ public class LockedApplication extends Application {
return new LockedApplication(new Builder(this).with(deploymentJobs().withCompletion(report, notificationTime, controller)));
}
- public LockedApplication withJobTriggering(JobType type, Optional<Change> change, Instant triggerTime,
+ public LockedApplication withJobTriggering(JobType type, Change change, Instant triggerTime,
Version version, ApplicationVersion applicationVersion,
String reason) {
return new LockedApplication(new Builder(this).with(deploymentJobs().withTriggering(type, change, version, applicationVersion, reason, triggerTime)));
@@ -119,7 +119,7 @@ public class LockedApplication extends Application {
return new LockedApplication(new Builder(this).with(validationOverrides));
}
- public LockedApplication withDeploying(Optional<Change> deploying) {
+ public LockedApplication withDeploying(Change deploying) {
return new LockedApplication(new Builder(this).withDeploying(deploying));
}
@@ -166,7 +166,7 @@ public class LockedApplication extends Application {
private ValidationOverrides validationOverrides;
private Map<ZoneId, Deployment> deployments;
private DeploymentJobs deploymentJobs;
- private Optional<Change> deploying;
+ private Change deploying;
private boolean hasOutstandingChange;
private Optional<IssueId> ownershipIssueId;
private ApplicationMetrics metrics;
@@ -205,7 +205,7 @@ public class LockedApplication extends Application {
return this;
}
- private Builder withDeploying(Optional<Change> deploying) {
+ private Builder withDeploying(Change deploying) {
this.deploying = deploying;
return this;
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java
index f8c7319fabc..dd7c238053c 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java
@@ -17,7 +17,7 @@ import java.util.stream.Stream;
/**
* A list of applications which can be filtered in various ways.
- *
+ *
* @author bratseth
*/
public class ApplicationList {
@@ -27,9 +27,9 @@ public class ApplicationList {
private ApplicationList(Iterable<Application> applications) {
this.list = ImmutableList.copyOf(applications);
}
-
+
// ----------------------------------- Factories
-
+
public static ApplicationList from(Iterable<Application> applications) {
return new ApplicationList(applications);
}
@@ -67,7 +67,7 @@ public class ApplicationList {
return listOf(list.stream().filter(application -> ! isUpgradingTo(version, application)));
}
- /**
+ /**
* Returns the subset of applications which are currently not upgrading to the given version,
* or returns all if no version is specified
*/
@@ -125,7 +125,7 @@ public class ApplicationList {
public ApplicationList without(UpgradePolicy policy) {
return listOf(list.stream().filter(a -> a.deploymentSpec().upgradePolicy() != policy));
}
-
+
/** Returns the subset of applications which have at least one deployment on a lower version than the given one */
public ApplicationList onLowerVersionThan(Version version) {
return listOf(list.stream()
@@ -134,7 +134,7 @@ public class ApplicationList {
}
/**
- * Returns the subset of applications which are not pull requests:
+ * Returns the subset of applications which are not pull requests:
* Pull requests changes the application instance name to (default-pr)?[pull-request-number]
*/
public ApplicationList notPullRequest() {
@@ -172,14 +172,14 @@ public class ApplicationList {
private static boolean isUpgrading(Application application) {
if ( ! (application.deploying().isPresent()) ) return false;
- if ( ! (application.deploying().get() instanceof Change.VersionChange) ) return false;
+ if ( ! (application.deploying() instanceof Change.VersionChange) ) return false;
return true;
}
private static boolean isUpgradingTo(Version version, Application application) {
if ( ! (application.deploying().isPresent()) ) return false;
- if ( ! (application.deploying().get() instanceof Change.VersionChange) ) return false;
- return ((Change.VersionChange)application.deploying().get()).version().equals(version);
+ if ( ! (application.deploying() instanceof Change.VersionChange) ) return false;
+ return ((Change.VersionChange)application.deploying()).version().equals(version);
}
private static boolean failingOn(Version version, Application application) {
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Change.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Change.java
index aeed510fa7e..5e3952f5ad7 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Change.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Change.java
@@ -14,9 +14,29 @@ import java.util.Objects;
*/
public abstract class Change {
+ private static NoChange none = new NoChange();
+
/** Returns true if this change is blocked by the given spec at the given instant */
public abstract boolean blockedBy(DeploymentSpec deploymentSpec, Instant instant);
+ public abstract boolean isPresent();
+
+ public static Change empty() { return none; }
+
+ public static class NoChange extends Change {
+
+ private NoChange() { }
+
+ @Override
+ public boolean isPresent() { return false; }
+
+ @Override
+ public boolean blockedBy(DeploymentSpec deploymentSpec, Instant instant) {
+ return false;
+ }
+
+ }
+
/** A change to the application package version of an application */
public static class ApplicationChange extends Change {
@@ -27,6 +47,9 @@ public abstract class Change {
this.version = version;
}
+ @Override
+ public boolean isPresent() { return true; }
+
/** The application package version in this change, or empty if not known yet */
public ApplicationVersion version() { return version; }
@@ -76,6 +99,9 @@ public abstract class Change {
this.version = version;
}
+ @Override
+ public boolean isPresent() { return true; }
+
/** The Vespa version this changes to */
public Version version() { return version; }
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 677f7809c33..542343d66c0 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
@@ -65,7 +65,7 @@ public class DeploymentJobs {
}
public DeploymentJobs withTriggering(JobType jobType,
- Optional<Change> change,
+ Change change,
Version version,
ApplicationVersion applicationVersion,
String reason,
@@ -75,7 +75,7 @@ public class DeploymentJobs {
if (job == null) job = JobStatus.initial(jobType);
return job.withTriggering(version,
applicationVersion,
- change.isPresent() && change.get() instanceof Change.VersionChange,
+ change instanceof Change.VersionChange,
reason,
triggerTime);
});
@@ -117,14 +117,14 @@ public class DeploymentJobs {
}
/** Returns whether change can be deployed to the given environment */
- public boolean isDeployableTo(Environment environment, Optional<Change> change) {
+ public boolean isDeployableTo(Environment environment, Change change) {
if (environment == null || ! change.isPresent()) {
return true;
}
if (environment == Environment.staging) {
- return isSuccessful(change.get(), JobType.systemTest);
+ return isSuccessful(change, JobType.systemTest);
} else if (environment == Environment.prod) {
- return isSuccessful(change.get(), JobType.stagingTest);
+ return isSuccessful(change, JobType.stagingTest);
}
return true; // other environments do not have any preconditions
}
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 f02b46fdbb1..18838f243ad 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
@@ -87,8 +87,7 @@ public class DeploymentTrigger {
if (report.jobType() == JobType.component) {
if (acceptNewApplicationVersionNow(application)) {
// Set this as the change we are doing, unless we are already pushing a platform change
- if ( ! ( application.deploying().isPresent() &&
- application.deploying().get() instanceof Change.VersionChange)) {
+ if ( ! ( application.deploying() instanceof Change.VersionChange)) {
Change.ApplicationChange applicationChange = Change.ApplicationChange.unknown();
// TODO: Remove guard when source is always reported by component
if (report.sourceRevision().isPresent()) {
@@ -97,7 +96,7 @@ public class DeploymentTrigger {
report.buildNumber())
);
}
- application = application.withDeploying(Optional.of(applicationChange));
+ application = application.withDeploying(applicationChange);
}
}
else { // postpone
@@ -107,7 +106,7 @@ public class DeploymentTrigger {
}
else if (deploymentComplete(application)) {
// change completed
- application = application.withDeploying(Optional.empty());
+ application = application.withDeploying(Change.empty());
}
}
@@ -129,7 +128,7 @@ public class DeploymentTrigger {
/** Returns whether all production zones listed in deployment spec has this change (or a newer version, if upgrade) */
private boolean deploymentComplete(LockedApplication application) {
if ( ! application.deploying().isPresent()) return true;
- Change change = application.deploying().get();
+ Change change = application.deploying();
for (JobType job : order.jobsFrom(application.deploymentSpec())) {
if ( ! job.isProduction()) continue;
@@ -173,8 +172,8 @@ public class DeploymentTrigger {
// Should the first step be triggered?
if ( ! jobs.isEmpty() && jobs.get(0).equals(JobType.systemTest) ) {
JobStatus systemTestStatus = application.deploymentJobs().jobStatus().get(JobType.systemTest);
- if (application.deploying().get() instanceof Change.VersionChange) {
- Version target = ((Change.VersionChange) application.deploying().get()).version();
+ if (application.deploying() instanceof Change.VersionChange) {
+ Version target = ((Change.VersionChange) application.deploying()).version();
if (systemTestStatus == null
|| ! systemTestStatus.lastTriggered().isPresent()
|| ! systemTestStatus.isSuccess()
@@ -220,7 +219,7 @@ public class DeploymentTrigger {
if ( ! application.deploying().isPresent()) return false;
if (next == null) return true;
- Change change = application.deploying().get();
+ Change change = application.deploying();
if (change instanceof Change.VersionChange) { // Propagate upgrade while making sure we never downgrade
Version targetVersion = ((Change.VersionChange)change).version();
@@ -270,8 +269,8 @@ public class DeploymentTrigger {
applications().lockOrThrow(applicationId, application -> {
if (application.deploying().isPresent() && ! application.deploymentJobs().hasFailures())
throw new IllegalArgumentException("Could not start " + change + " on " + application + ": " +
- application.deploying().get() + " is already in progress");
- application = application.withDeploying(Optional.of(change));
+ application.deploying() + " is already in progress");
+ application = application.withDeploying(change);
if (change instanceof Change.ApplicationChange)
application = application.withOutstandingChange(false);
application = trigger(JobType.systemTest, application, false,
@@ -288,7 +287,7 @@ public class DeploymentTrigger {
public void cancelChange(ApplicationId applicationId) {
applications().lockOrThrow(applicationId, application -> {
buildSystem.removeJobs(application.id());
- applications().store(application.withDeploying(Optional.empty()));
+ applications().store(application.withDeploying(Change.empty()));
});
}
@@ -360,7 +359,7 @@ public class DeploymentTrigger {
if ( ! force && ! allowedTriggering(jobType, application)) return application;
log.info(String.format("Triggering %s for %s, %s: %s", jobType, application,
- application.deploying().map(d -> "deploying " + d).orElse("restarted deployment"),
+ application.deploying().isPresent() ? "deploying " + application.deploying() : "restarted deployment",
reason));
buildSystem.addJob(application.id(), jobType, first);
return application.withJobTriggering(jobType,
@@ -379,11 +378,11 @@ public class DeploymentTrigger {
// fix to a version upgrade, so not doing it now
if (jobType.isProduction() && application.deploying().isPresent() &&
- application.deploying().get().blockedBy(application.deploymentSpec(), clock.instant())) return false;
+ application.deploying().blockedBy(application.deploymentSpec(), clock.instant())) return false;
// Don't downgrade or redeploy the same version in production needlessly
- if (application.deploying().isPresent() && application.deploying().get() instanceof VersionChange &&
- jobType.isProduction() && alreadyDeployed(((VersionChange) application.deploying().get()).version(), application, jobType)) return false;
+ if (application.deploying() instanceof VersionChange &&
+ jobType.isProduction() && alreadyDeployed(((VersionChange) application.deploying()).version(), application, jobType)) return false;
if (application.deploymentJobs().isRunning(jobType, jobTimeoutLimit())) return false;
if ( ! hasJob(jobType, application)) return false;
@@ -419,7 +418,7 @@ public class DeploymentTrigger {
private boolean acceptNewApplicationVersionNow(LockedApplication application) {
if ( ! application.deploying().isPresent()) return true;
- if (application.deploying().get() instanceof Change.ApplicationChange) return true; // more changes are ok
+ if (application.deploying() instanceof Change.ApplicationChange) return true; // more changes are ok
if (application.deploymentJobs().hasFailures()) return true; // allow changes to fix upgrade problems
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 0747d24a80a..b626fda5be1 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
@@ -243,14 +243,14 @@ public class ApplicationSerializer {
object.setLong(atField, jobRun.get().at().toEpochMilli());
}
- private void toSlime(Optional<Change> deploying, Cursor parentObject) {
+ private void toSlime(Change deploying, Cursor parentObject) {
if ( ! deploying.isPresent()) return;
Cursor object = parentObject.setObject(deployingField);
- if (deploying.get() instanceof Change.VersionChange)
- object.setString(versionField, ((Change.VersionChange)deploying.get()).version().toString());
- else if (((Change.ApplicationChange)deploying.get()).version() != ApplicationVersion.unknown)
- toSlime(((Change.ApplicationChange)deploying.get()).version(), object);
+ if (deploying instanceof Change.VersionChange)
+ object.setString(versionField, ((Change.VersionChange)deploying).version().toString());
+ else if (((Change.ApplicationChange)deploying).version() != ApplicationVersion.unknown)
+ toSlime(((Change.ApplicationChange)deploying).version(), object);
}
// ------------------ Deserialization
@@ -263,7 +263,7 @@ public class ApplicationSerializer {
ValidationOverrides validationOverrides = ValidationOverrides.fromXml(root.field(validationOverridesField).asString());
List<Deployment> deployments = deploymentsFromSlime(root.field(deploymentsField));
DeploymentJobs deploymentJobs = deploymentJobsFromSlime(root.field(deploymentJobsField));
- Optional<Change> deploying = changeFromSlime(root.field(deployingField));
+ Change deploying = changeFromSlime(root.field(deployingField));
boolean outstandingChange = root.field(outstandingChangeField).asBool();
Optional<IssueId> ownershipIssueId = optionalString(root.field(ownershipIssueIdField)).map(IssueId::from);
ApplicationMetrics metrics = new ApplicationMetrics(root.field(queryQualityField).asDouble(),
@@ -363,15 +363,15 @@ public class ApplicationSerializer {
return new DeploymentJobs(projectId, jobStatusList, issueId);
}
- private Optional<Change> changeFromSlime(Inspector object) {
- if ( ! object.valid()) return Optional.empty();
+ private Change changeFromSlime(Inspector object) {
+ if ( ! object.valid()) return Change.empty();
Inspector versionFieldValue = object.field(versionField);
if (versionFieldValue.valid())
- return Optional.of(new Change.VersionChange(Version.fromString(versionFieldValue.asString())));
+ return new Change.VersionChange(Version.fromString(versionFieldValue.asString()));
else if (object.field(applicationPackageHashField).valid())
- return Optional.of(Change.ApplicationChange.of(applicationVersionFromSlime(object)));
+ return Change.ApplicationChange.of(applicationVersionFromSlime(object));
else
- return Optional.of(Change.ApplicationChange.unknown());
+ return Change.ApplicationChange.unknown();
}
private List<JobStatus> jobStatusListFromSlime(Inspector array) {
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
index 5afd89846b6..00f1fe3790c 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
@@ -350,10 +350,10 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
// Currently deploying change
if (application.deploying().isPresent()) {
Cursor deployingObject = object.setObject("deploying");
- if (application.deploying().get() instanceof Change.VersionChange)
- deployingObject.setString("version", ((Change.VersionChange)application.deploying().get()).version().toString());
- else if (((Change.ApplicationChange)application.deploying().get()).version() != ApplicationVersion.unknown)
- toSlime(((Change.ApplicationChange)application.deploying().get()).version(), deployingObject.setObject("revision"));
+ if (application.deploying() instanceof Change.VersionChange)
+ deployingObject.setString("version", ((Change.VersionChange)application.deploying()).version().toString());
+ else if (((Change.ApplicationChange)application.deploying()).version() != ApplicationVersion.unknown)
+ toSlime(((Change.ApplicationChange)application.deploying()).version(), deployingObject.setObject("revision"));
}
// Jobs sorted according to deployment spec
@@ -713,7 +713,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
controller.applications().lockOrThrow(id, application -> {
if (application.deploying().isPresent())
throw new IllegalArgumentException("Can not start a deployment of " + application + " at this time: " +
- application.deploying().get() + " is in progress");
+ application.deploying() + " is in progress");
controller.applications().deploymentTrigger().triggerChange(application.id(), new Change.VersionChange(version));
});
@@ -724,14 +724,14 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
private HttpResponse cancelDeploy(String tenantName, String applicationName) {
ApplicationId id = ApplicationId.from(tenantName, applicationName, "default");
Application application = controller.applications().require(id);
- Optional<Change> change = application.deploying();
+ Change change = application.deploying();
if ( ! change.isPresent())
return new MessageResponse("No deployment in progress for " + application + " at this time");
controller.applications().lockOrThrow(id, lockedApplication ->
controller.applications().deploymentTrigger().cancelChange(id));
- return new MessageResponse("Cancelled " + change.get() + " for " + application);
+ return new MessageResponse("Cancelled " + change + " for " + application);
}
/** Schedule restart of deployment, or specific host in a deployment */
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 063ccc79fe5..3b4c3dda191 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
@@ -103,12 +103,12 @@ public class ControllerTest {
tester.notifyJobCompletion(component, app1, true);
assertEquals("Application version is currently not known",
ApplicationVersion.unknown,
- ((Change.ApplicationChange)tester.controller().applications().require(app1.id()).deploying().get()).version());
+ ((Change.ApplicationChange)tester.controller().applications().require(app1.id()).deploying()).version());
tester.deployAndNotify(app1, applicationPackage, true, systemTest);
tester.deployAndNotify(app1, applicationPackage, true, stagingTest);
assertEquals(4, applications.require(app1.id()).deploymentJobs().jobStatus().size());
- ApplicationVersion applicationVersion = ((Change.ApplicationChange)tester.controller().applications().require(app1.id()).deploying().get()).version();
+ ApplicationVersion applicationVersion = ((Change.ApplicationChange)tester.controller().applications().require(app1.id()).deploying()).version();
assertTrue("Application version has been set during deployment", applicationVersion != ApplicationVersion.unknown);
assertStatus(JobStatus.initial(stagingTest)
.withTriggering(version1, applicationVersion, false, "", tester.clock().instant().minus(Duration.ofMillis(1)))
@@ -223,8 +223,7 @@ public class ControllerTest {
ApplicationVersion expectedVersion = ApplicationVersion.from(source, 37);
assertEquals(expectedVersionString, ((Change.ApplicationChange) tester.controller().applications()
.require(app1.id())
- .deploying()
- .get()).version().id());
+ .deploying()).version().id());
// Deploy without application package
tester.deployAndNotify(app1, true, systemTest);
@@ -670,7 +669,7 @@ public class ControllerTest {
Application app = tester.createApplication(tenant, "app1", "default", 1);
tester.controller().applications().lockOrThrow(app.id(), application -> {
- application = application.withDeploying(Optional.of(new Change.VersionChange(Version.fromString("6.3"))));
+ application = application.withDeploying(new Change.VersionChange(Version.fromString("6.3")));
applications.store(application);
try {
tester.deploy(app, ZoneId.from("prod", "us-east-3"));
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 8de32b4b531..247ec83aff2 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
@@ -18,8 +18,8 @@ import com.yahoo.vespa.hosted.controller.application.Change;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs.JobType;
import com.yahoo.vespa.hosted.controller.application.SourceRevision;
-import com.yahoo.vespa.hosted.controller.maintenance.ReadyJobsTrigger;
import com.yahoo.vespa.hosted.controller.maintenance.JobControl;
+import com.yahoo.vespa.hosted.controller.maintenance.ReadyJobsTrigger;
import com.yahoo.vespa.hosted.controller.maintenance.Upgrader;
import com.yahoo.vespa.hosted.controller.versions.VersionStatus;
@@ -95,9 +95,9 @@ public class DeploymentTester {
}
public Optional<Change.VersionChange> versionChange(ApplicationId application) {
- return application(application).deploying()
- .filter(c -> c instanceof Change.VersionChange)
- .map(Change.VersionChange.class::cast);
+ Change change = application(application).deploying();
+ if (change instanceof Change.VersionChange) return Optional.of((Change.VersionChange)change);
+ return Optional.empty();
}
public void updateVersionStatus() {
@@ -226,7 +226,7 @@ public class DeploymentTester {
public void completeUpgrade(Application application, Version version, ApplicationPackage applicationPackage) {
assertTrue(application + " has a deployment", applications().require(application.id()).deploying().isPresent());
- assertEquals(new Change.VersionChange(version), applications().require(application.id()).deploying().get());
+ assertEquals(new Change.VersionChange(version), applications().require(application.id()).deploying());
completeDeployment(application, applicationPackage, Optional.empty(), true);
}
@@ -240,7 +240,7 @@ public class DeploymentTester {
private void completeUpgradeWithError(Application application, Version version, ApplicationPackage applicationPackage, Optional<JobType> failOnJob) {
assertTrue(applications().require(application.id()).deploying().isPresent());
- assertEquals(new Change.VersionChange(version), applications().require(application.id()).deploying().get());
+ assertEquals(new Change.VersionChange(version), applications().require(application.id()).deploying());
completeDeployment(application, applicationPackage, failOnJob, true);
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java
index 74d03240ec3..4bc64a8f213 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java
@@ -13,13 +13,12 @@ import com.yahoo.vespa.hosted.controller.application.ApplicationPackage;
import com.yahoo.vespa.hosted.controller.application.Change;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs.JobType;
-import com.yahoo.vespa.hosted.controller.maintenance.ReadyJobsTrigger;
import com.yahoo.vespa.hosted.controller.maintenance.JobControl;
+import com.yahoo.vespa.hosted.controller.maintenance.ReadyJobsTrigger;
import org.junit.Test;
import java.time.Duration;
import java.time.Instant;
-import java.util.Optional;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -321,7 +320,7 @@ public class DeploymentTriggerTest {
new JobControl(tester.controllerTester().curator()));
LockedApplication app = (LockedApplication)tester.createAndDeploy("default0", 3, "default");
// Store that we are upgrading but don't start the system-tests job
- tester.controller().applications().store(app.withDeploying(Optional.of(new Change.VersionChange(Version.fromString("6.2")))));
+ tester.controller().applications().store(app.withDeploying(new Change.VersionChange(Version.fromString("6.2"))));
assertEquals(0, tester.buildSystem().jobs().size());
readyJobsTrigger.run();
assertEquals(1, tester.buildSystem().jobs().size());
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 13636122cfd..d904e1f87c0 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
@@ -20,28 +20,28 @@ import static org.junit.Assert.assertTrue;
* @author bratseth
*/
public class OutstandingChangeDeployerTest {
-
+
@Test
public void testChangeDeployer() {
DeploymentTester tester = new DeploymentTester();
tester.configServer().setDefaultVersion(new Version(6, 1));
- OutstandingChangeDeployer deployer = new OutstandingChangeDeployer(tester.controller(), Duration.ofMinutes(10),
+ OutstandingChangeDeployer deployer = new OutstandingChangeDeployer(tester.controller(), Duration.ofMinutes(10),
new JobControl(new MockCuratorDb()));
tester.createAndDeploy("app1", 11, "default");
tester.createAndDeploy("app2", 22, "default");
Version version = new Version(6, 2);
tester.deploymentTrigger().triggerChange(tester.application("app1").id(), new Change.VersionChange(version));
-
- assertEquals(new Change.VersionChange(version), tester.application("app1").deploying().get());
+
+ assertEquals(new Change.VersionChange(version), tester.application("app1").deploying());
assertFalse(tester.application("app1").hasOutstandingChange());
tester.notifyJobCompletion(DeploymentJobs.JobType.component, tester.application("app1"), true);
assertTrue(tester.application("app1").hasOutstandingChange());
assertEquals(1, tester.buildSystem().jobs().size());
-
+
deployer.maintain();
assertEquals("No effect as job is in progress", 1, tester.buildSystem().jobs().size());
-
+
tester.deployCompletely("app1");
assertEquals("Upgrade done", 0, tester.buildSystem().jobs().size());
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java
index fd13b99f25e..63043d39b55 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java
@@ -174,11 +174,11 @@ public class UpgraderTest {
assertEquals(VespaVersion.Confidence.normal, tester.controller().versionStatus().systemVersion().get().confidence());
tester.upgrader().maintain();
assertEquals("Upgrade of defaults are scheduled", 5, tester.buildSystem().jobs().size());
- assertEquals(version54, ((Change.VersionChange)tester.application(default0.id()).deploying().get()).version());
- assertEquals(version54, ((Change.VersionChange)tester.application(default1.id()).deploying().get()).version());
- assertEquals(version54, ((Change.VersionChange)tester.application(default2.id()).deploying().get()).version());
- assertEquals(version54, ((Change.VersionChange)tester.application(default3.id()).deploying().get()).version());
- assertEquals(version54, ((Change.VersionChange)tester.application(default4.id()).deploying().get()).version());
+ assertEquals(version54, ((Change.VersionChange)tester.application(default0.id()).deploying()).version());
+ assertEquals(version54, ((Change.VersionChange)tester.application(default1.id()).deploying()).version());
+ assertEquals(version54, ((Change.VersionChange)tester.application(default2.id()).deploying()).version());
+ assertEquals(version54, ((Change.VersionChange)tester.application(default3.id()).deploying()).version());
+ assertEquals(version54, ((Change.VersionChange)tester.application(default4.id()).deploying()).version());
tester.completeUpgrade(default0, version54, "default");
// State: Default applications started upgrading to 5.4 (and one completed)
Version version55 = Version.fromString("5.5");
@@ -190,11 +190,11 @@ public class UpgraderTest {
assertEquals(VespaVersion.Confidence.normal, tester.controller().versionStatus().systemVersion().get().confidence());
tester.upgrader().maintain();
assertEquals("Upgrade of defaults are scheduled", 5, tester.buildSystem().jobs().size());
- assertEquals(version55, ((Change.VersionChange)tester.application(default0.id()).deploying().get()).version());
- assertEquals(version54, ((Change.VersionChange)tester.application(default1.id()).deploying().get()).version());
- assertEquals(version54, ((Change.VersionChange)tester.application(default2.id()).deploying().get()).version());
- assertEquals(version54, ((Change.VersionChange)tester.application(default3.id()).deploying().get()).version());
- assertEquals(version54, ((Change.VersionChange)tester.application(default4.id()).deploying().get()).version());
+ assertEquals(version55, ((Change.VersionChange)tester.application(default0.id()).deploying()).version());
+ assertEquals(version54, ((Change.VersionChange)tester.application(default1.id()).deploying()).version());
+ assertEquals(version54, ((Change.VersionChange)tester.application(default2.id()).deploying()).version());
+ assertEquals(version54, ((Change.VersionChange)tester.application(default3.id()).deploying()).version());
+ assertEquals(version54, ((Change.VersionChange)tester.application(default4.id()).deploying()).version());
tester.completeUpgrade(default1, version54, "default");
tester.completeUpgrade(default2, version54, "default");
tester.completeUpgradeWithError(default3, version54, "default", DeploymentJobs.JobType.stagingTest);
@@ -216,7 +216,7 @@ public class UpgraderTest {
assertEquals("Upgrade of defaults are scheduled on 5.4 instead, since 5.5 broken: " +
"This is default3 since it failed upgrade on both 5.4 and 5.5",
1, tester.buildSystem().jobs().size());
- assertEquals("5.4", ((Change.VersionChange)tester.application(default3.id()).deploying().get()).version().toString());
+ assertEquals("5.4", ((Change.VersionChange)tester.application(default3.id()).deploying()).version().toString());
}
@Test
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 1e00ecc2107..f674e7be02e 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
@@ -82,7 +82,7 @@ public class ApplicationSerializerTest {
deploymentSpec,
validationOverrides,
deployments, deploymentJobs,
- Optional.of(new Change.VersionChange(Version.fromString("6.7"))),
+ new Change.VersionChange(Version.fromString("6.7")),
true,
Optional.of(IssueId.from("1234")),
new MetricsService.ApplicationMetrics(0.5, 0.9),
@@ -145,22 +145,20 @@ public class ApplicationSerializerTest {
assertEquals(6, serialized.deployments().get(zone2).metrics().writeLatencyMillis(), Double.MIN_VALUE);
{ // test more deployment serialization cases
- Application original2 = writable(original).withDeploying(Optional.of(Change.ApplicationChange.of(ApplicationVersion
- .from("hash1"))));
+ Application original2 = writable(original).withDeploying(Change.ApplicationChange.of(ApplicationVersion.from("hash1")));
Application serialized2 = applicationSerializer.fromSlime(applicationSerializer.toSlime(original2));
assertEquals(original2.deploying(), serialized2.deploying());
- assertEquals(((Change.ApplicationChange)serialized2.deploying().get()).version().source(),
- ((Change.ApplicationChange)original2.deploying().get()).version().source());
+ assertEquals(((Change.ApplicationChange)serialized2.deploying()).version().source(),
+ ((Change.ApplicationChange)original2.deploying()).version().source());
- Application original3 = writable(original).withDeploying(Optional.of(Change.ApplicationChange.of(ApplicationVersion
- .from("hash1",
- new SourceRevision("a", "b", "c")))));
+ Application original3 = writable(original).withDeploying(Change.ApplicationChange.of(ApplicationVersion.from("hash1",
+ new SourceRevision("a", "b", "c"))));
Application serialized3 = applicationSerializer.fromSlime(applicationSerializer.toSlime(original3));
assertEquals(original3.deploying(), serialized2.deploying());
- assertEquals(((Change.ApplicationChange)serialized3.deploying().get()).version().source(),
- ((Change.ApplicationChange)original3.deploying().get()).version().source());
+ assertEquals(((Change.ApplicationChange)serialized3.deploying()).version().source(),
+ ((Change.ApplicationChange)original3.deploying()).version().source());
- Application original4 = writable(original).withDeploying(Optional.empty());
+ Application original4 = writable(original).withDeploying(Change.empty());
Application serialized4 = applicationSerializer.fromSlime(applicationSerializer.toSlime(original4));
assertEquals(original4.deploying(), serialized4.deploying());
}