diff options
Diffstat (limited to 'config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java')
-rw-r--r-- | config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java | 47 |
1 files changed, 39 insertions, 8 deletions
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 098f5620723..e75ba5871f7 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 @@ -13,6 +13,7 @@ import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.time.Duration; +import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -39,25 +40,29 @@ import java.util.stream.Collectors; public class DeploymentSpec { /** The empty deployment spec, specifying no zones or rotation, and defaults for all settings */ - public static final DeploymentSpec empty = new DeploymentSpec(Optional.empty(), - UpgradePolicy.defaultPolicy, - ImmutableList.of(), + public static final DeploymentSpec empty = new DeploymentSpec(Optional.empty(), + UpgradePolicy.defaultPolicy, + Collections.emptyList(), + Collections.emptyList(), "<deployment version='1.0'/>"); private final Optional<String> globalServiceId; private final UpgradePolicy upgradePolicy; + private final List<TimeWindow> blockUpgrades; private final List<Step> steps; private final String xmlForm; - public DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy, List<Step> steps) { - this(globalServiceId, upgradePolicy, steps, null); + public DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy, + List<TimeWindow> blockUpgrades, List<Step> steps) { + this(globalServiceId, upgradePolicy, blockUpgrades, steps, null); } - private DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy, - List<Step> steps, String xmlForm) { + private DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy, + List<TimeWindow> blockUpgrades, List<Step> steps, String xmlForm) { validateTotalDelay(steps); this.globalServiceId = globalServiceId; this.upgradePolicy = upgradePolicy; + this.blockUpgrades = blockUpgrades; this.steps = ImmutableList.copyOf(completeSteps(new ArrayList<>(steps))); this.xmlForm = xmlForm; validateZones(this.steps); @@ -137,6 +142,14 @@ public class DeploymentSpec { /** Returns the upgrade policy of this, which is defaultPolicy if none is specified */ public UpgradePolicy upgradePolicy() { return upgradePolicy; } + /** Returns whether upgrade can occur at the given instant */ + public boolean canUpgradeAt(Instant instant) { + return blockUpgrades.stream().noneMatch(timeWindow -> timeWindow.includes(instant)); + } + + /** Returns time windows where upgrade is disallowed */ + public List<TimeWindow> blockUpgrades() { return blockUpgrades; } + /** Returns the deployment steps of this in the order they will be performed */ public List<Step> steps() { return steps; } @@ -210,7 +223,8 @@ public class DeploymentSpec { else if (readGlobalServiceId(environmentTag).isPresent()) throw new IllegalArgumentException("Attribute 'global-service-id' is only valid on 'prod' tag."); } - return new DeploymentSpec(globalServiceId, readUpgradePolicy(root), steps, xmlForm); + return new DeploymentSpec(globalServiceId, readUpgradePolicy(root), readBlockUpgradeWindows(root), steps, + xmlForm); } /** Returns the given attribute as an integer, or 0 if it is not present */ @@ -244,6 +258,23 @@ public class DeploymentSpec { return Optional.of(globalServiceId); } } + + private static List<TimeWindow> readBlockUpgradeWindows(Element root) { + List<TimeWindow> timeWindows = new ArrayList<>(); + for (Element tag : XML.getChildren(root)) { + if (!"block-upgrade".equals(tag.getTagName())) { + continue; + } + String daySpec = tag.getAttribute("days"); + String hourSpec = tag.getAttribute("hours"); + String zoneSpec = tag.getAttribute("time-zone"); + if (zoneSpec.isEmpty()) { // Default to UTC time zone + zoneSpec = "UTC"; + } + timeWindows.add(TimeWindow.from(daySpec, hourSpec, zoneSpec)); + } + return Collections.unmodifiableList(timeWindows); + } private static UpgradePolicy readUpgradePolicy(Element root) { Element upgradeElement = XML.getChild(root, "upgrade"); |