summaryrefslogtreecommitdiffstats
path: root/config-provisioning
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-05-06 14:09:10 +0200
committerMartin Polden <mpolden@mpolden.no>2020-05-06 15:05:39 +0200
commit5aa8f4c900e1c7ff87c7dd804939713f5a87b9e2 (patch)
tree5c5e1bcfd6761ce4afcca1239a77dd4271d434f6 /config-provisioning
parentee4fb54e2078961257a9c399f6e90622dc0b2298 (diff)
Model cloud features explicitly
Diffstat (limited to 'config-provisioning')
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/Cloud.java78
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/Zone.java23
-rw-r--r--config-provisioning/src/main/resources/configdefinitions/cloud.def16
3 files changed, 107 insertions, 10 deletions
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/Cloud.java b/config-provisioning/src/main/java/com/yahoo/config/provision/Cloud.java
new file mode 100644
index 00000000000..b1df63dae44
--- /dev/null
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/Cloud.java
@@ -0,0 +1,78 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.config.provision;
+
+/**
+ * Represents a cloud service and its supported features.
+ *
+ * @author mpolden
+ */
+public class Cloud {
+
+ private final CloudName name;
+
+ private final boolean dynamicProvisioning;
+ private final boolean allowHostSharing;
+ private final boolean reprovisionToUpgradeOs;
+ private final boolean requireAccessControl;
+
+ protected Cloud(CloudName name, boolean dynamicProvisioning, boolean allowHostSharing, boolean reprovisionToUpgradeOs,
+ boolean requireAccessControl) {
+ this.name = name;
+ this.dynamicProvisioning = dynamicProvisioning;
+ this.allowHostSharing = allowHostSharing;
+ this.reprovisionToUpgradeOs = reprovisionToUpgradeOs;
+ this.requireAccessControl = requireAccessControl;
+ }
+
+ /** The name of this */
+ public CloudName name() {
+ return name;
+ }
+
+ /** Returns whether this can provision hosts dynamically */
+ public boolean dynamicProvisioning() {
+ return dynamicProvisioning;
+ }
+
+ /** Returns wheter this allows different applications to share the same host */
+ public boolean allowHostSharing() {
+ return allowHostSharing;
+ }
+
+ /** Returns whether upgrading OS on hosts in this requires the host to be reprovisioned */
+ public boolean reprovisionToUpgradeOs() {
+ return reprovisionToUpgradeOs;
+ }
+
+ /** Returns whether to require access control for all clusters in this */
+ public boolean requireAccessControl() {
+ return requireAccessControl;
+ }
+
+ public Cloud withDynamicProvisioning(boolean dynamicProvisioning) {
+ return new Cloud(name, dynamicProvisioning, allowHostSharing, reprovisionToUpgradeOs, requireAccessControl);
+ }
+
+ public Cloud withAllowHostSharing(boolean allowHostSharing) {
+ return new Cloud(name, dynamicProvisioning, allowHostSharing, reprovisionToUpgradeOs, requireAccessControl);
+ }
+
+ public Cloud withReprovisionToUpgradeOs(boolean reprovisionToUpgradeOs) {
+ return new Cloud(name, dynamicProvisioning, allowHostSharing, reprovisionToUpgradeOs, requireAccessControl);
+ }
+
+ public Cloud withRequireAccessControl(boolean requireAccessControl) {
+ return new Cloud(name, dynamicProvisioning, allowHostSharing, reprovisionToUpgradeOs, requireAccessControl);
+ }
+
+ /** For testing purposes only */
+ public static Cloud defaultCloud() {
+ return new Cloud(CloudName.defaultName(), false, true, false, false);
+ }
+
+ @Override
+ public String toString() {
+ return "cloud " + name;
+ }
+
+}
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/Zone.java b/config-provisioning/src/main/java/com/yahoo/config/provision/Zone.java
index 33a13b1aa9f..260f17f1c81 100644
--- a/config-provisioning/src/main/java/com/yahoo/config/provision/Zone.java
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/Zone.java
@@ -3,6 +3,7 @@ package com.yahoo.config.provision;
import com.google.inject.Inject;
import com.yahoo.cloud.config.ConfigserverConfig;
+import com.yahoo.config.provisioning.CloudConfig;
import java.util.Objects;
import java.util.Optional;
@@ -16,15 +17,17 @@ import java.util.Optional;
*/
public class Zone {
- private final CloudName cloudName;
+ private final Cloud cloud;
private final SystemName systemName;
private final Environment environment;
private final RegionName region;
private final Optional<NodeFlavors> nodeFlavors;
@Inject
- public Zone(ConfigserverConfig configserverConfig, NodeFlavors nodeFlavors) {
- this(CloudName.from(configserverConfig.cloud()),
+ public Zone(ConfigserverConfig configserverConfig, NodeFlavors nodeFlavors, CloudConfig cloudConfig) {
+ this(new Cloud(CloudName.from(configserverConfig.cloud()), cloudConfig.dynamicProvisioning(),
+ cloudConfig.allowHostSharing(), cloudConfig.reprovisionToUpgradeOs(),
+ cloudConfig.requireAccessControl()),
SystemName.from(configserverConfig.system()),
Environment.from(configserverConfig.environment()),
RegionName.from(configserverConfig.region()),
@@ -38,21 +41,21 @@ public class Zone {
/** Create from system, environment and region. Use for testing. */
public Zone(SystemName systemName, Environment environment, RegionName region) {
- this(CloudName.defaultName(), systemName, environment, region);
+ this(Cloud.defaultCloud(), systemName, environment, region);
}
/** Create from cloud, system, environment and region. Use for testing. */
- public Zone(CloudName cloudName, SystemName systemName, Environment environment, RegionName region) {
- this(cloudName, systemName, environment, region, null);
+ public Zone(Cloud cloud, SystemName systemName, Environment environment, RegionName region) {
+ this(cloud, systemName, environment, region, null);
}
/** Create from cloud, system, environment, region and node flavors. Use for testing. */
- private Zone(CloudName cloudName,
+ private Zone(Cloud cloud,
SystemName systemName,
Environment environment,
RegionName region,
NodeFlavors nodeFlavors) {
- this.cloudName = cloudName;
+ this.cloud = cloud;
this.systemName = systemName;
this.environment = environment;
this.region = region;
@@ -60,7 +63,7 @@ public class Zone {
}
/** Returns the current cloud */
- public CloudName cloud() { return cloudName; }
+ public Cloud cloud() { return cloud; }
/** Returns the current system */
public SystemName system() { return systemName; }
@@ -80,7 +83,7 @@ public class Zone {
/** Do not use */
public static Zone defaultZone() {
- return new Zone(CloudName.defaultName(), SystemName.defaultSystem(), Environment.defaultEnvironment(), RegionName.defaultName());
+ return new Zone(Cloud.defaultCloud(), SystemName.defaultSystem(), Environment.defaultEnvironment(), RegionName.defaultName());
}
@Override
diff --git a/config-provisioning/src/main/resources/configdefinitions/cloud.def b/config-provisioning/src/main/resources/configdefinitions/cloud.def
new file mode 100644
index 00000000000..36523482ab2
--- /dev/null
+++ b/config-provisioning/src/main/resources/configdefinitions/cloud.def
@@ -0,0 +1,16 @@
+# Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#
+# Configures the features supported by a cloud service.
+namespace=config.provisioning
+
+# Are hosts provisioned dynamically on-demand?
+dynamicProvisioning bool default=false
+
+# Can nodes belonging to different applications be placed on the same host?
+allowHostSharing bool default=true
+
+# Do we need to reprovision a host to upgrade its operating system?
+reprovisionToUpgradeOs bool default=false
+
+# Should clusters in this cloud always require access control for both read and write operations?
+requireAccessControl bool default=false