summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Marius Venstad <jvenstad@yahoo-inc.com>2019-01-08 12:33:39 +0100
committerJon Marius Venstad <jvenstad@yahoo-inc.com>2019-01-08 12:33:39 +0100
commit3222d0f3b289fe63c80ec092384231a2b9b2f7dd (patch)
treeba13baf5b5bf12eb9f4040a7f797769a70d20466
parent4a6795ff0520cad6fb5d3320042a4111d721bab6 (diff)
Add isPinning to Change
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Change.java33
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java9
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java2
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")),