diff options
author | Valerij Fredriksen <valerijf@verizonmedia.com> | 2019-08-21 15:41:01 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerijf@verizonmedia.com> | 2019-08-21 15:41:01 +0200 |
commit | fcf44cdd8c2aff47da0eb1708d786152f756983d (patch) | |
tree | d90935e4b605ae2888a42094c38fdeb78ac86aae /config-provisioning | |
parent | 143575487f54fdeb9b8ce9eda127634053796001 (diff) |
Define FlavorOverrides
Diffstat (limited to 'config-provisioning')
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; |