summaryrefslogtreecommitdiffstats
path: root/config-provisioning
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@verizonmedia.com>2019-08-21 15:41:01 +0200
committerValerij Fredriksen <valerijf@verizonmedia.com>2019-08-21 15:41:01 +0200
commitfcf44cdd8c2aff47da0eb1708d786152f756983d (patch)
treed90935e4b605ae2888a42094c38fdeb78ac86aae /config-provisioning
parent143575487f54fdeb9b8ce9eda127634053796001 (diff)
Define FlavorOverrides
Diffstat (limited to 'config-provisioning')
-rw-r--r--config-provisioning/abi-spec.json2
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/Flavor.java71
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/host/FlavorOverrides.java47
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/host/package-info.java5
4 files changed, 105 insertions, 20 deletions
diff --git a/config-provisioning/abi-spec.json b/config-provisioning/abi-spec.json
index 4bf8a8b7152..ae34a75f3f4 100644
--- a/config-provisioning/abi-spec.json
+++ b/config-provisioning/abi-spec.json
@@ -389,11 +389,13 @@
"methods": [
"public void <init>(com.yahoo.config.provisioning.FlavorsConfig$Flavor)",
"public void <init>(com.yahoo.config.provision.NodeResources)",
+ "public com.yahoo.config.provision.Flavor withFlavorOverrides(com.yahoo.config.provision.host.FlavorOverrides)",
"public java.lang.String name()",
"public int cost()",
"public boolean isStock()",
"public boolean isConfigured()",
"public com.yahoo.config.provision.NodeResources resources()",
+ "public java.util.Optional flavorOverrides()",
"public double getMinMainMemoryAvailableGb()",
"public double getMinDiskAvailableGb()",
"public boolean hasFastDisk()",
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/Flavor.java b/config-provisioning/src/main/java/com/yahoo/config/provision/Flavor.java
index bf8e75ebebc..c2b2fc2cb20 100644
--- a/config-provisioning/src/main/java/com/yahoo/config/provision/Flavor.java
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/Flavor.java
@@ -1,11 +1,13 @@
// 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;
+import com.yahoo.config.provision.host.FlavorOverrides;
import com.yahoo.config.provisioning.FlavorsConfig;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
+import java.util.Optional;
/**
* A host or node flavor.
@@ -16,35 +18,59 @@ import java.util.Objects;
*/
public class Flavor {
- private boolean configured;
+ private final boolean configured;
private final String name;
private final int cost;
private final Type type;
/** The hardware resources of this flavor */
- private NodeResources resources;
+ private final NodeResources resources;
+
+ private final Optional<FlavorOverrides> flavorOverrides;
/** Creates a *host* flavor from configuration */
public Flavor(FlavorsConfig.Flavor flavorConfig) {
- this.configured = true;
- this.name = flavorConfig.name();
- this.cost = flavorConfig.cost();
- this.type = Type.valueOf(flavorConfig.environment());
- this.resources = new NodeResources(flavorConfig.minCpuCores(),
- flavorConfig.minMainMemoryAvailableGb(),
- flavorConfig.minDiskAvailableGb(),
- flavorConfig.bandwidth() / 1000,
- flavorConfig.fastDisk() ? NodeResources.DiskSpeed.fast : NodeResources.DiskSpeed.slow);
+ this(
+ flavorConfig.name(),
+ new NodeResources(flavorConfig.minCpuCores(),
+ flavorConfig.minMainMemoryAvailableGb(),
+ flavorConfig.minDiskAvailableGb(),
+ flavorConfig.bandwidth() / 1000,
+ flavorConfig.fastDisk() ? NodeResources.DiskSpeed.fast : NodeResources.DiskSpeed.slow),
+ Optional.empty(),
+ Type.valueOf(flavorConfig.environment()),
+ true,
+ flavorConfig.cost());
}
/** Creates a *node* flavor from a node resources spec */
public Flavor(NodeResources resources) {
- Objects.requireNonNull(resources, "Resources cannot be null");
- this.configured = false;
- this.name = resources.toString();
- this.cost = 0;
- this.type = Type.DOCKER_CONTAINER;
- this.resources = resources;
+ this(resources.toString(), resources, Optional.empty(), Type.DOCKER_CONTAINER, false, 0);
+ }
+
+ private Flavor(String name, NodeResources resources, Optional<FlavorOverrides> flavorOverrides, Type type, boolean configured, int cost) {
+ this.name = Objects.requireNonNull(name, "Name cannot be null");
+ this.resources = Objects.requireNonNull(resources, "Resources cannot be null");
+ this.flavorOverrides = Objects.requireNonNull(flavorOverrides, "Flavor overrides cannot be null");
+ this.type = Objects.requireNonNull(type, "Type cannot be null");
+ this.configured = configured;
+ this.cost = cost;
+ }
+
+ public Flavor withFlavorOverrides(FlavorOverrides flavorOverrides) {
+ if (type == Type.DOCKER_CONTAINER)
+ throw new IllegalArgumentException("Cannot override flavor for docker containers");
+
+ if (!configured)
+ throw new IllegalArgumentException("Cannot override non-configured flavor");
+
+ NodeResources newResources = new NodeResources(
+ resources.vcpu(),
+ resources.memoryGb(),
+ flavorOverrides.diskGb().orElseGet(resources::diskGb),
+ resources.bandwidthGbps(),
+ resources.diskSpeed());
+ return new Flavor(name, newResources, Optional.of(flavorOverrides), type, true, cost);
}
/** Returns the unique identity of this flavor if it is configured, or the resource spec string otherwise */
@@ -66,6 +92,10 @@ public class Flavor {
public NodeResources resources() { return resources; }
+ public Optional<FlavorOverrides> flavorOverrides() {
+ return flavorOverrides;
+ }
+
public double getMinMainMemoryAvailableGb() { return resources.memoryGb(); }
public double getMinDiskAvailableGb() { return resources.diskGb(); }
@@ -103,7 +133,7 @@ public class Flavor {
public void freeze() {}
@Override
- public int hashCode() { return name.hashCode(); }
+ public int hashCode() { return Objects.hash(name, flavorOverrides); }
@Override
public boolean equals(Object o) {
@@ -111,7 +141,8 @@ public class Flavor {
if ( ! (o instanceof Flavor)) return false;
Flavor other = (Flavor)o;
if (configured)
- return other.name.equals(this.name);
+ return Objects.equals(this.name, other.name) &&
+ Objects.equals(this.flavorOverrides, other.flavorOverrides);
else
return this.resources.equals(other.resources);
}
@@ -119,7 +150,7 @@ public class Flavor {
@Override
public String toString() {
if (isConfigured())
- return "flavor '" + name + "'";
+ return "flavor '" + name + "'" + flavorOverrides.map(o -> " with overrides: " + o).orElse("");
else
return name;
}
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/host/FlavorOverrides.java b/config-provisioning/src/main/java/com/yahoo/config/provision/host/FlavorOverrides.java
new file mode 100644
index 00000000000..8446c35cb0e
--- /dev/null
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/host/FlavorOverrides.java
@@ -0,0 +1,47 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.config.provision.host;
+
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * Overrides fields in a {@link com.yahoo.config.provision.Flavor}, e.g. when a flavor is not
+ * tied to a specific disk.
+ *
+ * @author freva
+ */
+public class FlavorOverrides {
+
+ private final Optional<Double> diskGb;
+
+ private FlavorOverrides(Optional<Double> diskGb) {
+ this.diskGb = diskGb;
+ }
+
+ public Optional<Double> diskGb() {
+ return diskGb;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ FlavorOverrides that = (FlavorOverrides) o;
+ return diskGb.equals(that.diskGb);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(diskGb);
+ }
+
+ @Override
+ public String toString() {
+ return "[" + diskGb.map(d -> "disk " + d + " Gb").orElse("") + "]";
+ }
+
+ public static FlavorOverrides ofDisk(double diskGb) {
+ return new FlavorOverrides(Optional.of(diskGb));
+ }
+
+}
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/host/package-info.java b/config-provisioning/src/main/java/com/yahoo/config/provision/host/package-info.java
new file mode 100644
index 00000000000..656096f865a
--- /dev/null
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/host/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.host;
+
+import com.yahoo.osgi.annotation.ExportPackage;