aboutsummaryrefslogtreecommitdiffstats
path: root/config-provisioning
diff options
context:
space:
mode:
authorHåkon Hallingstad <hakon@verizonmedia.com>2019-04-08 15:59:46 +0200
committerHåkon Hallingstad <hakon@verizonmedia.com>2019-04-08 15:59:46 +0200
commit42d75629f9a3a33bd861fce86a25da5cd1900e18 (patch)
tree8b18246ca6b17165a159c3b22298e98b7415b028 /config-provisioning
parentf778fa7fe0caf463cd766b08d1fd66644191c335 (diff)
Also move UpgradePolicy, ZoneFilter, and ZoneList
Diffstat (limited to 'config-provisioning')
-rw-r--r--config-provisioning/abi-spec.json22
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/zone/UpgradePolicy.java46
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneFilter.java33
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneFilterMock.java79
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneId.java (renamed from config-provisioning/src/main/java/com/yahoo/config/provision/ZoneId.java)6
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneList.java35
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/zone/package-info.java5
7 files changed, 203 insertions, 23 deletions
diff --git a/config-provisioning/abi-spec.json b/config-provisioning/abi-spec.json
index d122748cd6d..6e110b708cf 100644
--- a/config-provisioning/abi-spec.json
+++ b/config-provisioning/abi-spec.json
@@ -762,27 +762,5 @@
"public int hashCode()"
],
"fields": []
- },
- "com.yahoo.config.provision.ZoneId": {
- "superClass": "java.lang.Object",
- "interfaces": [],
- "attributes": [
- "public"
- ],
- "methods": [
- "public static com.yahoo.config.provision.ZoneId from(com.yahoo.config.provision.Environment, com.yahoo.config.provision.RegionName)",
- "public static com.yahoo.config.provision.ZoneId from(java.lang.String, java.lang.String)",
- "public static com.yahoo.config.provision.ZoneId from(java.lang.String)",
- "public static com.yahoo.config.provision.ZoneId from(com.yahoo.config.provision.Environment, com.yahoo.config.provision.RegionName, com.yahoo.config.provision.CloudName)",
- "public static com.yahoo.config.provision.ZoneId from(java.lang.String, java.lang.String, java.lang.String)",
- "public com.yahoo.config.provision.Environment environment()",
- "public com.yahoo.config.provision.RegionName region()",
- "public com.yahoo.config.provision.CloudName cloud()",
- "public java.lang.String value()",
- "public java.lang.String toString()",
- "public boolean equals(java.lang.Object)",
- "public int hashCode()"
- ],
- "fields": []
}
} \ No newline at end of file
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/zone/UpgradePolicy.java b/config-provisioning/src/main/java/com/yahoo/config/provision/zone/UpgradePolicy.java
new file mode 100644
index 00000000000..d5831efdbaa
--- /dev/null
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/zone/UpgradePolicy.java
@@ -0,0 +1,46 @@
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.config.provision.zone;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * This class declares the order to use when upgrading zones in a system.
+ *
+ * @author mpolden
+ */
+public class UpgradePolicy {
+
+ private final List<List<ZoneId>> zones;
+
+ private UpgradePolicy(List<List<ZoneId>> zones) {
+ this.zones = zones;
+ }
+
+ public List<List<ZoneId>> asList() {
+ return Collections.unmodifiableList(zones);
+ }
+
+ private UpgradePolicy with(ZoneId... zone) {
+ List<List<ZoneId>> zones = new ArrayList<>(this.zones);
+ zones.add(Arrays.asList(zone));
+ return new UpgradePolicy(zones);
+ }
+
+ /** Upgrade given zone as the next step */
+ public UpgradePolicy upgrade(ZoneId zone) {
+ return with(zone);
+ }
+
+ /** Upgrade given zones in parallel as the next step */
+ public UpgradePolicy upgradeInParallel(ZoneId... zone) {
+ return with(zone);
+ }
+
+ public static UpgradePolicy create() {
+ return new UpgradePolicy(Collections.emptyList());
+ }
+
+}
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneFilter.java b/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneFilter.java
new file mode 100644
index 00000000000..ab44fdcb05e
--- /dev/null
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneFilter.java
@@ -0,0 +1,33 @@
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.config.provision.zone;
+
+import com.yahoo.config.provision.CloudName;
+
+/**
+ * A ZoneId list which can be filtered in various ways; elements can be accessed after at least one filter.
+ *
+ * The methods here return instances of {@link ZoneList}, which extends ZoneFilter, but with accessors and additional filters.
+ * This forces the developer to consider which of the filters in this class to apply, prior to accessing any zones.
+ *
+ * @author jonmv
+ */
+public interface ZoneFilter {
+
+ /** Negates the next filter. */
+ ZoneFilter not();
+
+ /** Zones which are upgraded by the controller. */
+ ZoneList controllerUpgraded();
+
+ /** Zones where config servers are up and running. */
+ ZoneList reachable();
+
+ /** All zones from the initial pool. */
+ ZoneList all();
+
+ /** Zones in the specified cloud */
+ default ZoneList ofCloud(CloudName cloud) {
+ return all(); // Not implemented in this repo.
+ }
+
+}
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneFilterMock.java b/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneFilterMock.java
new file mode 100644
index 00000000000..675b770dc29
--- /dev/null
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneFilterMock.java
@@ -0,0 +1,79 @@
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.config.provision.zone;
+
+import com.yahoo.config.provision.Environment;
+import com.yahoo.config.provision.RegionName;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+/**
+ * A ZoneList implementation which assumes all zones are controllerManaged.
+ *
+ * @author jonmv
+ */
+public class ZoneFilterMock implements ZoneList {
+
+ private final List<ZoneId> zones;
+ private final boolean negate;
+
+ private ZoneFilterMock(List<ZoneId> zones, boolean negate) {
+ this.negate = negate;
+ this.zones = zones;
+ }
+
+ public static ZoneFilter from(Collection<ZoneId> zones) {
+ return new ZoneFilterMock(new ArrayList<>(zones), false);
+ }
+
+ @Override
+ public ZoneList not() {
+ return new ZoneFilterMock(zones, ! negate);
+ }
+
+ @Override
+ public ZoneList all() {
+ return filter(zoneId -> true);
+ }
+
+ @Override
+ public ZoneList controllerUpgraded() {
+ return all();
+ }
+
+ @Override
+ public ZoneList reachable() {
+ return all();
+ }
+
+ @Override
+ public ZoneList in(Environment... environments) {
+ return filter(zoneId -> new HashSet<>(Arrays.asList(environments)).contains(zoneId.environment()));
+ }
+
+ @Override
+ public ZoneList in(RegionName... regions) {
+ return filter(zoneId -> new HashSet<>(Arrays.asList(regions)).contains(zoneId.region()));
+ }
+
+ @Override
+ public ZoneList among(ZoneId... zones) {
+ return filter(zoneId -> new HashSet<>(Arrays.asList(zones)).contains(zoneId));
+ }
+
+ @Override
+ public List<ZoneId> ids() {
+ return Collections.unmodifiableList(zones);
+ }
+
+ private ZoneFilterMock filter(Predicate<ZoneId> condition) {
+ return new ZoneFilterMock(zones.stream().filter(negate ? condition.negate() : condition).collect(Collectors.toList()), false);
+ }
+
+}
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/ZoneId.java b/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneId.java
index 1954940528d..7eeae10eeb8 100644
--- a/config-provisioning/src/main/java/com/yahoo/config/provision/ZoneId.java
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneId.java
@@ -1,5 +1,9 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.config.provision;
+package com.yahoo.config.provision.zone;
+
+import com.yahoo.config.provision.CloudName;
+import com.yahoo.config.provision.Environment;
+import com.yahoo.config.provision.RegionName;
import java.util.Objects;
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneList.java b/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneList.java
new file mode 100644
index 00000000000..49c72b9eea8
--- /dev/null
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneList.java
@@ -0,0 +1,35 @@
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.config.provision.zone;
+
+import com.yahoo.config.provision.Environment;
+import com.yahoo.config.provision.RegionName;
+
+import java.util.List;
+
+/**
+ * Provides filters for and access to a list of ZoneIds.
+ *
+ * This is typically offered after an initial filter from {@link ZoneFilter} has been applied.
+ * This forces the developer to consider which zones to process.
+ *
+ * @author jonmv
+ */
+public interface ZoneList extends ZoneFilter {
+
+ /** Negates the next filter. */
+ @Override
+ ZoneList not();
+
+ /** Zones in one of the given environments. */
+ ZoneList in(Environment... environments);
+
+ /** Zones in one of the given regions. */
+ ZoneList in(RegionName... regions);
+
+ /** Only the given zones — combine with not() for best effect! */
+ ZoneList among(ZoneId... zones);
+
+ /** Returns the id of all zones in this list as — you guessed it — a list. */
+ List<ZoneId> ids();
+
+}
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/zone/package-info.java b/config-provisioning/src/main/java/com/yahoo/config/provision/zone/package-info.java
new file mode 100644
index 00000000000..3e4de2d6b23
--- /dev/null
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/zone/package-info.java
@@ -0,0 +1,5 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+@ExportPackage
+package com.yahoo.config.provision.zone;
+
+import com.yahoo.osgi.annotation.ExportPackage;