diff options
author | Jon Bratseth <bratseth@oath.com> | 2018-01-26 14:03:17 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@oath.com> | 2018-01-26 14:03:17 +0100 |
commit | b0e92a15e902416d40909bc856a488eae12822d3 (patch) | |
tree | 302a16cc966d7b34cf369660505cae17d9a061e2 | |
parent | 010b7d16f28e1598c0205977973faab3594f6f9f (diff) |
Make Application.deploying mandatory
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()); } |