diff options
Diffstat (limited to 'config-provisioning')
-rw-r--r-- | config-provisioning/abi-spec.json | 22 | ||||
-rw-r--r-- | config-provisioning/src/main/java/com/yahoo/config/provision/zone/UpgradePolicy.java | 46 | ||||
-rw-r--r-- | config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneFilter.java | 33 | ||||
-rw-r--r-- | config-provisioning/src/main/java/com/yahoo/config/provision/zone/ZoneFilterMock.java | 79 | ||||
-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.java | 35 | ||||
-rw-r--r-- | config-provisioning/src/main/java/com/yahoo/config/provision/zone/package-info.java | 5 |
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; |