summaryrefslogtreecommitdiffstats
path: root/config-model-api
diff options
context:
space:
mode:
Diffstat (limited to 'config-model-api')
-rw-r--r--config-model-api/abi-spec.json58
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentInstanceSpec.java24
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java21
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java43
-rw-r--r--config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java27
5 files changed, 117 insertions, 56 deletions
diff --git a/config-model-api/abi-spec.json b/config-model-api/abi-spec.json
index aeb1d28b824..4635070fee8 100644
--- a/config-model-api/abi-spec.json
+++ b/config-model-api/abi-spec.json
@@ -194,10 +194,11 @@
"public"
],
"methods": [
- "public void <init>(com.yahoo.config.provision.InstanceName, java.util.List, com.yahoo.config.application.api.DeploymentSpec$UpgradePolicy, com.yahoo.config.application.api.DeploymentSpec$UpgradeRevision, com.yahoo.config.application.api.DeploymentSpec$UpgradeRollout, java.util.List, java.util.Optional, java.util.Optional, com.yahoo.config.application.api.Notifications, java.util.List, java.time.Instant)",
+ "public void <init>(com.yahoo.config.provision.InstanceName, java.util.List, com.yahoo.config.application.api.DeploymentSpec$UpgradePolicy, com.yahoo.config.application.api.DeploymentSpec$RevisionTarget, com.yahoo.config.application.api.DeploymentSpec$RevisionChange, com.yahoo.config.application.api.DeploymentSpec$UpgradeRollout, java.util.List, java.util.Optional, java.util.Optional, com.yahoo.config.application.api.Notifications, java.util.List, java.time.Instant)",
"public com.yahoo.config.provision.InstanceName name()",
"public com.yahoo.config.application.api.DeploymentSpec$UpgradePolicy upgradePolicy()",
- "public com.yahoo.config.application.api.DeploymentSpec$UpgradeRevision upgradeRevision()",
+ "public com.yahoo.config.application.api.DeploymentSpec$RevisionTarget revisionTarget()",
+ "public com.yahoo.config.application.api.DeploymentSpec$RevisionChange revisionChange()",
"public com.yahoo.config.application.api.DeploymentSpec$UpgradeRollout upgradeRollout()",
"public java.util.List changeBlocker()",
"public java.util.Optional globalServiceId()",
@@ -311,6 +312,41 @@
],
"fields": []
},
+ "com.yahoo.config.application.api.DeploymentSpec$RevisionChange": {
+ "superClass": "java.lang.Enum",
+ "interfaces": [],
+ "attributes": [
+ "public",
+ "final",
+ "enum"
+ ],
+ "methods": [
+ "public static com.yahoo.config.application.api.DeploymentSpec$RevisionChange[] values()",
+ "public static com.yahoo.config.application.api.DeploymentSpec$RevisionChange valueOf(java.lang.String)"
+ ],
+ "fields": [
+ "public static final enum com.yahoo.config.application.api.DeploymentSpec$RevisionChange whenClear",
+ "public static final enum com.yahoo.config.application.api.DeploymentSpec$RevisionChange whenFailing",
+ "public static final enum com.yahoo.config.application.api.DeploymentSpec$RevisionChange always"
+ ]
+ },
+ "com.yahoo.config.application.api.DeploymentSpec$RevisionTarget": {
+ "superClass": "java.lang.Enum",
+ "interfaces": [],
+ "attributes": [
+ "public",
+ "final",
+ "enum"
+ ],
+ "methods": [
+ "public static com.yahoo.config.application.api.DeploymentSpec$RevisionTarget[] values()",
+ "public static com.yahoo.config.application.api.DeploymentSpec$RevisionTarget valueOf(java.lang.String)"
+ ],
+ "fields": [
+ "public static final enum com.yahoo.config.application.api.DeploymentSpec$RevisionTarget next",
+ "public static final enum com.yahoo.config.application.api.DeploymentSpec$RevisionTarget latest"
+ ]
+ },
"com.yahoo.config.application.api.DeploymentSpec$Step": {
"superClass": "java.lang.Object",
"interfaces": [],
@@ -366,24 +402,6 @@
"public static final enum com.yahoo.config.application.api.DeploymentSpec$UpgradePolicy conservative"
]
},
- "com.yahoo.config.application.api.DeploymentSpec$UpgradeRevision": {
- "superClass": "java.lang.Enum",
- "interfaces": [],
- "attributes": [
- "public",
- "final",
- "enum"
- ],
- "methods": [
- "public static com.yahoo.config.application.api.DeploymentSpec$UpgradeRevision[] values()",
- "public static com.yahoo.config.application.api.DeploymentSpec$UpgradeRevision valueOf(java.lang.String)"
- ],
- "fields": [
- "public static final enum com.yahoo.config.application.api.DeploymentSpec$UpgradeRevision exclusive",
- "public static final enum com.yahoo.config.application.api.DeploymentSpec$UpgradeRevision separate",
- "public static final enum com.yahoo.config.application.api.DeploymentSpec$UpgradeRevision latest"
- ]
- },
"com.yahoo.config.application.api.DeploymentSpec$UpgradeRollout": {
"superClass": "java.lang.Enum",
"interfaces": [],
diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentInstanceSpec.java b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentInstanceSpec.java
index ea38860c29b..e701f3903cb 100644
--- a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentInstanceSpec.java
+++ b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentInstanceSpec.java
@@ -31,7 +31,8 @@ public class DeploymentInstanceSpec extends DeploymentSpec.Steps {
private final InstanceName name;
private final DeploymentSpec.UpgradePolicy upgradePolicy;
- private final DeploymentSpec.UpgradeRevision upgradeRevision;
+ private final DeploymentSpec.RevisionTarget revisionTarget;
+ private final DeploymentSpec.RevisionChange revisionChange;
private final DeploymentSpec.UpgradeRollout upgradeRollout;
private final List<DeploymentSpec.ChangeBlocker> changeBlockers;
private final Optional<String> globalServiceId;
@@ -42,7 +43,8 @@ public class DeploymentInstanceSpec extends DeploymentSpec.Steps {
public DeploymentInstanceSpec(InstanceName name,
List<DeploymentSpec.Step> steps,
DeploymentSpec.UpgradePolicy upgradePolicy,
- DeploymentSpec.UpgradeRevision upgradeRevision,
+ DeploymentSpec.RevisionTarget revisionTarget,
+ DeploymentSpec.RevisionChange revisionChange,
DeploymentSpec.UpgradeRollout upgradeRollout,
List<DeploymentSpec.ChangeBlocker> changeBlockers,
Optional<String> globalServiceId,
@@ -53,7 +55,8 @@ public class DeploymentInstanceSpec extends DeploymentSpec.Steps {
super(steps);
this.name = name;
this.upgradePolicy = upgradePolicy;
- this.upgradeRevision = upgradeRevision;
+ this.revisionTarget = revisionTarget;
+ this.revisionChange = revisionChange;
this.upgradeRollout = upgradeRollout;
this.changeBlockers = changeBlockers;
this.globalServiceId = globalServiceId;
@@ -150,13 +153,16 @@ public class DeploymentInstanceSpec extends DeploymentSpec.Steps {
return true;
}
- /** Returns the upgrade policy of this, which is defaultPolicy if none is specified */
+ /** Returns the upgrade policy of this, which is {@link DeploymentSpec.UpgradePolicy#defaultPolicy} by default */
public DeploymentSpec.UpgradePolicy upgradePolicy() { return upgradePolicy; }
- /** Returns the upgrade revision strategy of this, which is separate if none is specified */
- public DeploymentSpec.UpgradeRevision upgradeRevision() { return upgradeRevision; }
+ /** Returns the revision target choice of this, which is {@link DeploymentSpec.RevisionTarget#latest} by default */
+ public DeploymentSpec.RevisionTarget revisionTarget() { return revisionTarget; }
- /** Returns the upgrade rollout strategy of this, which is separate if none is specified */
+ /** Returns the revision change strategy of this, which is {@link DeploymentSpec.RevisionChange#whenFailing} by default */
+ public DeploymentSpec.RevisionChange revisionChange() { return revisionChange; }
+
+ /** Returns the upgrade rollout strategy of this, which is {@link DeploymentSpec.UpgradeRollout#separate} by default */
public DeploymentSpec.UpgradeRollout upgradeRollout() { return upgradeRollout; }
/** Returns time windows where upgrades are disallowed for these instances */
@@ -204,7 +210,7 @@ public class DeploymentInstanceSpec extends DeploymentSpec.Steps {
DeploymentInstanceSpec other = (DeploymentInstanceSpec) o;
return globalServiceId.equals(other.globalServiceId) &&
upgradePolicy == other.upgradePolicy &&
- upgradeRevision == other.upgradeRevision &&
+ revisionTarget == other.revisionTarget &&
upgradeRollout == other.upgradeRollout &&
changeBlockers.equals(other.changeBlockers) &&
steps().equals(other.steps()) &&
@@ -215,7 +221,7 @@ public class DeploymentInstanceSpec extends DeploymentSpec.Steps {
@Override
public int hashCode() {
- return Objects.hash(globalServiceId, upgradePolicy, upgradeRevision, upgradeRollout, changeBlockers, steps(), athenzService, notifications, endpoints);
+ return Objects.hash(globalServiceId, upgradePolicy, revisionTarget, upgradeRollout, changeBlockers, steps(), athenzService, notifications, endpoints);
}
@Override
diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java
index 3a66fb0c1a5..96e3ba75a38 100644
--- a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java
+++ b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java
@@ -550,14 +550,23 @@ public class DeploymentSpec {
}
- /** Determines when application changes deploy, when an older revision is already rolling out. */
- public enum UpgradeRevision {
- /** Exclusive: Application changes are rolled one at a time through this instance, even when they fail. */
- exclusive,
+ /** Determines what application changes to deploy to the instance. */
+ public enum RevisionTarget {
+ /** Next: Application changes are rolled through this instance in the same manner as they become ready. */
+ next,
+ /** Latest: Application changes are merged, so the latest available is always chosen for roll-out. */
+ latest
+ }
+
+
+ /** Determines when application changes deploy. */
+ public enum RevisionChange {
+ /** Exclusive: Application changes always wait for already rolling application changes to complete. */
+ whenClear,
/** Separate: Application changes wait for already rolling application changes to complete, unless they fail. */
- separate,
+ whenFailing,
/** Latest: Application changes immediately supersede previous application changes, unless currently blocked. */
- latest
+ always
}
diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java b/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java
index fdd7733a5f6..050fba1cd2f 100644
--- a/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java
+++ b/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java
@@ -165,7 +165,8 @@ public class DeploymentSpecXmlReader {
// Values where the parent may provide a default
DeploymentSpec.UpgradePolicy upgradePolicy = readUpgradePolicy(instanceTag, parentTag);
- DeploymentSpec.UpgradeRevision upgradeRevision = readUpgradeRevision(instanceTag, parentTag);
+ DeploymentSpec.RevisionTarget revisionTarget = readRevisionTarget(instanceTag, parentTag);
+ DeploymentSpec.RevisionChange revisionChange = readRevisionChange(instanceTag, parentTag);
DeploymentSpec.UpgradeRollout upgradeRollout = readUpgradeRollout(instanceTag, parentTag);
List<DeploymentSpec.ChangeBlocker> changeBlockers = readChangeBlockers(instanceTag, parentTag);
Optional<AthenzService> athenzService = mostSpecificAttribute(instanceTag, athenzServiceAttribute).map(AthenzService::from);
@@ -184,7 +185,8 @@ public class DeploymentSpecXmlReader {
.map(name -> new DeploymentInstanceSpec(InstanceName.from(name),
steps,
upgradePolicy,
- upgradeRevision,
+ revisionTarget,
+ revisionChange,
upgradeRollout,
changeBlockers,
globalServiceId.asOptional(),
@@ -474,23 +476,42 @@ public class DeploymentSpecXmlReader {
}
}
- private DeploymentSpec.UpgradeRevision readUpgradeRevision(Element parent, Element fallbackParent) {
+ private DeploymentSpec.RevisionChange readRevisionChange(Element parent, Element fallbackParent) {
Element upgradeElement = XML.getChild(parent, upgradeTag);
if (upgradeElement == null)
upgradeElement = XML.getChild(fallbackParent, upgradeTag);
if (upgradeElement == null)
- return DeploymentSpec.UpgradeRevision.separate;
+ return DeploymentSpec.RevisionChange.whenFailing;
- String revision = upgradeElement.getAttribute("revision");
+ String revision = upgradeElement.getAttribute("revision-change");
if (revision.isEmpty())
- return DeploymentSpec.UpgradeRevision.separate;
+ return DeploymentSpec.RevisionChange.whenFailing;
switch (revision) {
- case "exclusive": return DeploymentSpec.UpgradeRevision.exclusive;
- case "separate": return DeploymentSpec.UpgradeRevision.separate;
- case "latest": return DeploymentSpec.UpgradeRevision.latest;
- default: throw new IllegalArgumentException("Illegal upgrade revision '" + revision + "': " +
- "Must be one of " + Arrays.toString(DeploymentSpec.UpgradeRevision.values()));
+ case "when-clear": return DeploymentSpec.RevisionChange.whenClear;
+ case "when-failing": return DeploymentSpec.RevisionChange.whenFailing;
+ case "always": return DeploymentSpec.RevisionChange.always;
+ default: throw new IllegalArgumentException("Illegal upgrade revision change policy '" + revision + "': " +
+ "Must be one of " + Arrays.toString(DeploymentSpec.RevisionTarget.values()));
+ }
+ }
+
+ private DeploymentSpec.RevisionTarget readRevisionTarget(Element parent, Element fallbackParent) {
+ Element upgradeElement = XML.getChild(parent, upgradeTag);
+ if (upgradeElement == null)
+ upgradeElement = XML.getChild(fallbackParent, upgradeTag);
+ if (upgradeElement == null)
+ return DeploymentSpec.RevisionTarget.latest;
+
+ String revision = upgradeElement.getAttribute("revision-target");
+ if (revision.isEmpty())
+ return DeploymentSpec.RevisionTarget.latest;
+
+ switch (revision) {
+ case "next": return DeploymentSpec.RevisionTarget.next;
+ case "latest": return DeploymentSpec.RevisionTarget.latest;
+ default: throw new IllegalArgumentException("Illegal upgrade revision target '" + revision + "': " +
+ "Must be one of " + Arrays.toString(DeploymentSpec.RevisionTarget.values()));
}
}
diff --git a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java
index f6af155ffc2..86a2ede85ab 100644
--- a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java
+++ b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java
@@ -121,7 +121,8 @@ public class DeploymentSpecTest {
assertFalse(spec.requireInstance("default").globalServiceId().isPresent());
assertEquals(DeploymentSpec.UpgradePolicy.defaultPolicy, spec.requireInstance("default").upgradePolicy());
- assertEquals(DeploymentSpec.UpgradeRevision.separate, spec.requireInstance("default").upgradeRevision());
+ assertEquals(DeploymentSpec.RevisionTarget.latest, spec.requireInstance("default").revisionTarget());
+ assertEquals(DeploymentSpec.RevisionChange.whenFailing, spec.requireInstance("default").revisionChange());
assertEquals(DeploymentSpec.UpgradeRollout.separate, spec.requireInstance("default").upgradeRollout());
}
@@ -365,18 +366,22 @@ public class DeploymentSpecTest {
}
@Test
- public void productionSpecWithUpgradeRevision() {
+ public void productionSpecWithUpgradeRevisionSettings() {
StringReader r = new StringReader(
"<deployment>" +
" <instance id='default'>" +
- " <upgrade revision='latest' />" +
+ " <upgrade revision-change='when-clear' revision-target='next' />" +
+ " </instance>" +
+ " <instance id='custom'>" +
+ " <upgrade revision-change='always' />" +
" </instance>" +
- " <instance id='custom'/>" +
"</deployment>"
);
DeploymentSpec spec = DeploymentSpec.fromXml(r);
- assertEquals("latest", spec.requireInstance("default").upgradeRevision().toString());
- assertEquals("separate", spec.requireInstance("custom").upgradeRevision().toString());
+ assertEquals("next", spec.requireInstance("default").revisionTarget().toString());
+ assertEquals("latest", spec.requireInstance("custom").revisionTarget().toString());
+ assertEquals("whenClear", spec.requireInstance("default").revisionChange().toString());
+ assertEquals("always", spec.requireInstance("custom").revisionChange().toString());
}
@Test
@@ -417,10 +422,10 @@ public class DeploymentSpecTest {
public void upgradePolicyDefault() {
StringReader r = new StringReader(
"<deployment version='1.0'>" +
- " <upgrade policy='canary' rollout='leading' revision='latest' />" +
+ " <upgrade policy='canary' rollout='leading' revision-target='next' revision-change='when-clear' />" +
" <instance id='instance1'/>" +
" <instance id='instance2'>" +
- " <upgrade policy='conservative' rollout='separate' revision='separate'/>" +
+ " <upgrade policy='conservative' rollout='separate' revision-target='latest' revision-change='when-failing' />" +
" </instance>" +
"</deployment>"
);
@@ -428,8 +433,10 @@ public class DeploymentSpecTest {
DeploymentSpec spec = DeploymentSpec.fromXml(r);
assertEquals("canary", spec.requireInstance("instance1").upgradePolicy().toString());
assertEquals("conservative", spec.requireInstance("instance2").upgradePolicy().toString());
- assertEquals("latest", spec.requireInstance("instance1").upgradeRevision().toString());
- assertEquals("separate", spec.requireInstance("instance2").upgradeRevision().toString());
+ assertEquals("next", spec.requireInstance("instance1").revisionTarget().toString());
+ assertEquals("latest", spec.requireInstance("instance2").revisionTarget().toString());
+ assertEquals("whenClear", spec.requireInstance("instance1").revisionChange().toString());
+ assertEquals("whenFailing", spec.requireInstance("instance2").revisionChange().toString());
assertEquals("leading", spec.requireInstance("instance1").upgradeRollout().toString());
assertEquals("separate", spec.requireInstance("instance2").upgradeRollout().toString());
}