diff options
author | Jon Marius Venstad <jvenstad@yahoo-inc.com> | 2019-01-08 12:33:39 +0100 |
---|---|---|
committer | Jon Marius Venstad <jvenstad@yahoo-inc.com> | 2019-01-08 12:33:39 +0100 |
commit | 3222d0f3b289fe63c80ec092384231a2b9b2f7dd (patch) | |
tree | ba13baf5b5bf12eb9f4040a7f797769a70d20466 | |
parent | 4a6795ff0520cad6fb5d3320042a4111d721bab6 (diff) |
Add isPinning to Change
3 files changed, 32 insertions, 12 deletions
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 ab16f84f628..02ae9829b65 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 @@ -20,7 +20,7 @@ import java.util.StringJoiner; */ public final class Change { - private static final Change empty = new Change(Optional.empty(), Optional.empty()); + private static final Change empty = new Change(Optional.empty(), Optional.empty(), false); /** The platform version we are upgrading to, or empty if none */ private final Optional<Version> platform; @@ -28,7 +28,9 @@ public final class Change { /** The application version we are changing to, or empty if none */ private final Optional<ApplicationVersion> application; - private Change(Optional<Version> platform, Optional<ApplicationVersion> application) { + private final boolean pinning; + + private Change(Optional<Version> platform, Optional<ApplicationVersion> application, boolean pinning) { Objects.requireNonNull(platform, "platform cannot be null"); Objects.requireNonNull(application, "application cannot be null"); if (application.isPresent() && application.get().isUnknown()) { @@ -36,14 +38,15 @@ public final class Change { } this.platform = platform; this.application = application; + this.pinning = pinning; } public Change withoutPlatform() { - return new Change(Optional.empty(), application); + return new Change(Optional.empty(), application, pinning); } public Change withoutApplication() { - return new Change(platform, Optional.empty()); + return new Change(platform, Optional.empty(), pinning); } /** Returns whether a change should currently be deployed */ @@ -57,17 +60,29 @@ public final class Change { /** Returns the application version carried by this. */ public Optional<ApplicationVersion> application() { return application; } + public boolean isPinning() { return pinning; } + /** Returns an instance representing no change */ public static Change empty() { return empty; } /** Returns a version of this change which replaces or adds this platform change */ public Change with(Version platformVersion) { - return new Change(Optional.of(platformVersion), application); + return new Change(Optional.of(platformVersion), application, pinning); } /** Returns a version of this change which replaces or adds this application change */ public Change with(ApplicationVersion applicationVersion) { - return new Change(platform, Optional.of(applicationVersion)); + return new Change(platform, Optional.of(applicationVersion), pinning); + } + + /** Returns a change with the versions of this, and with the platform version pinned. */ + public Change withPin() { + return new Change(platform, application, true); + } + + /** Returns a change with the versions of this, and with the platform version unpinned. */ + public Change withoutPin() { + return new Change(platform, application, false); } /** Returns the change obtained when overwriting elements of the given change with any present in this */ @@ -76,6 +91,8 @@ public final class Change { other = other.with(platform.get()); if (application.isPresent()) other = other.with(application.get()); + if (pinning) + other = other.withPin(); return other; } @@ -102,11 +119,11 @@ public final class Change { } public static Change of(ApplicationVersion applicationVersion) { - return new Change(Optional.empty(), Optional.of(applicationVersion)); + return new Change(Optional.empty(), Optional.of(applicationVersion), false); } public static Change of(Version platformChange) { - return new Change(Optional.of(platformChange), Optional.empty()); + return new Change(Optional.of(platformChange), Optional.empty(), false); } /** Returns whether this change carries an application downgrade relative to the given version. */ 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 f4d87d7c967..e7c111e2e3d 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 @@ -60,6 +60,7 @@ public class ApplicationSerializer { private final String deploymentsField = "deployments"; private final String deploymentJobsField = "deploymentJobs"; private final String deployingField = "deployingField"; + private final String pinnedField = "pinned"; private final String outstandingChangeField = "outstandingChangeField"; private final String ownershipIssueIdField = "ownershipIssueId"; private final String ownerField = "confirmedOwner"; @@ -275,13 +276,15 @@ public class ApplicationSerializer { } private void toSlime(Change deploying, Cursor parentObject, String fieldName) { - if ( ! deploying.isPresent()) return; + if ( ! deploying.isPresent() && ! deploying.isPinning()) return; Cursor object = parentObject.setObject(fieldName); if (deploying.platform().isPresent()) object.setString(versionField, deploying.platform().get().toString()); if (deploying.application().isPresent()) toSlime(deploying.application().get(), object); + if (deploying.isPinning()) + object.setBool(pinnedField, true); } private void toSlime(Map<HostName, RotationStatus> rotationStatus, Cursor array) { @@ -435,8 +438,8 @@ public class ApplicationSerializer { change = Change.of(Version.fromString(versionFieldValue.asString())); if (object.field(applicationBuildNumberField).valid()) change = change.with(applicationVersionFromSlime(object)); - if ( ! change.isPresent()) // A deploy object with no fields -> unknown application change - change = Change.empty(); + if (object.field(pinnedField).asBool()) + change = change.withPin(); return change; } 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 7dff2667b9f..774caea97b0 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 @@ -104,7 +104,7 @@ public class ApplicationSerializerTest { deploymentSpec, validationOverrides, deployments, deploymentJobs, - Change.of(Version.fromString("6.7")), + Change.of(Version.fromString("6.7")).withPin(), Change.of(ApplicationVersion.from(new SourceRevision("repo", "master", "deadcafe"), 42)), Optional.of(IssueId.from("1234")), Optional.of(User.from("by-username")), |