diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-05-07 09:25:32 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-07 09:25:32 +0200 |
commit | 0a0df59c81cc3a7ffe3fe92fdac87ed2fcf2eac6 (patch) | |
tree | bb94eef23097b29af5b8f0d72fff7d6356ab5043 /config-provisioning/src | |
parent | 530ad3553008619bdea6bfb882c139497b0ae9fd (diff) | |
parent | 6edcc0ad3e0232a523c5300a3fbc3262e2bdf4b9 (diff) |
Merge pull request #13169 from vespa-engine/mpolden/model-cloud-features
Model cloud features explicitly
Diffstat (limited to 'config-provisioning/src')
3 files changed, 111 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..5b6485de2b4 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,11 @@ public class Zone { } /** Returns the current cloud */ - public CloudName cloud() { return cloudName; } + // TODO: For compatibility with older config models. Remove after June 2020 + public CloudName cloud() { return cloud.name(); } + + /** Returns the current cloud */ + public Cloud getCloud() { return cloud; } /** Returns the current system */ public SystemName system() { return systemName; } @@ -80,7 +87,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 |