diff options
author | jonmv <venstad@gmail.com> | 2023-04-14 11:25:36 +0200 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2023-04-18 09:40:20 +0200 |
commit | 502af733292edefc97219b83a02837d05b6996a9 (patch) | |
tree | b9ce2b66ab4fbf1ec6078f9c6006ede7e4ca2e62 /controller-server/src/main/java/com/yahoo | |
parent | 67c04e60c1a01d56702e13d23813ca3d43ee2158 (diff) |
Add revision pin to Change
Diffstat (limited to 'controller-server/src/main/java/com/yahoo')
2 files changed, 45 insertions, 16 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 d0edbfa54a3..5ebb3d53529 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 @@ -22,7 +22,7 @@ import static java.util.Objects.requireNonNull; */ public final class Change { - private static final Change empty = new Change(Optional.empty(), Optional.empty(), false); + private static final Change empty = new Change(Optional.empty(), Optional.empty(), false, false); /** The platform version we are upgrading to, or empty if none */ private final Optional<Version> platform; @@ -33,21 +33,25 @@ public final class Change { /** Whether this change is a pin to its contained Vespa version, or to the application's current. */ private final boolean platformPinned; - private Change(Optional<Version> platform, Optional<RevisionId> revision, boolean platformPinned) { + /** Whether this change is a pin to its contained application revision, or to the application's current. */ + private final boolean revisionPinned; + + private Change(Optional<Version> platform, Optional<RevisionId> revision, boolean platformPinned, boolean revisionPinned) { this.platform = requireNonNull(platform, "platform cannot be null"); this.revision = requireNonNull(revision, "revision cannot be null"); if (revision.isPresent() && ( ! revision.get().isProduction())) { throw new IllegalArgumentException("Application version to deploy must be a known version"); } this.platformPinned = platformPinned; + this.revisionPinned = revisionPinned; } public Change withoutPlatform() { - return new Change(Optional.empty(), revision, platformPinned); + return new Change(Optional.empty(), revision, platformPinned, revisionPinned); } public Change withoutApplication() { - return new Change(platform, Optional.empty(), platformPinned); + return new Change(platform, Optional.empty(), platformPinned, revisionPinned); } /** Returns whether a change should currently be deployed */ @@ -57,7 +61,7 @@ public final class Change { /** Returns whether this is the empty change. */ public boolean isEmpty() { - return ! hasTargets() && ! platformPinned; + return ! hasTargets() && ! platformPinned && ! revisionPinned; } /** Returns the platform version carried by this. */ @@ -68,6 +72,8 @@ public final class Change { public boolean isPlatformPinned() { return platformPinned; } + public boolean isRevisionPinned() { return revisionPinned; } + /** Returns an instance representing no change */ public static Change empty() { return empty; } @@ -76,22 +82,35 @@ public final class Change { if (platformPinned) throw new IllegalArgumentException("Not allowed to set a platform version when pinned."); - return new Change(Optional.of(platformVersion), revision, platformPinned); + return new Change(Optional.of(platformVersion), revision, platformPinned, revisionPinned); } /** Returns a version of this change which replaces or adds this revision change */ public Change with(RevisionId revision) { - return new Change(platform, Optional.of(revision), platformPinned); + if (revisionPinned) + throw new IllegalArgumentException("Not allowed to set a revision when pinned."); + + return new Change(platform, Optional.of(revision), platformPinned, revisionPinned); } /** Returns a change with the versions of this, and with the platform version pinned. */ public Change withPlatformPin() { - return new Change(platform, revision, true); + return new Change(platform, revision, true, revisionPinned); } /** Returns a change with the versions of this, and with the platform version unpinned. */ public Change withoutPlatformPin() { - return new Change(platform, revision, false); + return new Change(platform, revision, false, revisionPinned); + } + + /** Returns a change with the versions of this, and with the platform version pinned. */ + public Change withRevisionPin() { + return new Change(platform, revision, platformPinned, true); + } + + /** Returns a change with the versions of this, and with the platform version unpinned. */ + public Change withoutRevisionPin() { + return new Change(platform, revision, platformPinned, false); } /** Returns the change obtained when overwriting elements of the given change with any present in this */ @@ -99,6 +118,7 @@ public final class Change { if (platform.isPresent()) other = other.with(platform.get()); if (revision.isPresent()) other = other.with(revision.get()); if (platformPinned) other = other.withPlatformPin(); + if (revisionPinned) other = other.withRevisionPin(); return other; } @@ -108,13 +128,14 @@ public final class Change { if (!(o instanceof Change)) return false; Change change = (Change) o; return platformPinned == change.platformPinned && + revisionPinned == change.revisionPinned && Objects.equals(platform, change.platform) && Objects.equals(revision, change.revision); } @Override public int hashCode() { - return Objects.hash(platform, revision, platformPinned); + return Objects.hash(platform, revision, platformPinned, revisionPinned); } @Override @@ -124,17 +145,20 @@ public final class Change { changes.add("pin to " + platform.map(Version::toString).orElse("current platform")); else platform.ifPresent(version -> changes.add("upgrade to " + version)); - revision.ifPresent(revision -> changes.add("revision change to " + revision)); + if (revisionPinned) + changes.add("pin to " + revision.map(RevisionId::toString).orElse("current revision")); + else + revision.ifPresent(revision -> changes.add("revision change to " + revision)); changes.setEmptyValue("no change"); return changes.toString(); } public static Change of(RevisionId revision) { - return new Change(Optional.empty(), Optional.of(revision), false); + return new Change(Optional.empty(), Optional.of(revision), false, false); } public static Change of(Version platformChange) { - return new Change(Optional.of(platformChange), Optional.empty(), false); + return new Change(Optional.of(platformChange), Optional.empty(), false, false); } /** Returns whether this change carries a revision downgrade relative to the given revision. */ 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 ad30b7b60e6..e5006ab9785 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 @@ -82,7 +82,8 @@ public class ApplicationSerializer { private static final String versionsField = "versions"; private static final String prodVersionsField = "prodVersions"; private static final String devVersionsField = "devVersions"; - private static final String pinnedField = "pinned"; + private static final String platformPinnedField = "pinned"; + private static final String revisionPinnedField = "revisionPinned"; private static final String deploymentIssueField = "deploymentIssueId"; private static final String ownershipIssueIdField = "ownershipIssueId"; private static final String ownerField = "confirmedOwner"; @@ -298,7 +299,9 @@ public class ApplicationSerializer { if (deploying.revision().isPresent()) toSlime(deploying.revision().get(), object); if (deploying.isPlatformPinned()) - object.setBool(pinnedField, true); + object.setBool(platformPinnedField, true); + if (deploying.isRevisionPinned()) + object.setBool(revisionPinnedField, true); } private void toSlime(RotationStatus status, Cursor array) { @@ -523,8 +526,10 @@ public class ApplicationSerializer { change = Change.of(Version.fromString(versionFieldValue.asString())); if (object.field(applicationBuildNumberField).valid()) change = change.with(revisionFromSlime(object, null)); - if (object.field(pinnedField).asBool()) + if (object.field(platformPinnedField).asBool()) change = change.withPlatformPin(); + if (object.field(revisionPinnedField).asBool()) + change = change.withRevisionPin(); return change; } |