diff options
author | Valerij Fredriksen <freva@users.noreply.github.com> | 2019-03-10 09:54:27 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-10 09:54:27 +0100 |
commit | 28e361815076bc959a639bf0ecb601cc3b43aab8 (patch) | |
tree | 26dbcb0884fc74ebae434617902f00bf655875c4 | |
parent | 523213c7eb64adccc09a3efb05a8d51fb5dbcd37 (diff) |
Revert "Flavor interface"
84 files changed, 520 insertions, 649 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/StorageNode.java b/config-model/src/main/java/com/yahoo/vespa/model/content/StorageNode.java index 5b8b5c816de..9ea92048f3b 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/StorageNode.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/StorageNode.java @@ -2,11 +2,11 @@ package com.yahoo.vespa.model.content; import com.yahoo.config.model.deploy.DeployState; -import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.config.provision.Flavor; import com.yahoo.vespa.config.content.StorFilestorConfig; import com.yahoo.vespa.config.content.core.StorBucketmoverConfig; import com.yahoo.vespa.config.content.core.StorServerConfig; +import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.defaults.Defaults; import com.yahoo.vespa.model.application.validation.RestartConfigs; import com.yahoo.vespa.model.builder.xml.dom.ModelElement; @@ -88,7 +88,7 @@ public class StorageNode extends ContentNode implements StorServerConfig.Produce public void getConfig(StorFilestorConfig.Builder builder) { if (getHostResource() != null && getHostResource().getFlavor().isPresent()) { Flavor nodeFlavor = getHostResource().getFlavor().get(); - builder.num_threads(Math.max(4, (int)nodeFlavor.cpu().cores())); + builder.num_threads(Math.max(4, (int)nodeFlavor.getMinCpuCores())); } cluster.getConfig(builder); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/NodeFlavorTuning.java b/config-model/src/main/java/com/yahoo/vespa/model/search/NodeFlavorTuning.java index 0c332f3e164..da193a17801 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/NodeFlavorTuning.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/NodeFlavorTuning.java @@ -39,31 +39,31 @@ public class NodeFlavorTuning implements ProtonConfig.Producer { private void getConfig(ProtonConfig.Documentdb.Builder builder) { ProtonConfig.Documentdb dbCfg = builder.build(); if (dbCfg.mode() != ProtonConfig.Documentdb.Mode.Enum.INDEX) { - long numDocs = (long)nodeFlavor.memory().sizeInGb()*GB/64L; + long numDocs = (long)nodeFlavor.getMinMainMemoryAvailableGb()*GB/64L; builder.allocation.initialnumdocs(numDocs); } } private void tuneSummaryCache(ProtonConfig.Summary.Cache.Builder builder) { - long memoryLimitBytes = (long) ((nodeFlavor.memory().sizeInGb() * 0.05) * GB); + long memoryLimitBytes = (long) ((nodeFlavor.getMinMainMemoryAvailableGb() * 0.05) * GB); builder.maxbytes(memoryLimitBytes); } private void setHwInfo(ProtonConfig.Builder builder) { - builder.hwinfo.disk.size((long)nodeFlavor.disk().sizeInBase10Gb() * GB); - builder.hwinfo.disk.shared(nodeFlavor.environment().equals(Flavor.Environment.DOCKER_CONTAINER)); - builder.hwinfo.memory.size((long)nodeFlavor.memory().sizeInGb() * GB); - builder.hwinfo.cpu.cores((int)nodeFlavor.cpu().cores()); + builder.hwinfo.disk.size((long)nodeFlavor.getMinDiskAvailableGb() * GB); + builder.hwinfo.disk.shared(nodeFlavor.getType().equals(Flavor.Type.DOCKER_CONTAINER)); + builder.hwinfo.memory.size((long)nodeFlavor.getMinMainMemoryAvailableGb() * GB); + builder.hwinfo.cpu.cores((int)nodeFlavor.getMinCpuCores()); } private void tuneDiskWriteSpeed(ProtonConfig.Builder builder) { - if (!nodeFlavor.disk().isFast()) { + if (!nodeFlavor.hasFastDisk()) { builder.hwinfo.disk.writespeed(40); } } private void tuneDocumentStoreMaxFileSize(ProtonConfig.Summary.Log.Builder builder) { - double memoryGb = nodeFlavor.memory().sizeInGb(); + double memoryGb = nodeFlavor.getMinMainMemoryAvailableGb(); long fileSizeBytes = 4 * GB; if (memoryGb <= 12.0) { fileSizeBytes = 256 * MB; @@ -76,25 +76,25 @@ public class NodeFlavorTuning implements ProtonConfig.Producer { } private void tuneFlushStrategyMemoryLimits(ProtonConfig.Flush.Memory.Builder builder) { - long memoryLimitBytes = (long) ((nodeFlavor.memory().sizeInGb() / 8) * GB); + long memoryLimitBytes = (long) ((nodeFlavor.getMinMainMemoryAvailableGb() / 8) * GB); builder.maxmemory(memoryLimitBytes); builder.each.maxmemory(memoryLimitBytes); } private void tuneFlushStrategyTlsSize(ProtonConfig.Flush.Memory.Builder builder) { - long tlsSizeBytes = (long) ((nodeFlavor.disk().sizeInBase10Gb() * 0.07) * GB); + long tlsSizeBytes = (long) ((nodeFlavor.getMinDiskAvailableGb() * 0.07) * GB); tlsSizeBytes = min(tlsSizeBytes, 100 * GB); builder.maxtlssize(tlsSizeBytes); } private void tuneSummaryReadIo(ProtonConfig.Summary.Read.Builder builder) { - if (nodeFlavor.disk().isFast()) { + if (nodeFlavor.hasFastDisk()) { builder.io(ProtonConfig.Summary.Read.Io.DIRECTIO); } } private void tuneSearchReadIo(ProtonConfig.Search.Mmap.Builder builder) { - if (nodeFlavor.disk().isFast()) { + if (nodeFlavor.hasFastDisk()) { builder.advise(ProtonConfig.Search.Mmap.Advise.RANDOM); } } diff --git a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java index dea4d13d16e..588a722d476 100644 --- a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java +++ b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java @@ -9,7 +9,6 @@ import com.yahoo.config.model.deploy.TestProperties; import com.yahoo.config.provision.ClusterMembership; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.Zone; -import com.yahoo.config.provision.internal.ConfigFlavor; import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.container.core.ApplicationMetadataConfig; import com.yahoo.search.config.QrStartConfig; @@ -1741,9 +1740,8 @@ public class ModelProvisioningTest { } private static Flavor createFlavorFromDiskSetting(String name, boolean fastDisk) { - return new ConfigFlavor(new FlavorsConfig.Flavor(new FlavorsConfig.Flavor.Builder() - .name(name) - .disk(new FlavorsConfig.Flavor.Disk.Builder().fast(fastDisk)))); + return new Flavor(new FlavorsConfig.Flavor(new FlavorsConfig.Flavor.Builder(). + name(name).fastDisk(fastDisk))); } private static ProtonConfig getProtonConfig(ContentSearchCluster cluster, int searchNodeIdx) { @@ -1798,10 +1796,8 @@ public class ModelProvisioningTest { private static long GB = 1024 * 1024 * 1024; private static Flavor createFlavorFromMemoryAndDisk(String name, int memoryGb, int diskGb) { - return new ConfigFlavor(new FlavorsConfig.Flavor(new FlavorsConfig.Flavor.Builder() - .name(name) - .memory(new FlavorsConfig.Flavor.Memory.Builder().sizeInGb(memoryGb)) - .disk(new FlavorsConfig.Flavor.Disk.Builder().sizeInGb(diskGb)))); + return new Flavor(new FlavorsConfig.Flavor(new FlavorsConfig.Flavor.Builder(). + name(name).minMainMemoryAvailableGb(memoryGb).minDiskAvailableGb(diskGb))); } private static ProtonConfig getProtonConfig(VespaModel model, String configId) { diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/StorageClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/StorageClusterTest.java index 35f7e72907e..27f5af52b6c 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/StorageClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/StorageClusterTest.java @@ -3,22 +3,22 @@ package com.yahoo.vespa.model.content; import com.yahoo.config.model.provision.SingleNodeProvisioner; import com.yahoo.config.model.test.MockApplicationPackage; -import com.yahoo.config.model.test.MockRoot; import com.yahoo.config.provision.Flavor; -import com.yahoo.config.provision.internal.ConfigFlavor; import com.yahoo.config.provisioning.FlavorsConfig; -import com.yahoo.documentmodel.NewDocumentType; -import com.yahoo.vespa.config.content.PersistenceConfig; -import com.yahoo.vespa.config.content.StorFilestorConfig; import com.yahoo.vespa.config.content.core.StorIntegritycheckerConfig; -import com.yahoo.vespa.config.content.core.StorServerConfig; import com.yahoo.vespa.config.content.core.StorVisitorConfig; +import com.yahoo.vespa.config.content.StorFilestorConfig; +import com.yahoo.vespa.config.content.core.StorServerConfig; +import com.yahoo.vespa.config.content.PersistenceConfig; +import com.yahoo.config.model.test.MockRoot; +import com.yahoo.documentmodel.NewDocumentType; +import static com.yahoo.vespa.defaults.Defaults.getDefaults; import com.yahoo.vespa.model.content.cluster.ContentCluster; import com.yahoo.vespa.model.content.storagecluster.StorageCluster; import com.yahoo.vespa.model.content.utils.ContentClusterUtils; import org.junit.Test; -import static com.yahoo.vespa.defaults.Defaults.getDefaults; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; @@ -122,10 +122,7 @@ public class StorageClusterTest { " <node distribution-key=\"0\" hostalias=\"mockhost\"/>" + " </group>" + "</cluster>", - new ConfigFlavor(new FlavorsConfig.Flavor.Builder() - .name("test-flavor") - .cpu(new FlavorsConfig.Flavor.Cpu.Builder().cores(9)) - .build()) + new Flavor(new FlavorsConfig.Flavor.Builder().name("test-flavor").minCpuCores(9).build()) ); { @@ -157,10 +154,7 @@ public class StorageClusterTest { " <node distribution-key=\"0\" hostalias=\"mockhost\"/>" + " </group>" + "</cluster>", - new ConfigFlavor(new FlavorsConfig.Flavor.Builder() - .name("test-flavor") - .cpu(new FlavorsConfig.Flavor.Cpu.Builder().cores(9)) - .build()) + new Flavor(new FlavorsConfig.Flavor.Builder().name("test-flavor").minCpuCores(9).build()) ); { diff --git a/config-model/src/test/java/com/yahoo/vespa/model/search/NodeFlavorTuningTest.java b/config-model/src/test/java/com/yahoo/vespa/model/search/NodeFlavorTuningTest.java index 4036a9a1d78..7aadca4a1af 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/search/NodeFlavorTuningTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/search/NodeFlavorTuningTest.java @@ -2,7 +2,7 @@ package com.yahoo.vespa.model.search; import com.yahoo.collections.Pair; -import com.yahoo.config.provision.internal.ConfigFlavor; +import com.yahoo.config.provision.Flavor; import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.vespa.config.search.core.ProtonConfig; import org.junit.Test; @@ -10,9 +10,10 @@ import org.junit.Test; import java.util.Arrays; import java.util.List; -import static com.yahoo.vespa.model.search.NodeFlavorTuning.GB; -import static com.yahoo.vespa.model.search.NodeFlavorTuning.MB; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static com.yahoo.vespa.model.search.NodeFlavorTuning.MB; +import static com.yahoo.vespa.model.search.NodeFlavorTuning.GB; /** * @author geirst @@ -156,45 +157,44 @@ public class NodeFlavorTuningTest { } private static ProtonConfig configFromDiskSetting(boolean fastDisk) { - return getConfig(new FlavorsConfig.Flavor.Builder() - .disk(new FlavorsConfig.Flavor.Disk.Builder().fast(fastDisk))); + return getConfig(new FlavorsConfig.Flavor.Builder(). + fastDisk(fastDisk)); } private static ProtonConfig configFromDiskSetting(int diskGb) { - return getConfig(new FlavorsConfig.Flavor.Builder() - .disk(new FlavorsConfig.Flavor.Disk.Builder().sizeInGb(diskGb))); + return getConfig(new FlavorsConfig.Flavor.Builder(). + minDiskAvailableGb(diskGb)); } private static ProtonConfig configFromMemorySetting(int memoryGb) { - return getConfig(new FlavorsConfig.Flavor.Builder() - .memory(new FlavorsConfig.Flavor.Memory.Builder().sizeInGb(memoryGb))); + return getConfig(new FlavorsConfig.Flavor.Builder(). + minMainMemoryAvailableGb(memoryGb)); } private static ProtonConfig configFromMemorySetting(int memoryGb, ProtonConfig.Builder builder) { - return getConfig(new FlavorsConfig.Flavor.Builder() - .memory(new FlavorsConfig.Flavor.Memory.Builder().sizeInGb(memoryGb)), builder); + return getConfig(new FlavorsConfig.Flavor.Builder(). + minMainMemoryAvailableGb(memoryGb), builder); } private static ProtonConfig configFromNumCoresSetting(double numCores) { - return getConfig(new FlavorsConfig.Flavor.Builder() - .cpu(new FlavorsConfig.Flavor.Cpu.Builder().cores(numCores))); + return getConfig(new FlavorsConfig.Flavor.Builder().minCpuCores(numCores)); } private static ProtonConfig configFromEnvironmentType(boolean docker) { - String environment = (docker ? "DOCKER_CONTAINER" : "BARE_METAL"); + String environment = (docker ? "DOCKER_CONTAINER" : "undefined"); return getConfig(new FlavorsConfig.Flavor.Builder().environment(environment)); } private static ProtonConfig getConfig(FlavorsConfig.Flavor.Builder flavorBuilder) { getConfig(flavorBuilder, new ProtonConfig.Builder()); flavorBuilder.name("my_flavor"); - NodeFlavorTuning tuning = new NodeFlavorTuning(new ConfigFlavor(new FlavorsConfig.Flavor(flavorBuilder))); + NodeFlavorTuning tuning = new NodeFlavorTuning(new Flavor(new FlavorsConfig.Flavor(flavorBuilder))); ProtonConfig.Builder protonBuilder = new ProtonConfig.Builder(); tuning.getConfig(protonBuilder); return new ProtonConfig(protonBuilder); } private static ProtonConfig getConfig(FlavorsConfig.Flavor.Builder flavorBuilder, ProtonConfig.Builder protonBuilder) { flavorBuilder.name("my_flavor"); - NodeFlavorTuning tuning = new NodeFlavorTuning(new ConfigFlavor(new FlavorsConfig.Flavor(flavorBuilder))); + NodeFlavorTuning tuning = new NodeFlavorTuning(new Flavor(new FlavorsConfig.Flavor(flavorBuilder))); tuning.getConfig(protonBuilder); return new ProtonConfig(protonBuilder); } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java b/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java index 010ff41ad1b..672e2932ab6 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java @@ -65,7 +65,7 @@ public class VespaModelTester { } public void addHosts(Flavor flavor, int count) { - addHosts(Optional.of(flavor), flavor.flavorName(), count); + addHosts(Optional.of(flavor), flavor.name(), count); } private Hosts addHosts(Optional<Flavor> flavor, String flavorName, int count) { diff --git a/config-provisioning/abi-spec.json b/config-provisioning/abi-spec.json index 32027a9e48c..af61fb46e50 100644 --- a/config-provisioning/abi-spec.json +++ b/config-provisioning/abi-spec.json @@ -343,48 +343,7 @@ "public static final enum com.yahoo.config.provision.Environment perf" ] }, - "com.yahoo.config.provision.Flavor$Bandwidth": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract double mbits()" - ], - "fields": [] - }, - "com.yahoo.config.provision.Flavor$Cpu": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract double cores()" - ], - "fields": [] - }, - "com.yahoo.config.provision.Flavor$Disk": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract double sizeInBase10Gb()", - "public double sizeInBase2Gb()", - "public abstract boolean isFast()" - ], - "fields": [] - }, - "com.yahoo.config.provision.Flavor$Environment": { + "com.yahoo.config.provision.Flavor$Type": { "superClass": "java.lang.Enum", "interfaces": [], "attributes": [ @@ -393,49 +352,46 @@ "enum" ], "methods": [ - "public static com.yahoo.config.provision.Flavor$Environment[] values()", - "public static com.yahoo.config.provision.Flavor$Environment valueOf(java.lang.String)" + "public static com.yahoo.config.provision.Flavor$Type[] values()", + "public static com.yahoo.config.provision.Flavor$Type valueOf(java.lang.String)" ], "fields": [ - "public static final enum com.yahoo.config.provision.Flavor$Environment BARE_METAL", - "public static final enum com.yahoo.config.provision.Flavor$Environment VIRTUAL_MACHINE", - "public static final enum com.yahoo.config.provision.Flavor$Environment DOCKER_CONTAINER" + "public static final enum com.yahoo.config.provision.Flavor$Type undefined", + "public static final enum com.yahoo.config.provision.Flavor$Type BARE_METAL", + "public static final enum com.yahoo.config.provision.Flavor$Type VIRTUAL_MACHINE", + "public static final enum com.yahoo.config.provision.Flavor$Type DOCKER_CONTAINER" ] }, - "com.yahoo.config.provision.Flavor$Memory": { - "superClass": "java.lang.Object", - "interfaces": [], - "attributes": [ - "public", - "interface", - "abstract" - ], - "methods": [ - "public abstract double sizeInGb()" - ], - "fields": [] - }, "com.yahoo.config.provision.Flavor": { "superClass": "java.lang.Object", "interfaces": [], "attributes": [ - "public", - "interface", - "abstract" + "public" ], "methods": [ - "public abstract java.lang.String flavorName()", + "public void <init>(com.yahoo.config.provisioning.FlavorsConfig$Flavor)", + "public java.lang.String name()", + "public int cost()", + "public boolean isStock()", + "public double getMinMainMemoryAvailableGb()", + "public double getMinDiskAvailableGb()", + "public boolean hasFastDisk()", + "public double getBandwidth()", + "public double getMinCpuCores()", + "public java.lang.String getDescription()", + "public boolean isRetired()", + "public com.yahoo.config.provision.Flavor$Type getType()", + "public boolean isDocker()", + "public int getIdealHeadroom()", "public java.lang.String canonicalName()", - "public abstract int cost()", - "public abstract boolean isStock()", - "public abstract boolean isRetired()", + "public boolean isCanonical()", + "public java.util.List replaces()", "public boolean satisfies(com.yahoo.config.provision.Flavor)", - "public abstract com.yahoo.config.provision.Flavor$Cpu cpu()", - "public abstract com.yahoo.config.provision.Flavor$Memory memory()", - "public abstract com.yahoo.config.provision.Flavor$Disk disk()", - "public abstract com.yahoo.config.provision.Flavor$Bandwidth bandwidth()", - "public abstract com.yahoo.config.provision.Flavor$Environment environment()", - "public abstract java.util.List replaces()" + "public void freeze()", + "public boolean isLargerThan(com.yahoo.config.provision.Flavor)", + "public int hashCode()", + "public boolean equals(java.lang.Object)", + "public java.lang.String toString()" ], "fields": [] }, @@ -591,13 +547,12 @@ "superClass": "java.lang.Object", "interfaces": [], "attributes": [ - "public", - "interface", - "abstract" + "public" ], "methods": [ - "public abstract java.util.List getFlavors()", - "public abstract java.util.Optional getFlavor(java.lang.String)", + "public void <init>(com.yahoo.config.provisioning.FlavorsConfig)", + "public java.util.List getFlavors()", + "public java.util.Optional getFlavor(java.lang.String)", "public com.yahoo.config.provision.Flavor getFlavorOrThrow(java.lang.String)" ], "fields": [] diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/AllocatedHosts.java b/config-provisioning/src/main/java/com/yahoo/config/provision/AllocatedHosts.java index 8cb72a36e7a..e2b2933ede3 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/AllocatedHosts.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/AllocatedHosts.java @@ -59,7 +59,7 @@ public class AllocatedHosts { cursor.setString(hostSpecMembership, membership.stringValue()); cursor.setString(hostSpecVespaVersion, membership.cluster().vespaVersion().toFullString()); }); - host.flavor().ifPresent(flavor -> cursor.setString(hostSpecFlavor, flavor.flavorName())); + host.flavor().ifPresent(flavor -> cursor.setString(hostSpecFlavor, flavor.name())); host.version().ifPresent(version -> cursor.setString(hostSpecCurrentVespaVersion, version.toFullString())); host.networkPorts().ifPresent(ports -> NetworkPortsSerializer.toSlime(ports, cursor.setArray(hostSpecNetworkPorts))); } 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 e2c39d6efda..79a17c23dd7 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,17 +1,93 @@ // 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.google.common.collect.ImmutableList; +import com.yahoo.config.provisioning.FlavorsConfig; + +import java.util.ArrayList; import java.util.List; /** - * A host flavor (type). + * A host flavor (type). This is a value object where the identity is the name. + * Use {@link NodeFlavors} to create a flavor. * * @author bratseth */ -public interface Flavor { +public class Flavor { + + private final String name; + private final int cost; + private final boolean isStock; + private final Type type; + private final double minCpuCores; + private final double minMainMemoryAvailableGb; + private final double minDiskAvailableGb; + private final boolean fastDisk; + private final double bandwidth; + private final String description; + private final boolean retired; + private List<Flavor> replacesFlavors; + private int idealHeadroom; // Note: Not used after Vespa 6.282 + + /** + * Creates a Flavor, but does not set the replacesFlavors. + * @param flavorConfig config to be used for Flavor. + */ + public Flavor(FlavorsConfig.Flavor flavorConfig) { + this.name = flavorConfig.name(); + this.replacesFlavors = new ArrayList<>(); + this.cost = flavorConfig.cost(); + this.isStock = flavorConfig.stock(); + this.type = Type.valueOf(flavorConfig.environment()); + this.minCpuCores = flavorConfig.minCpuCores(); + this.minMainMemoryAvailableGb = flavorConfig.minMainMemoryAvailableGb(); + this.minDiskAvailableGb = flavorConfig.minDiskAvailableGb(); + this.fastDisk = flavorConfig.fastDisk(); + this.bandwidth = flavorConfig.bandwidth(); + this.description = flavorConfig.description(); + this.retired = flavorConfig.retired(); + this.idealHeadroom = flavorConfig.idealHeadroom(); + } + + /** Returns the unique identity of this flavor */ + public String name() { return name; } + + /** + * Get the monthly cost (total cost of ownership) in USD for this flavor, typically total cost + * divided by 36 months. + * + * @return monthly cost in USD + */ + public int cost() { return cost; } + + public boolean isStock() { return isStock; } + + public double getMinMainMemoryAvailableGb() { return minMainMemoryAvailableGb; } - /** @return the unique identity of this flavor */ - String flavorName(); + public double getMinDiskAvailableGb() { return minDiskAvailableGb; } + + public boolean hasFastDisk() { return fastDisk; } + + public double getBandwidth() { return bandwidth; } + + public double getMinCpuCores() { return minCpuCores; } + + public String getDescription() { return description; } + + /** Returns whether the flavor is retired */ + public boolean isRetired() { + return retired; + } + + public Type getType() { return type; } + + /** Convenience, returns getType() == Type.DOCKER_CONTAINER */ + public boolean isDocker() { return type == Type.DOCKER_CONTAINER; } + + /** The free capacity we would like to preserve for this flavor */ + public int getIdealHeadroom() { + return idealHeadroom; + } /** * Returns the canonical name of this flavor - which is the name which should be used as an interface to users. @@ -26,85 +102,69 @@ public interface Flavor { * replace the canonical name we want. However, if a node replaces multiple names, we have no basis for choosing one * of them as the canonical, so we return the current as canonical. */ - default String canonicalName() { - return replaces().size() != 1 ? flavorName() : replaces().get(0).canonicalName(); + public String canonicalName() { + return isCanonical() ? name : replacesFlavors.get(0).canonicalName(); + } + + /** Returns whether this is a canonical flavor */ + public boolean isCanonical() { + return replacesFlavors.size() != 1; } - - /** @return the cost associated with usage of this flavor */ - int cost(); /** - * A stock flavor is any flavor we expect more of in the future. - * Stock flavors are assigned to applications by cost priority. - * - * Non-stock flavors are used for nodes for which a fixed amount has already been added - * to the system for some historical reason. These nodes are assigned to applications - * when available by exact match and ignoring cost. + * The flavors this (directly) replaces. + * This is immutable if this is frozen, and a mutable list otherwise. */ - boolean isStock(); - - /** Returns whether the flavor is retired (should no longer be allocated) */ - boolean isRetired(); + public List<Flavor> replaces() { return replacesFlavors; } /** * Returns whether this flavor satisfies the requested flavor, either directly * (by being the same), or by directly or indirectly replacing it */ - default boolean satisfies(Flavor flavor) { - if (equals(flavor)) { + public boolean satisfies(Flavor flavor) { + if (this.equals(flavor)) { return true; } - if (isRetired()) { + if (this.retired) { return false; } - for (Flavor replaces : replaces()) + for (Flavor replaces : replacesFlavors) if (replaces.satisfies(flavor)) return true; return false; } - Cpu cpu(); - - Memory memory(); - - Disk disk(); - - Bandwidth bandwidth(); - - Environment environment(); - - /** The flavors this (directly) replaces. */ - List<Flavor> replaces(); - - - interface Disk { - - /** @return Disk size in GB in base 10 (1GB = 10^9 bytes) */ - double sizeInBase10Gb(); - - /** @return Disk size in GB in base 2, also known as GiB (1GiB = 2^30 bytes), rounded to nearest integer value */ - default double sizeInBase2Gb() { - return Math.round(sizeInBase10Gb() / Math.pow(1.024, 3)); - } - - boolean isFast(); + /** Irreversibly freezes the content of this */ + public void freeze() { + replacesFlavors = ImmutableList.copyOf(replacesFlavors); } - - interface Memory { - double sizeInGb(); + + /** Returns whether this flavor has at least as much as each hardware resource as the given flavor */ + public boolean isLargerThan(Flavor other) { + return this.minCpuCores >= other.minCpuCores && + this.minDiskAvailableGb >= other.minDiskAvailableGb && + this.minMainMemoryAvailableGb >= other.minMainMemoryAvailableGb && + this.fastDisk || ! other.fastDisk; } - interface Cpu { - double cores(); - } + @Override + public int hashCode() { return name.hashCode(); } - interface Bandwidth { - double mbits(); + @Override + public boolean equals(Object other) { + if (other == this) return true; + if ( ! (other instanceof Flavor)) return false; + return ((Flavor)other).name.equals(this.name); } - enum Environment { + @Override + public String toString() { return "flavor '" + name + "'"; } + + public enum Type { + undefined, // Default value in config (flavors.def) BARE_METAL, VIRTUAL_MACHINE, DOCKER_CONTAINER } + } diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java b/config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java index 43ef5602d8a..e64028e216f 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java @@ -1,30 +1,88 @@ // 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.google.common.collect.ImmutableMap; +import com.google.inject.Inject; +import com.yahoo.config.provisioning.FlavorsConfig; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; /** * All the available node flavors. * - * @author freva + * @author bratseth */ -public interface NodeFlavors { +public class NodeFlavors { + + /** Flavors <b>which are configured</b> in this zone */ + private final ImmutableMap<String, Flavor> flavors; + + @Inject + public NodeFlavors(FlavorsConfig config) { + ImmutableMap.Builder<String, Flavor> b = new ImmutableMap.Builder<>(); + for (Flavor flavor : toFlavors(config)) + b.put(flavor.name(), flavor); + this.flavors = b.build(); + } - /** Returns list of all available flavors in the system */ - List<Flavor> getFlavors(); + public List<Flavor> getFlavors() { + return new ArrayList<>(flavors.values()); + } /** Returns a flavor by name, or empty if there is no flavor with this name. */ - Optional<Flavor> getFlavor(String name); + public Optional<Flavor> getFlavor(String name) { + return Optional.ofNullable(flavors.get(name)); + } /** Returns the flavor with the given name or throws an IllegalArgumentException if it does not exist */ - default Flavor getFlavorOrThrow(String flavorName) { + public Flavor getFlavorOrThrow(String flavorName) { return getFlavor(flavorName).orElseThrow(() -> new IllegalArgumentException("Unknown flavor '" + flavorName + "'. Flavors are " + canonicalFlavorNames())); } private List<String> canonicalFlavorNames() { - return getFlavors().stream().map(Flavor::canonicalName).distinct().sorted().collect(Collectors.toList()); + return flavors.values().stream().map(Flavor::canonicalName).distinct().sorted().collect(Collectors.toList()); } + + private static Collection<Flavor> toFlavors(FlavorsConfig config) { + Map<String, Flavor> flavors = new HashMap<>(); + // First pass, create all flavors, but do not include flavorReplacesConfig. + for (FlavorsConfig.Flavor flavorConfig : config.flavor()) { + flavors.put(flavorConfig.name(), new Flavor(flavorConfig)); + } + // Second pass, set flavorReplacesConfig to point to correct flavor. + for (FlavorsConfig.Flavor flavorConfig : config.flavor()) { + Flavor flavor = flavors.get(flavorConfig.name()); + for (FlavorsConfig.Flavor.Replaces flavorReplacesConfig : flavorConfig.replaces()) { + if (! flavors.containsKey(flavorReplacesConfig.name())) { + throw new IllegalStateException("Replaces for " + flavor.name() + + " pointing to a non existing flavor: " + flavorReplacesConfig.name()); + } + flavor.replaces().add(flavors.get(flavorReplacesConfig.name())); + } + flavor.freeze(); + } + // Third pass, ensure that retired flavors have a replacement + for (Flavor flavor : flavors.values()) { + if (flavor.isRetired() && !hasReplacement(flavors.values(), flavor)) { + throw new IllegalStateException( + String.format("Flavor '%s' is retired, but has no replacement", flavor.name()) + ); + } + } + return flavors.values(); + } + + private static boolean hasReplacement(Collection<Flavor> flavors, Flavor flavor) { + return flavors.stream() + .filter(f -> !f.equals(flavor)) + .anyMatch(f -> f.satisfies(flavor)); + } + } diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/internal/ConfigFlavor.java b/config-provisioning/src/main/java/com/yahoo/config/provision/internal/ConfigFlavor.java deleted file mode 100644 index e70476455cd..00000000000 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/internal/ConfigFlavor.java +++ /dev/null @@ -1,172 +0,0 @@ -// 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.internal; - -import com.google.common.collect.ImmutableList; -import com.yahoo.config.provision.Flavor; -import com.yahoo.config.provisioning.FlavorsConfig; - -import java.util.ArrayList; -import java.util.List; - -/** - * A {@link Flavor} generated from config. - * - * @author freva - */ -public class ConfigFlavor implements Flavor { - - private final String name; - private final int cost; - private final boolean isStock; - private final Environment environment; - private final Cpu cpu; - private final Memory memory; - private final Disk disk; - private final Bandwidth bandwidth; - private final boolean retired; - private List<Flavor> replacesFlavors; - - /** - * Creates a Flavor, but does not set the replacesFlavors. - * @param flavorConfig config to be used for Flavor. - */ - public ConfigFlavor(FlavorsConfig.Flavor flavorConfig) { - this.name = flavorConfig.name(); - this.replacesFlavors = new ArrayList<>(); - this.cost = flavorConfig.cost(); - this.isStock = flavorConfig.stock(); - this.environment = Environment.valueOf(flavorConfig.environment()); - this.cpu = new ConfigCpu(flavorConfig.cpu()); - this.memory = new ConfigMemory(flavorConfig.memory()); - this.disk = new ConfigDisk(flavorConfig.disk()); - this.bandwidth = new ConfigBandwidth(flavorConfig.bandwidth()); - this.retired = flavorConfig.retired(); - } - - @Override - public String flavorName() { - return name; - } - - @Override - public int cost() { - return cost; - } - - @Override - public boolean isStock() { - return isStock; - } - - @Override - public boolean isRetired() { - return retired; - } - - @Override - public Cpu cpu() { - return cpu; - } - - @Override - public Memory memory() { - return memory; - } - - @Override - public Disk disk() { - return disk; - } - - @Override - public Bandwidth bandwidth() { - return bandwidth; - } - - @Override - public Environment environment() { - return environment; - } - - @Override - public List<Flavor> replaces() { - return replacesFlavors; - } - - /** Irreversibly freezes the content of this */ - public void freeze() { - replacesFlavors = ImmutableList.copyOf(replacesFlavors); - } - - @Override - public int hashCode() { return name.hashCode(); } - - @Override - public boolean equals(Object other) { - if (other == this) return true; - if ( ! (other instanceof ConfigFlavor)) return false; - return ((ConfigFlavor)other).name.equals(this.name); - } - - @Override - public String toString() { return "flavor '" + name + "'"; } - - private class ConfigCpu implements Flavor.Cpu { - private final double cores; - - private ConfigCpu(FlavorsConfig.Flavor.Cpu cpu) { - this.cores = cpu.cores(); - } - - @Override - public double cores() { - return cores; - } - } - - private class ConfigMemory implements Flavor.Memory { - private final double sizeInGb; - - private ConfigMemory(FlavorsConfig.Flavor.Memory memory) { - this.sizeInGb = memory.sizeInGb(); - } - - @Override - public double sizeInGb() { - return sizeInGb; - } - } - - private class ConfigDisk implements Flavor.Disk { - private final double sizeInBase10; - private final boolean isFast; - - private ConfigDisk(FlavorsConfig.Flavor.Disk disk) { - this.sizeInBase10 = disk.sizeInGb(); - this.isFast = disk.fast(); - } - - @Override - public double sizeInBase10Gb() { - return sizeInBase10; - } - - @Override - public boolean isFast() { - return isFast; - } - } - - private class ConfigBandwidth implements Flavor.Bandwidth { - private final double mbits; - - private ConfigBandwidth(FlavorsConfig.Flavor.Bandwidth bandwidth) { - this.mbits = bandwidth.mbits(); - } - - @Override - public double mbits() { - return mbits; - } - } -} diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/internal/ConfigNodeFlavors.java b/config-provisioning/src/main/java/com/yahoo/config/provision/internal/ConfigNodeFlavors.java deleted file mode 100644 index c67a3faf36f..00000000000 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/internal/ConfigNodeFlavors.java +++ /dev/null @@ -1,83 +0,0 @@ -// 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.internal; - -import com.google.common.collect.ImmutableMap; -import com.google.inject.Inject; -import com.yahoo.config.provision.Flavor; -import com.yahoo.config.provision.NodeFlavors; -import com.yahoo.config.provisioning.FlavorsConfig; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -/** - * {@link NodeFlavors} generated from config - * - * @author bratseth - */ -public class ConfigNodeFlavors implements NodeFlavors { - - /** Flavors <b>which are configured</b> in this zone */ - private final Map<String, Flavor> flavors; - - @Inject - public ConfigNodeFlavors(FlavorsConfig config) { - this(toFlavors(config)); - } - - public ConfigNodeFlavors(Collection<Flavor> flavors) { - ImmutableMap.Builder<String, Flavor> b = new ImmutableMap.Builder<>(); - for (Flavor flavor : flavors) - b.put(flavor.flavorName(), flavor); - this.flavors = b.build(); - } - - public List<Flavor> getFlavors() { - return new ArrayList<>(flavors.values()); - } - - /** Returns a flavor by name, or empty if there is no flavor with this name. */ - public Optional<Flavor> getFlavor(String name) { - return Optional.ofNullable(flavors.get(name)); - } - - private static Collection<Flavor> toFlavors(FlavorsConfig config) { - Map<String, Flavor> flavors = new HashMap<>(); - // First pass, create all flavors, but do not include flavorReplacesConfig. - for (FlavorsConfig.Flavor flavorConfig : config.flavor()) { - flavors.put(flavorConfig.name(), new ConfigFlavor(flavorConfig)); - } - // Second pass, set flavorReplacesConfig to point to correct flavor. - for (FlavorsConfig.Flavor flavorConfig : config.flavor()) { - Flavor flavor = flavors.get(flavorConfig.name()); - for (FlavorsConfig.Flavor.Replaces flavorReplacesConfig : flavorConfig.replaces()) { - if (! flavors.containsKey(flavorReplacesConfig.name())) { - throw new IllegalStateException("Replaces for " + flavor.flavorName() + - " pointing to a non existing flavor: " + flavorReplacesConfig.name()); - } - flavor.replaces().add(flavors.get(flavorReplacesConfig.name())); - } - ((ConfigFlavor) flavor).freeze(); - } - // Third pass, ensure that retired flavors have a replacement - for (Flavor flavor : flavors.values()) { - if (flavor.isRetired() && !hasReplacement(flavors.values(), flavor)) { - throw new IllegalStateException( - String.format("Flavor '%s' is retired, but has no replacement", flavor.flavorName()) - ); - } - } - return flavors.values(); - } - - private static boolean hasReplacement(Collection<Flavor> flavors, Flavor flavor) { - return flavors.stream() - .filter(f -> !f.equals(flavor)) - .anyMatch(f -> f.satisfies(flavor)); - } - -} diff --git a/config-provisioning/src/main/resources/configdefinitions/flavors.def b/config-provisioning/src/main/resources/configdefinitions/flavors.def index d46f49b728d..1e40f6f8f36 100644 --- a/config-provisioning/src/main/resources/configdefinitions/flavors.def +++ b/config-provisioning/src/main/resources/configdefinitions/flavors.def @@ -26,22 +26,29 @@ flavor[].cost int default=0 flavor[].stock bool default=true # The type of node: BARE_METAL, VIRTUAL_MACHINE or DOCKER_CONTAINER -flavor[].environment string default="BARE_METAL" +flavor[].environment string default="undefined" # The minimum number of CPU cores available. -flavor[].cpu.cores double default=0.0 +flavor[].minCpuCores double default=0.0 # The minimum amount of main memory available. -flavor[].memory.sizeInGb double default=0.0 +flavor[].minMainMemoryAvailableGb double default=0.0 -# The minimum amount of disk available in GB in base 10 (1GB = 10^9 bytes) -flavor[].disk.sizeInGb double default=0.0 +# The minimum amount of disk available. +flavor[].minDiskAvailableGb double default=0.0 # Whether the disk is fast (typically SSD) or slow (typically spinning HDD). -flavor[].disk.fast bool default=true +flavor[].fastDisk bool default=true # Expected network interface bandwidth available for this flavor, in Mbit/s. -flavor[].bandwidth.mbits double default=0.0 +flavor[].bandwidth double default=0.0 + +# Human readable free text for description of node. +flavor[].description string default="" # The flavor is retired and should no longer be used. flavor[].retired bool default=false + +# The free capacity we would like to preserve for this flavor +# Note: Not used after Vespa 6.282 +flavor[].idealHeadroom int default=0 diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/internal/ConfigNodeFlavorsTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/NodeFlavorsTest.java index 715493a353a..55ffa821e26 100644 --- a/config-provisioning/src/test/java/com/yahoo/config/provision/internal/ConfigNodeFlavorsTest.java +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/NodeFlavorsTest.java @@ -1,7 +1,6 @@ // 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.internal; +package com.yahoo.config.provision; -import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provisioning.FlavorsConfig; import org.junit.Rule; import org.junit.Test; @@ -14,7 +13,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; -public class ConfigNodeFlavorsTest { +public class NodeFlavorsTest { @Rule public final ExpectedException exception = ExpectedException.none(); @@ -32,7 +31,7 @@ public class ConfigNodeFlavorsTest { FlavorsConfig config = new FlavorsConfig(builder); exception.expect(IllegalStateException.class); exception.expectMessage("Replaces for strawberry pointing to a non existing flavor: non-existing-config"); - new ConfigNodeFlavors(config); + new NodeFlavors(config); } @Test @@ -53,7 +52,7 @@ public class ConfigNodeFlavorsTest { } builder.flavor(flavorBuilderList); FlavorsConfig config = new FlavorsConfig(builder); - NodeFlavors nodeFlavors = new ConfigNodeFlavors(config); + NodeFlavors nodeFlavors = new NodeFlavors(config); assertThat(nodeFlavors.getFlavor("banana").get().cost(), is(3)); } @@ -75,7 +74,7 @@ public class ConfigNodeFlavorsTest { FlavorsConfig config = new FlavorsConfig(builder); exception.expect(IllegalStateException.class); exception.expectMessage("Flavor 'retired' is retired, but has no replacement"); - new ConfigNodeFlavors(config); + new NodeFlavors(config); } } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/SuperModelRequestHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/SuperModelRequestHandlerTest.java index bfceab782ba..3288b418bb1 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/SuperModelRequestHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/SuperModelRequestHandlerTest.java @@ -2,17 +2,17 @@ package com.yahoo.vespa.config.server; import com.yahoo.cloud.config.ConfigserverConfig; -import com.yahoo.component.Version; import com.yahoo.config.model.application.provider.FilesApplicationPackage; -import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.NodeFlavors; -import com.yahoo.config.provision.internal.ConfigNodeFlavors; +import com.yahoo.component.Version; import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.vespa.config.server.application.Application; +import com.yahoo.config.provision.ApplicationId; import com.yahoo.vespa.config.server.application.ApplicationSet; import com.yahoo.vespa.config.server.monitoring.MetricUpdater; import com.yahoo.vespa.curator.mock.MockCurator; import com.yahoo.vespa.model.VespaModel; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -26,11 +26,7 @@ import java.util.Arrays; import java.util.Optional; import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; /** * @author Ulf Lilleengen @@ -134,7 +130,7 @@ public class SuperModelRequestHandlerTest { } public static NodeFlavors emptyNodeFlavors() { - return new ConfigNodeFlavors(new FlavorsConfig(new FlavorsConfig.Builder())); + return new NodeFlavors(new FlavorsConfig(new FlavorsConfig.Builder())); } private ApplicationId applicationId(String tenantName, String applicationName) { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/zookeeper/ZKApplicationPackageTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/zookeeper/ZKApplicationPackageTest.java index b381ba580bc..e8e2dd07756 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/zookeeper/ZKApplicationPackageTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/zookeeper/ZKApplicationPackageTest.java @@ -1,15 +1,27 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server.zookeeper; -import com.yahoo.component.Version; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertThat; + +import java.io.File; +import java.io.IOException; +import java.io.Reader; +import java.util.Collections; +import java.util.Optional; +import java.util.regex.Pattern; + import com.yahoo.config.application.api.DeploymentSpec; import com.yahoo.config.model.deploy.DeployState; -import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.HostSpec; -import com.yahoo.config.provision.internal.ConfigNodeFlavors; +import com.yahoo.config.provision.NodeFlavors; +import com.yahoo.config.provision.AllocatedHosts; +import com.yahoo.component.Version; import com.yahoo.config.provisioning.FlavorsConfig; -import com.yahoo.io.IOUtils; import com.yahoo.path.Path; import com.yahoo.text.Utf8; import com.yahoo.vespa.curator.mock.MockCurator; @@ -18,18 +30,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import java.io.File; -import java.io.IOException; -import java.io.Reader; -import java.util.Collections; -import java.util.Optional; -import java.util.regex.Pattern; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import com.yahoo.io.IOUtils; public class ZKApplicationPackageTest { @@ -92,7 +93,7 @@ public class ZKApplicationPackageTest { zk.putData("/0/" + ZKApplicationPackage.allocatedHostsNode, ALLOCATED_HOSTS.toJson()); } - private static class MockNodeFlavors extends ConfigNodeFlavors { + private static class MockNodeFlavors extends NodeFlavors{ MockNodeFlavors() { super(flavorsConfig()); } diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/NodeRepositoryNode.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/NodeRepositoryNode.java index 1df901940db..17c09e19fe2 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/NodeRepositoryNode.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/NodeRepositoryNode.java @@ -82,6 +82,8 @@ public class NodeRepositoryNode { private Integer cost; @JsonProperty("minCpuCores") private Double minCpuCores; + @JsonProperty("description") + private String description; @JsonProperty("history") private NodeHistory[] history; @JsonProperty("allowedToBeDown") @@ -345,6 +347,14 @@ public class NodeRepositoryNode { this.minCpuCores = minCpuCores; } + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + public NodeHistory[] getHistory() { return history; } @@ -426,9 +436,10 @@ public class NodeRepositoryNode { ", minMainMemoryAvailableGb=" + minMainMemoryAvailableGb + ", cost=" + cost + ", minCpuCores=" + minCpuCores + + ", description='" + description + '\'' + ", history=" + Arrays.toString(history) + ", allowedToBeDown=" + allowedToBeDown + - ", reports=" + reports + + ", reports=" + reports + ", modelName=" + modelName + '}'; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java index 18ff2700b21..7dc2aff18dc 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java @@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableSet; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ClusterMembership; import com.yahoo.config.provision.Flavor; +import com.yahoo.config.provision.NetworkPorts; import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.Allocation; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java index 50995887982..bfb7bfe9dae 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java @@ -46,12 +46,12 @@ public class NodeList implements Iterable<Node> { /** Returns the subset of nodes of the given flavor */ public NodeList flavor(String flavor) { - return filter(node -> node.flavor().flavorName().equals(flavor)); + return filter(node -> node.flavor().name().equals(flavor)); } /** Returns the subset of nodes which does not have the given flavor */ public NodeList notFlavor(String flavor) { - return filter(node -> ! node.flavor().flavorName().equals(flavor)); + return filter(node -> ! node.flavor().name().equals(flavor)); } /** Returns the subset of nodes assigned to the given cluster type */ diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java index 08fea05bb7a..b048dca99a3 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java @@ -17,8 +17,8 @@ import com.yahoo.transaction.NestedTransaction; import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.hosted.provision.flag.Flags; import com.yahoo.vespa.hosted.provision.lb.LoadBalancer; -import com.yahoo.vespa.hosted.provision.lb.LoadBalancerInstance; import com.yahoo.vespa.hosted.provision.lb.LoadBalancerList; +import com.yahoo.vespa.hosted.provision.lb.LoadBalancerInstance; import com.yahoo.vespa.hosted.provision.maintenance.PeriodicApplicationMaintainer; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.NodeAcl; @@ -309,7 +309,7 @@ public class NodeRepository extends AbstractComponent { // the nodes list was computed public List<Node> addDockerNodes(List<Node> nodes, Mutex allocationLock) { for (Node node : nodes) { - if (!node.flavor().environment().equals(Flavor.Environment.DOCKER_CONTAINER)) { + if (!node.flavor().getType().equals(Flavor.Type.DOCKER_CONTAINER)) { throw new IllegalArgumentException("Cannot add " + node.hostname() + ": This is not a docker node"); } if (!node.allocation().isPresent()) { @@ -538,7 +538,7 @@ public class NodeRepository extends AbstractComponent { */ public Node markNodeAvailableForNewAllocation(String hostname, Agent agent, String reason) { Node node = getNode(hostname).orElseThrow(() -> new NotFoundException("No node with hostname '" + hostname + "'")); - if (node.flavor().environment() == Flavor.Environment.DOCKER_CONTAINER && node.type() == NodeType.tenant) { + if (node.flavor().getType() == Flavor.Type.DOCKER_CONTAINER && node.type() == NodeType.tenant) { if (node.state() != Node.State.dirty) { throw new IllegalArgumentException( "Cannot make " + hostname + " available for new allocation, must be in state dirty, but was in " + node.state()); @@ -592,13 +592,13 @@ public class NodeRepository extends AbstractComponent { throw new IllegalArgumentException("Node is currently allocated and cannot be removed: " + node.allocation().get()); } - if (node.flavor().environment() == Flavor.Environment.DOCKER_CONTAINER && !deletingAsChild) { + if (node.flavor().getType() == Flavor.Type.DOCKER_CONTAINER && !deletingAsChild) { if (node.state() != Node.State.ready) { throw new IllegalArgumentException( String.format("Docker container %s can only be removed when in ready state", node.hostname())); } - } else if (node.flavor().environment() == Flavor.Environment.DOCKER_CONTAINER) { + } else if (node.flavor().getType() == Flavor.Type.DOCKER_CONTAINER) { Set<Node.State> legalStates = EnumSet.of(Node.State.provisioned, Node.State.failed, Node.State.parked, Node.State.ready); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java index 1b0a0b22a94..1b18dfc46c1 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java @@ -123,7 +123,7 @@ public class FailedExpirer extends Maintainer { /** Returns whether the current node fail count should be used as an indicator of hardware issue */ private boolean failCountIndicatesHardwareIssue(Node node) { - if (node.flavor().environment() == Flavor.Environment.DOCKER_CONTAINER) return false; + if (node.flavor().getType() == Flavor.Type.DOCKER_CONTAINER) return false; return (zone.environment() == Environment.prod || zone.environment() == Environment.staging) && node.status().failCount() >= maxAllowedFailures; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java index 012f1b881bd..42dbcdf7a86 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java @@ -14,6 +14,7 @@ import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.node.Allocation; import com.yahoo.vespa.hosted.provision.node.History; import com.yahoo.vespa.hosted.provision.provisioning.DockerHostCapacity; +import com.yahoo.vespa.orchestrator.HostNameNotFoundException; import com.yahoo.vespa.orchestrator.Orchestrator; import com.yahoo.vespa.orchestrator.status.HostStatus; import com.yahoo.vespa.service.monitor.ServiceMonitor; @@ -225,10 +226,10 @@ public class MetricsReporter extends Maintainer { metric.set("hostedVespa.docker.freeCapacityDisk", capacity.getFreeCapacityTotal().getDisk(), null); List<Flavor> dockerFlavors = nodeRepository().getAvailableFlavors().getFlavors().stream() - .filter(f -> f.environment().equals(Flavor.Environment.DOCKER_CONTAINER)) + .filter(f -> f.getType().equals(Flavor.Type.DOCKER_CONTAINER)) .collect(Collectors.toList()); for (Flavor flavor : dockerFlavors) { - Metric.Context context = getContextAt("flavor", flavor.flavorName()); + Metric.Context context = getContextAt("flavor", flavor.name()); metric.set("hostedVespa.docker.freeCapacityFlavor", capacity.freeCapacityInFlavorEquivalence(flavor), context); metric.set("hostedVespa.docker.hostsAvailableFlavor", capacity.getNofHostsAvailableFor(flavor), context); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooter.java index b5bbf045cf0..8f30394a239 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooter.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRebooter.java @@ -40,7 +40,7 @@ public class NodeRebooter extends Maintainer { EnumSet<Node.State> targetStates = EnumSet.of(Node.State.active, Node.State.ready); List<Node> nodesToReboot = nodeRepository().getNodes().stream() .filter(node -> targetStates.contains(node.state())) - .filter(node -> node.flavor().environment() != Flavor.Environment.DOCKER_CONTAINER) + .filter(node -> node.flavor().getType() != Flavor.Type.DOCKER_CONTAINER) .filter(this::shouldReboot) .collect(Collectors.toList()); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirer.java index 56d175126ed..3113aaf45cc 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirer.java @@ -154,7 +154,7 @@ public class NodeRetirer extends Maintainer { nodesToRetire.forEach(node -> retirementPolicy.shouldRetire(node).ifPresent(reason -> { log.info("Setting wantToRetire and wantToDeprovision for host " + node.hostname() + - " with flavor " + node.flavor().flavorName() + + " with flavor " + node.flavor().name() + " allocated to " + node.allocation().get().owner() + ". Reason: " + reason); Node updatedNode = node.with(node.status() diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/retire/RetireIPv4OnlyNodes.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/retire/RetireIPv4OnlyNodes.java index d6981cbd7f2..6562a89c2d6 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/retire/RetireIPv4OnlyNodes.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/retire/RetireIPv4OnlyNodes.java @@ -51,7 +51,7 @@ public class RetireIPv4OnlyNodes implements RetirementPolicy { @Override public Optional<String> shouldRetire(Node node) { - if (node.flavor().environment() == Flavor.Environment.VIRTUAL_MACHINE) return Optional.empty(); + if (node.flavor().getType() == Flavor.Type.VIRTUAL_MACHINE) return Optional.empty(); boolean shouldRetire = node.ipAddresses().stream() .map(InetAddresses::forString) .allMatch(address -> address instanceof Inet4Address); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeHostFilter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeHostFilter.java index e9f69abf81b..ed66d085972 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeHostFilter.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeHostFilter.java @@ -25,7 +25,7 @@ public class NodeHostFilter extends NodeFilter { @Override public boolean matches(Node node) { - if ( ! filter.matches(node.hostname(), node.flavor().flavorName(), membership(node))) return false; + if ( ! filter.matches(node.hostname(), node.flavor().name(), membership(node))) return false; return nextMatches(node); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java index 9f32517db41..bb4dab3b97b 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java @@ -8,9 +8,10 @@ import com.yahoo.config.provision.ApplicationName; import com.yahoo.config.provision.ClusterMembership; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.InstanceName; -import com.yahoo.config.provision.NetworkPortsSerializer; import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeType; +import com.yahoo.config.provision.NetworkPorts; +import com.yahoo.config.provision.NetworkPortsSerializer; import com.yahoo.config.provision.TenantName; import com.yahoo.slime.ArrayTraverser; import com.yahoo.slime.Cursor; @@ -112,7 +113,7 @@ public class NodeSerializer { toSlime(node.ipAddressPool().asSet(), object.setArray(ipAddressPoolKey), IP::requireAddressPool); object.setString(idKey, node.id()); node.parentHostname().ifPresent(hostname -> object.setString(parentHostnameKey, hostname)); - object.setString(flavorKey, node.flavor().flavorName()); + object.setString(flavorKey, node.flavor().name()); object.setLong(rebootGenerationKey, node.status().reboot().wanted()); object.setLong(currentRebootGenerationKey, node.status().reboot().current()); node.status().vespaVersion().ifPresent(version -> object.setString(vespaVersionKey, version.toString())); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java index 29bab6e73e7..e437badf0dc 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java @@ -4,11 +4,12 @@ package com.yahoo.vespa.hosted.provision.provisioning; import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Environment; -import com.yahoo.config.provision.Flavor; -import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; +import com.yahoo.config.provision.Flavor; +import com.yahoo.config.provision.NodeFlavors; + import java.util.Arrays; import java.util.Optional; @@ -44,7 +45,7 @@ public class CapacityPolicies { // for now, always use the requested flavor if a docker flavor is requested Optional<String> requestedFlavor = requestedCapacity.flavor(); if (requestedFlavor.isPresent() && - flavors.getFlavorOrThrow(requestedFlavor.get()).environment() == Flavor.Environment.DOCKER_CONTAINER) + flavors.getFlavorOrThrow(requestedFlavor.get()).getType() == Flavor.Type.DOCKER_CONTAINER) return flavors.getFlavorOrThrow(requestedFlavor.get()); String defaultFlavorName = zone.defaultFlavor(cluster.type()); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java index c306ff6514c..cff62508ec6 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java @@ -1,10 +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.vespa.hosted.provision.provisioning; +import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.NodeFlavors; -import com.yahoo.config.provision.internal.ConfigNodeFlavors; -import com.yahoo.config.provisioning.FlavorsConfig; /** * Simplifies creation of a node-repository config containing flavors. @@ -20,13 +19,27 @@ public class FlavorConfigBuilder { return new FlavorsConfig(builder); } - public FlavorsConfig.Flavor.Builder addFlavor(String flavorName, double cpu, double mem, double disk, Flavor.Environment environment) { - FlavorsConfig.Flavor.Builder flavor = new FlavorsConfig.Flavor.Builder() - .name(flavorName) - .disk(new FlavorsConfig.Flavor.Disk.Builder().sizeInGb(disk)) - .cpu(new FlavorsConfig.Flavor.Cpu.Builder().cores(cpu)) - .memory(new FlavorsConfig.Flavor.Memory.Builder().sizeInGb(mem)) - .environment(environment.name()); + public FlavorsConfig.Flavor.Builder addFlavor(String flavorName, double cpu, double mem, double disk, Flavor.Type type) { + FlavorsConfig.Flavor.Builder flavor = new FlavorsConfig.Flavor.Builder(); + flavor.name(flavorName); + flavor.description("Flavor-name-is-" + flavorName); + flavor.minDiskAvailableGb(disk); + flavor.minCpuCores(cpu); + flavor.minMainMemoryAvailableGb(mem); + flavor.environment(type.name()); + builder.flavor(flavor); + return flavor; + } + + public FlavorsConfig.Flavor.Builder addNonStockFlavor(String flavorName, double cpu, double mem, double disk, Flavor.Type type) { + FlavorsConfig.Flavor.Builder flavor = new FlavorsConfig.Flavor.Builder(); + flavor.name(flavorName); + flavor.description("Flavor-name-is-" + flavorName); + flavor.minDiskAvailableGb(disk); + flavor.minCpuCores(cpu); + flavor.minMainMemoryAvailableGb(mem); + flavor.stock(false); + flavor.environment(type.name()); builder.flavor(flavor); return flavor; } @@ -47,14 +60,14 @@ public class FlavorConfigBuilder { FlavorConfigBuilder flavorConfigBuilder = new FlavorConfigBuilder(); for (String flavorName : flavors) { if (flavorName.equals("docker")) - flavorConfigBuilder.addFlavor(flavorName, 1. /* cpu*/, 3. /* mem GB*/, 2. /*disk GB*/, Flavor.Environment.DOCKER_CONTAINER); + flavorConfigBuilder.addFlavor(flavorName, 1. /* cpu*/, 3. /* mem GB*/, 2. /*disk GB*/, Flavor.Type.DOCKER_CONTAINER); else if (flavorName.equals("docker2")) - flavorConfigBuilder.addFlavor(flavorName, 2. /* cpu*/, 4. /* mem GB*/, 4. /*disk GB*/, Flavor.Environment.DOCKER_CONTAINER); + flavorConfigBuilder.addFlavor(flavorName, 2. /* cpu*/, 4. /* mem GB*/, 4. /*disk GB*/, Flavor.Type.DOCKER_CONTAINER); else if (flavorName.equals("host")) - flavorConfigBuilder.addFlavor(flavorName, 7. /* cpu*/, 10. /* mem GB*/, 12. /*disk GB*/, Flavor.Environment.BARE_METAL); + flavorConfigBuilder.addFlavor(flavorName, 7. /* cpu*/, 10. /* mem GB*/, 12. /*disk GB*/, Flavor.Type.BARE_METAL); else - flavorConfigBuilder.addFlavor(flavorName, 1. /* cpu*/, 3. /* mem GB*/, 2. /*disk GB*/, Flavor.Environment.BARE_METAL); + flavorConfigBuilder.addFlavor(flavorName, 1. /* cpu*/, 3. /* mem GB*/, 2. /*disk GB*/, Flavor.Type.BARE_METAL); } - return new ConfigNodeFlavors(flavorConfigBuilder.build()); + return new NodeFlavors(flavorConfigBuilder.build()); } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorSpareCount.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorSpareCount.java index dd8b84e350d..217f4999bfb 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorSpareCount.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorSpareCount.java @@ -98,6 +98,6 @@ public class FlavorSpareCount { @Override public String toString() { - return flavor.flavorName() + " has " + numReady + " ready nodes and " + numActive + " active nodes"; + return flavor.name() + " has " + numReady + " ready nodes and " + numActive + " active nodes"; } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java index f9093575784..dcc3c4a0ef8 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java @@ -285,7 +285,7 @@ class NodeAllocation { .filter(NodeSpec.CountNodeSpec.class::isInstance) .map(NodeSpec.CountNodeSpec.class::cast) .map(spec -> new FlavorCount(spec.getFlavor(), spec.fulfilledDeficitCount(acceptedOfRequestedFlavor))) - .filter(flavorCount -> flavorCount.getFlavor().environment() == Flavor.Environment.DOCKER_CONTAINER) + .filter(flavorCount -> flavorCount.getFlavor().getType() == Flavor.Type.DOCKER_CONTAINER) .filter(flavorCount -> flavorCount.getCount() > 0); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java index 820c0d2914b..861e1062d66 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java @@ -248,7 +248,7 @@ class NodePrioritizer { private boolean isDocker() { Flavor flavor = getFlavor(requestedNodes); - return (flavor != null) && flavor.environment().equals(Flavor.Environment.DOCKER_CONTAINER); + return (flavor != null) && flavor.getType().equals(Flavor.Type.DOCKER_CONTAINER); } private static int compareForRelocation(Node a, Node b) { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java index 0d49b036acb..e033d994f24 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java @@ -1,8 +1,8 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.provision.provisioning; -import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.NodeType; +import com.yahoo.config.provision.Flavor; import com.yahoo.vespa.hosted.provision.Node; import java.util.Objects; @@ -142,7 +142,7 @@ public interface NodeSpec { private boolean requestedFlavorCanBeAchievedByResizing(Flavor flavor) { // TODO: Enable this when we can do it safely // Then also re-enable ProvisioningTest.application_deployment_with_inplace_downsize() - // return flavor.isDockerContainer() && requestedFlavor.isDockerContainer() && flavor.isLargerThan(requestedFlavor); + // return flavor.isDocker() && requestedFlavor.isDocker() && flavor.isLargerThan(requestedFlavor); return false; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ResourceCapacity.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ResourceCapacity.java index 4262bda7824..903951ef93b 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ResourceCapacity.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ResourceCapacity.java @@ -28,7 +28,7 @@ public class ResourceCapacity { static ResourceCapacity of(Flavor flavor) { return new ResourceCapacity( - flavor.memory().sizeInGb(), flavor.cpu().cores(), flavor.disk().sizeInBase10Gb()); + flavor.getMinMainMemoryAvailableGb(), flavor.getMinCpuCores(), flavor.getMinDiskAvailableGb()); } static ResourceCapacity of(Node node) { @@ -72,9 +72,9 @@ public class ResourceCapacity { int freeCapacityInFlavorEquivalence(Flavor flavor) { if (!hasCapacityFor(ResourceCapacity.of(flavor))) return 0; - double memoryFactor = Math.floor(memory/flavor.memory().sizeInGb()); - double cpuFactor = Math.floor(cpu/flavor.cpu().cores()); - double diskFactor = Math.floor(disk/flavor.disk().sizeInBase10Gb()); + double memoryFactor = Math.floor(memory/flavor.getMinMainMemoryAvailableGb()); + double cpuFactor = Math.floor(cpu/flavor.getMinCpuCores()); + double diskFactor = Math.floor(disk/flavor.getMinDiskAvailableGb()); return (int) Math.min(Math.min(memoryFactor, cpuFactor), diskFactor); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java index 5e9f7a78a10..1254664eb78 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java @@ -142,16 +142,18 @@ class NodesResponse extends HttpResponse { object.setString("parentHostname", node.parentHostname().get()); } object.setString("openStackId", node.id()); - object.setString("flavor", node.flavor().flavorName()); + object.setString("flavor", node.flavor().name()); object.setString("canonicalFlavor", node.flavor().canonicalName()); - object.setDouble("minDiskAvailableGb", node.flavor().disk().sizeInBase10Gb()); - object.setDouble("minMainMemoryAvailableGb", node.flavor().memory().sizeInGb()); - object.setDouble("minCpuCores", node.flavor().cpu().cores()); + object.setDouble("minDiskAvailableGb", node.flavor().getMinDiskAvailableGb()); + object.setDouble("minMainMemoryAvailableGb", node.flavor().getMinMainMemoryAvailableGb()); + if (node.flavor().getDescription() != null && ! node.flavor().getDescription().isEmpty()) + object.setString("description", node.flavor().getDescription()); + object.setDouble("minCpuCores", node.flavor().getMinCpuCores()); if (node.flavor().cost() > 0) object.setLong("cost", node.flavor().cost()); - object.setBool("fastDisk", node.flavor().disk().isFast()); - object.setDouble("bandwidth", node.flavor().bandwidth().mbits()); - object.setString("environment", node.flavor().environment().name()); + object.setBool("fastDisk", node.flavor().hasFastDisk()); + object.setDouble("bandwidth", node.flavor().getBandwidth()); + object.setString("environment", node.flavor().getType().name()); node.allocation().ifPresent(allocation -> { toSlime(allocation.owner(), object.setObject("owner")); toSlime(allocation.membership(), object.setObject("membership")); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeFlavors.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeFlavors.java index 8e456fe4703..241a797cd1b 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeFlavors.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeFlavors.java @@ -1,16 +1,16 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.provision.testutils; -import com.yahoo.config.provision.Flavor; -import com.yahoo.config.provision.internal.ConfigNodeFlavors; import com.yahoo.config.provisioning.FlavorsConfig; +import com.yahoo.config.provision.Flavor; +import com.yahoo.config.provision.NodeFlavors; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; /** * A mock repository prepopulated with flavors, to avoid having config. * Instantiated by DI from application package above. */ -public class MockNodeFlavors extends ConfigNodeFlavors { +public class MockNodeFlavors extends NodeFlavors { public MockNodeFlavors() { super(createConfig()); @@ -18,14 +18,14 @@ public class MockNodeFlavors extends ConfigNodeFlavors { private static FlavorsConfig createConfig() { FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor("default", 2., 16., 400, Flavor.Environment.BARE_METAL); - b.addFlavor("medium-disk", 6., 12., 56, Flavor.Environment.BARE_METAL); - b.addFlavor("large", 4., 32., 1600, Flavor.Environment.BARE_METAL); - b.addFlavor("docker", 0.2, 0.5, 100, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("v-4-8-100", 4.0, 8.0, 100, Flavor.Environment.VIRTUAL_MACHINE); - FlavorsConfig.Flavor.Builder largeVariant = b.addFlavor("large-variant", 64, 128, 2000, Flavor.Environment.BARE_METAL); + b.addFlavor("default", 2., 16., 400, Flavor.Type.BARE_METAL); + b.addFlavor("medium-disk", 6., 12., 56, Flavor.Type.BARE_METAL); + b.addFlavor("large", 4., 32., 1600, Flavor.Type.BARE_METAL); + b.addFlavor("docker", 0.2, 0.5, 100, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("v-4-8-100", 4.0, 8.0, 100, Flavor.Type.VIRTUAL_MACHINE); + FlavorsConfig.Flavor.Builder largeVariant = b.addFlavor("large-variant", 64, 128, 2000, Flavor.Type.BARE_METAL); b.addReplaces("large", largeVariant); - FlavorsConfig.Flavor.Builder expensiveFlavor = b.addFlavor("expensive", 6, 12, 500, Flavor.Environment.BARE_METAL); + FlavorsConfig.Flavor.Builder expensiveFlavor = b.addFlavor("expensive", 6, 12, 500, Flavor.Type.BARE_METAL); b.addReplaces("default", expensiveFlavor); b.addCost(200, expensiveFlavor); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java index d599973ecde..03ada1e7951 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java @@ -6,7 +6,6 @@ import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.Zone; -import com.yahoo.config.provision.internal.ConfigNodeFlavors; import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.test.ManualClock; import com.yahoo.vespa.curator.mock.MockCurator; @@ -31,7 +30,7 @@ public class NodeRepositoryTester { public NodeRepositoryTester() { - nodeFlavors = new ConfigNodeFlavors(createConfig()); + nodeFlavors = new NodeFlavors(createConfig()); clock = new ManualClock(); curator = new MockCurator(); curator.setZooKeeperEnsembleConnectionSpec("server1:1234,server2:5678"); @@ -72,9 +71,9 @@ public class NodeRepositoryTester { private FlavorsConfig createConfig() { FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor("default", 2., 4., 100, Flavor.Environment.BARE_METAL).cost(3); - b.addFlavor("small", 1., 2., 50, Flavor.Environment.BARE_METAL).cost(2); - b.addFlavor("docker", 1., 2., 50, Flavor.Environment.DOCKER_CONTAINER).cost(1); + b.addFlavor("default", 2., 4., 100, Flavor.Type.BARE_METAL).cost(3); + b.addFlavor("small", 1., 2., 50, Flavor.Type.BARE_METAL).cost(2); + b.addFlavor("docker", 1., 2., 50, Flavor.Type.DOCKER_CONTAINER).cost(1); return b.build(); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java index ab890b02315..9b44f93bc9f 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java @@ -323,7 +323,7 @@ public class FailedExpirerTest { Version.fromString("6.42"), false, Collections.emptySet()); - Capacity capacity = Capacity.fromNodeCount(hostname.length, Optional.of(flavor.flavorName()), false, true); + Capacity capacity = Capacity.fromNodeCount(hostname.length, Optional.of(flavor.name()), false, true); return allocate(applicationId, clusterSpec, capacity); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailerTest.java index 68780770821..965ce990c64 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailerTest.java @@ -319,9 +319,9 @@ public class NodeFailerTest { // Two ready nodes and a ready docker node die, but only 2 of those are failed out tester.clock.advance(Duration.ofMinutes(180)); - Node dockerNode = ready.stream().filter(node -> node.flavor().environment() == Flavor.Environment.DOCKER_CONTAINER).findFirst().get(); + Node dockerNode = ready.stream().filter(node -> node.flavor().getType() == Flavor.Type.DOCKER_CONTAINER).findFirst().get(); List<Node> otherNodes = ready.stream() - .filter(node -> node.flavor().environment() != Flavor.Environment.DOCKER_CONTAINER) + .filter(node -> node.flavor().getType() != Flavor.Type.DOCKER_CONTAINER) .collect(Collectors.toList()); tester.allNodesMakeAConfigRequestExcept(otherNodes.get(0), otherNodes.get(2), dockerNode); tester.failer.run(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java index 732badf9369..5e33e863df7 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java @@ -12,7 +12,6 @@ import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.Zone; -import com.yahoo.config.provision.internal.ConfigNodeFlavors; import com.yahoo.test.ManualClock; import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.curator.mock.MockCurator; @@ -80,7 +79,7 @@ public class NodeRetirerTester { jobControl = new JobControl(nodeRepository.database()); NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource()); deployer = new MockDeployer(provisioner, clock, apps); - flavors = nodeFlavors.getFlavors().stream().sorted(Comparator.comparing(Flavor::flavorName)).collect(Collectors.toList()); + flavors = nodeFlavors.getFlavors().stream().sorted(Comparator.comparing(Flavor::name)).collect(Collectors.toList()); try { doThrow(new RuntimeException()).when(orchestrator).acquirePermissionToRemove(any()); @@ -116,7 +115,7 @@ public class NodeRetirerTester { for (int i = 0; i < flavorIds.length; i++) { Flavor flavor = flavors.get(flavorIds[i]); ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("cluster-" + i), Version.fromString("6.99"), false, Collections.emptySet()); - Capacity capacity = Capacity.fromNodeCount(numNodes[i], Optional.of(flavor.flavorName()), false, true); + Capacity capacity = Capacity.fromNodeCount(numNodes[i], Optional.of(flavor.name()), false, true); // If the number of node the app wants is divisible by 2, make it into 2 groups, otherwise as 1 int numGroups = numNodes[i] % 2 == 0 ? 2 : 1; clusterContexts.add(new MockDeployer.ClusterContext(applicationId, cluster, capacity, numGroups)); @@ -207,8 +206,8 @@ public class NodeRetirerTester { static NodeFlavors makeFlavors(int numFlavors) { FlavorConfigBuilder flavorConfigBuilder = new FlavorConfigBuilder(); for (int i = 0; i < numFlavors; i++) { - flavorConfigBuilder.addFlavor("flavor-" + i, 1. /* cpu*/, 3. /* mem GB*/, 2. /*disk GB*/, Flavor.Environment.BARE_METAL); + flavorConfigBuilder.addFlavor("flavor-" + i, 1. /* cpu*/, 3. /* mem GB*/, 2. /*disk GB*/, Flavor.Type.BARE_METAL); } - return new ConfigNodeFlavors(flavorConfigBuilder.build()); + return new NodeFlavors(flavorConfigBuilder.build()); } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/retire/RetireIPv4OnlyNodesTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/retire/RetireIPv4OnlyNodesTest.java index ae22c211a79..b40d091b346 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/retire/RetireIPv4OnlyNodesTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/retire/RetireIPv4OnlyNodesTest.java @@ -3,7 +3,6 @@ package com.yahoo.vespa.hosted.provision.maintenance.retire; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.NodeType; -import com.yahoo.config.provision.internal.ConfigFlavor; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; import org.junit.Test; @@ -81,8 +80,8 @@ public class RetireIPv4OnlyNodesTest { private List<Flavor> initFlavors() { FlavorConfigBuilder flavorConfigBuilder = new FlavorConfigBuilder(); - flavorConfigBuilder.addFlavor("default", 1. /* cpu*/, 3. /* mem GB*/, 2. /*disk GB*/, Flavor.Environment.BARE_METAL); - flavorConfigBuilder.addFlavor("vm", 1. /* cpu*/, 3. /* mem GB*/, 2. /*disk GB*/, Flavor.Environment.VIRTUAL_MACHINE); - return flavorConfigBuilder.build().flavor().stream().map(ConfigFlavor::new).collect(Collectors.toList()); + flavorConfigBuilder.addFlavor("default", 1. /* cpu*/, 3. /* mem GB*/, 2. /*disk GB*/, Flavor.Type.BARE_METAL); + flavorConfigBuilder.addFlavor("vm", 1. /* cpu*/, 3. /* mem GB*/, 2. /*disk GB*/, Flavor.Type.VIRTUAL_MACHINE); + return flavorConfigBuilder.build().flavor().stream().map(Flavor::new).collect(Collectors.toList()); } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java index 54ae4beb4cd..188dd5fcaee 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java @@ -94,7 +94,7 @@ public class SerializationTest { assertEquals(2, copy.allocation().get().restartGeneration().current()); assertEquals(3, copy.status().reboot().wanted()); assertEquals(4, copy.status().reboot().current()); - assertEquals("large", copy.flavor().flavorName()); + assertEquals("large", copy.flavor().name()); assertEquals("1.2.3", copy.status().vespaVersion().get().toString()); assertEquals(2, copy.status().failCount()); assertEquals("memory_mcelog", copy.status().hardwareFailureDescription().get()); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AllocationSimulator.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AllocationSimulator.java index 1bf4ff381e8..78fbca554f0 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AllocationSimulator.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AllocationSimulator.java @@ -8,7 +8,6 @@ import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeType; -import com.yahoo.config.provision.internal.ConfigNodeFlavors; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; import com.yahoo.vespa.hosted.provision.node.Allocation; @@ -17,7 +16,7 @@ import com.yahoo.vespa.hosted.provision.node.History; import com.yahoo.vespa.hosted.provision.node.Reports; import com.yahoo.vespa.hosted.provision.node.Status; -import javax.swing.*; +import javax.swing.JFrame; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -44,15 +43,15 @@ public class AllocationSimulator { // Setup flavors // FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor("host-large", 8., 8., 8, Flavor.Environment.BARE_METAL); - b.addFlavor("host-small", 5., 5., 5, Flavor.Environment.BARE_METAL); - b.addFlavor("d-1", 1, 1., 1, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-2", 2, 2., 2, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-3", 3, 3., 3, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-3-disk", 3, 3., 5, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-3-mem", 3, 5., 3, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-3-cpu", 5, 3., 3, Flavor.Environment.DOCKER_CONTAINER); - flavors = new ConfigNodeFlavors(b.build()); + b.addFlavor("host-large", 8., 8., 8, Flavor.Type.BARE_METAL); + b.addFlavor("host-small", 5., 5., 5, Flavor.Type.BARE_METAL); + b.addFlavor("d-1", 1, 1., 1, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-2", 2, 2., 2, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-3", 3, 3., 3, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-3-disk", 3, 3., 5, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-3-mem", 3, 5., 3, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-3-cpu", 5, 3., 3, Flavor.Type.DOCKER_CONTAINER); + flavors = new NodeFlavors(b.build()); // // Initiate nodes in system diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AllocationVisualizer.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AllocationVisualizer.java index 726927c25f2..61e14be53d8 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AllocationVisualizer.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AllocationVisualizer.java @@ -5,8 +5,13 @@ import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; -import javax.swing.*; -import java.awt.*; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics; import java.util.ArrayList; import java.util.List; @@ -98,13 +103,13 @@ public class AllocationVisualizer extends JPanel { if (isHost) { g.setColor(Color.GRAY); - for (int i = 0; i < node.flavor().memory().sizeInGb(); i++) { + for (int i = 0; i < node.flavor().getMinMainMemoryAvailableGb(); i++) { g.fillRect(x, y - nodeHeight, nodeWidth, nodeHeight); y = y - (nodeHeight + 2); } } else { g.setColor(Color.YELLOW); - int multi = (int) node.flavor().memory().sizeInGb(); + int multi = (int) node.flavor().getMinMainMemoryAvailableGb(); int height = multi * nodeHeight + ((multi - 1) * 2); g.fillRect(x, y - height, nodeWidth, height); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java index 2d21c6bfe7f..74541677714 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java @@ -314,15 +314,15 @@ public class DynamicDockerAllocationTest { private FlavorsConfig flavorsConfig() { FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor("host-large", 6., 6., 6, Flavor.Environment.BARE_METAL); - b.addFlavor("host-small", 3., 3., 3, Flavor.Environment.BARE_METAL); - b.addFlavor("host-medium", 4., 4., 4, Flavor.Environment.BARE_METAL); - b.addFlavor("d-1", 1, 1., 1, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-2", 2, 2., 2, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-3", 3, 3., 3, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-3-disk", 3, 3., 5, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-3-mem", 3, 5., 3, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-3-cpu", 5, 3., 3, Flavor.Environment.DOCKER_CONTAINER); + b.addFlavor("host-large", 6., 6., 6, Flavor.Type.BARE_METAL); + b.addFlavor("host-small", 3., 3., 3, Flavor.Type.BARE_METAL); + b.addFlavor("host-medium", 4., 4., 4, Flavor.Type.BARE_METAL); + b.addFlavor("d-1", 1, 1., 1, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-2", 2, 2., 2, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-3", 3, 3., 3, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-3-disk", 3, 3., 5, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-3-mem", 3, 5., 3, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-3-cpu", 5, 3., 3, Flavor.Type.DOCKER_CONTAINER); return b.build(); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorSpareCountTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorSpareCountTest.java index 32d03c156f7..cb9c5c02c65 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorSpareCountTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorSpareCountTest.java @@ -2,7 +2,7 @@ package com.yahoo.vespa.hosted.provision.provisioning; import com.yahoo.config.provision.Flavor; -import com.yahoo.config.provision.internal.ConfigNodeFlavors; +import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provisioning.FlavorsConfig; import org.junit.Test; @@ -107,15 +107,15 @@ public class FlavorSpareCountTest { FlavorConfigBuilder flavorConfigBuilder = new FlavorConfigBuilder(); for (int i = 0; i < replaces.length; i++) { FlavorsConfig.Flavor.Builder builder = flavorConfigBuilder - .addFlavor("flavor-" + i, 1. /* cpu*/, 3. /* mem GB*/, 2. /*disk GB*/, Flavor.Environment.BARE_METAL); + .addFlavor("flavor-" + i, 1. /* cpu*/, 3. /* mem GB*/, 2. /*disk GB*/, Flavor.Type.BARE_METAL); for (Integer replacesId : replaces[i]) { flavorConfigBuilder.addReplaces("flavor-" + replacesId, builder); } } - return new ConfigNodeFlavors(flavorConfigBuilder.build()) + return new NodeFlavors(flavorConfigBuilder.build()) .getFlavors().stream() - .sorted(Comparator.comparing(Flavor::flavorName)) + .sorted(Comparator.comparing(Flavor::name)) .collect(Collectors.toList()); } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizerTest.java index bdd1ea7e113..f7caea060ad 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizerTest.java @@ -8,7 +8,6 @@ import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeType; -import com.yahoo.config.provision.internal.ConfigNodeFlavors; import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.vespa.hosted.provision.Node; import org.junit.Assert; @@ -26,7 +25,7 @@ import java.util.Optional; */ public class NodePrioritizerTest { - private static NodeFlavors flavors = new ConfigNodeFlavors(flavorsConfig()); + private static NodeFlavors flavors = new NodeFlavors(flavorsConfig()); @Test public void relocated_nodes_are_preferred() { @@ -80,9 +79,9 @@ public class NodePrioritizerTest { private static FlavorsConfig flavorsConfig() { FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor("host-large", 6., 6., 6, Flavor.Environment.BARE_METAL); - b.addFlavor("d1", 1, 1., 1, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d2", 2, 2., 2, Flavor.Environment.DOCKER_CONTAINER); + b.addFlavor("host-large", 6., 6., 6, Flavor.Type.BARE_METAL); + b.addFlavor("d1", 1, 1., 1, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d2", 2, 2., 2, Flavor.Type.DOCKER_CONTAINER); return b.build(); } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java index dd04f5daab1..0eca5e25d85 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java @@ -13,11 +13,11 @@ import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.HostFilter; import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.InstanceName; +import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.OutOfCapacityException; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; -import com.yahoo.config.provision.internal.ConfigNodeFlavors; import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.transaction.NestedTransaction; import com.yahoo.vespa.curator.Curator; @@ -281,7 +281,7 @@ public class ProvisioningTest { assertEquals(12, tester.getNodes(application1, Node.State.active).size()); for (Node node : tester.getNodes(application1, Node.State.active)) - assertEquals("Node changed flavor in place", "dockerSmall", node.flavor().flavorName()); + assertEquals("Node changed flavor in place", "dockerSmall", node.flavor().name()); assertEquals("No nodes are retired", 0, tester.getNodes(application1, Node.State.active).retired().size()); } @@ -295,7 +295,7 @@ public class ProvisioningTest { config.defaultContainerFlavor("small"); config.defaultContentFlavor("large"); ProvisioningTester tester = new ProvisioningTester.Builder() - .zone(new Zone(new ConfigserverConfig(config), new ConfigNodeFlavors(new FlavorsConfig.Builder().build()))).build(); + .zone(new Zone(new ConfigserverConfig(config), new NodeFlavors(new FlavorsConfig.Builder().build()))).build(); ApplicationId application1 = tester.makeApplicationId(); @@ -528,9 +528,9 @@ public class ProvisioningTest { String replacementFlavor = "new-default"; FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor(flavorToRetire, 1., 1., 10, Flavor.Environment.BARE_METAL).cost(2).retired(true); + b.addFlavor(flavorToRetire, 1., 1., 10, Flavor.Type.BARE_METAL).cost(2).retired(true); FlavorsConfig.Flavor.Builder newDefault = b.addFlavor(replacementFlavor, 2., 2., 20, - Flavor.Environment.BARE_METAL).cost(2); + Flavor.Type.BARE_METAL).cost(2); b.addReplaces(flavorToRetire, newDefault); ProvisioningTester tester = new ProvisioningTester.Builder() @@ -630,7 +630,7 @@ public class ProvisioningTest { // Deploy with flavor that will eventually be retired { FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor(flavorToRetire, 1., 1., 10, Flavor.Environment.BARE_METAL).cost(2); + b.addFlavor(flavorToRetire, 1., 1., 10, Flavor.Type.BARE_METAL).cost(2); ProvisioningTester tester = new ProvisioningTester.Builder() .flavorsConfig(b.build()).curator(curator).nameResolver(nameResolver).build(); @@ -644,9 +644,9 @@ public class ProvisioningTest { { // Retire "default" flavor and add "new-default" as replacement FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor(flavorToRetire, 1., 1., 10, Flavor.Environment.BARE_METAL).cost(2).retired(true); + b.addFlavor(flavorToRetire, 1., 1., 10, Flavor.Type.BARE_METAL).cost(2).retired(true); FlavorsConfig.Flavor.Builder newDefault = b.addFlavor(replacementFlavor, 2., 2., 20, - Flavor.Environment.BARE_METAL).cost(2); + Flavor.Type.BARE_METAL).cost(2); b.addReplaces(flavorToRetire, newDefault); ProvisioningTester tester = new ProvisioningTester.Builder() @@ -673,9 +673,9 @@ public class ProvisioningTest { String replacementFlavor = "new-default"; FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor(flavorToRetire, 1., 1., 10, Flavor.Environment.BARE_METAL).cost(2).retired(true); + b.addFlavor(flavorToRetire, 1., 1., 10, Flavor.Type.BARE_METAL).cost(2).retired(true); FlavorsConfig.Flavor.Builder newDefault = b.addFlavor(replacementFlavor, 2., 2., 20, - Flavor.Environment.BARE_METAL).cost(2); + Flavor.Type.BARE_METAL).cost(2); b.addReplaces(flavorToRetire, newDefault); ProvisioningTester tester = new ProvisioningTester.Builder() @@ -693,7 +693,7 @@ public class ProvisioningTest { List<Node> nodes = tester.getNodes(application).asList(); assertTrue("Allocated nodes have flavor " + replacementFlavor, - nodes.stream().allMatch(n -> n.flavor().flavorName().equals(replacementFlavor))); + nodes.stream().allMatch(n -> n.flavor().name().equals(replacementFlavor))); } @Test @@ -781,10 +781,10 @@ public class ProvisioningTest { private void assertCorrectFlavorPreferences(boolean largeIsStock) { FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor("large", 4., 8., 100, Flavor.Environment.BARE_METAL).cost(10).stock(largeIsStock); - FlavorsConfig.Flavor.Builder largeVariant = b.addFlavor("large-variant", 3., 9., 101, Flavor.Environment.BARE_METAL).cost(9); + b.addFlavor("large", 4., 8., 100, Flavor.Type.BARE_METAL).cost(10).stock(largeIsStock); + FlavorsConfig.Flavor.Builder largeVariant = b.addFlavor("large-variant", 3., 9., 101, Flavor.Type.BARE_METAL).cost(9); b.addReplaces("large", largeVariant); - FlavorsConfig.Flavor.Builder largeVariantVariant = b.addFlavor("large-variant-variant", 4., 9., 101, Flavor.Environment.BARE_METAL).cost(11); + FlavorsConfig.Flavor.Builder largeVariantVariant = b.addFlavor("large-variant-variant", 4., 9., 101, Flavor.Type.BARE_METAL).cost(11); b.addReplaces("large-variant", largeVariantVariant); ProvisioningTester tester = new ProvisioningTester.Builder() diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java index 163660dcb2f..aaae6cf09a1 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java @@ -16,7 +16,6 @@ import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.ProvisionLogger; import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; -import com.yahoo.config.provision.internal.ConfigNodeFlavors; import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.test.ManualClock; import com.yahoo.transaction.NestedTransaction; @@ -98,19 +97,19 @@ public class ProvisioningTester { public static FlavorsConfig createConfig() { FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor("default", 2., 4., 100, Flavor.Environment.BARE_METAL).cost(3); - b.addFlavor("small", 1., 2., 50, Flavor.Environment.BARE_METAL).cost(2); - b.addFlavor("dockerSmall", 1., 1., 10, Flavor.Environment.DOCKER_CONTAINER).cost(1); - b.addFlavor("dockerLarge", 2., 1., 20, Flavor.Environment.DOCKER_CONTAINER).cost(3); - b.addFlavor("v-4-8-100", 4., 8., 100, Flavor.Environment.VIRTUAL_MACHINE).cost(4); - b.addFlavor("old-large1", 2., 4., 100, Flavor.Environment.BARE_METAL).cost(6); - b.addFlavor("old-large2", 2., 5., 100, Flavor.Environment.BARE_METAL).cost(14); - FlavorsConfig.Flavor.Builder large = b.addFlavor("large", 4., 8., 100, Flavor.Environment.BARE_METAL).cost(10); + b.addFlavor("default", 2., 4., 100, Flavor.Type.BARE_METAL).cost(3); + b.addFlavor("small", 1., 2., 50, Flavor.Type.BARE_METAL).cost(2); + b.addFlavor("dockerSmall", 1., 1., 10, Flavor.Type.DOCKER_CONTAINER).cost(1); + b.addFlavor("dockerLarge", 2., 1., 20, Flavor.Type.DOCKER_CONTAINER).cost(3); + b.addFlavor("v-4-8-100", 4., 8., 100, Flavor.Type.VIRTUAL_MACHINE).cost(4); + b.addFlavor("old-large1", 2., 4., 100, Flavor.Type.BARE_METAL).cost(6); + b.addFlavor("old-large2", 2., 5., 100, Flavor.Type.BARE_METAL).cost(14); + FlavorsConfig.Flavor.Builder large = b.addFlavor("large", 4., 8., 100, Flavor.Type.BARE_METAL).cost(10); b.addReplaces("old-large1", large); b.addReplaces("old-large2", large); - FlavorsConfig.Flavor.Builder largeVariant = b.addFlavor("large-variant", 3., 9., 101, Flavor.Environment.BARE_METAL).cost(9); + FlavorsConfig.Flavor.Builder largeVariant = b.addFlavor("large-variant", 3., 9., 101, Flavor.Type.BARE_METAL).cost(9); b.addReplaces("large", largeVariant); - FlavorsConfig.Flavor.Builder largeVariantVariant = b.addFlavor("large-variant-variant", 4., 9., 101, Flavor.Environment.BARE_METAL).cost(11); + FlavorsConfig.Flavor.Builder largeVariantVariant = b.addFlavor("large-variant-variant", 4., 9., 101, Flavor.Type.BARE_METAL).cost(11); b.addReplaces("large-variant", largeVariantVariant); return b.build(); } @@ -376,7 +375,7 @@ public class ProvisioningTester { long actualNodesWithFlavor = hostSpecs.stream() .map(HostSpec::hostname) .map(this::getNodeFlavor) - .map(Flavor::flavorName) + .map(Flavor::name) .filter(name -> name.equals(flavor)) .count(); assertEquals(expectedCount, actualNodesWithFlavor); @@ -450,7 +449,7 @@ public class ProvisioningTester { return new ProvisioningTester( Optional.ofNullable(curator).orElseGet(MockCurator::new), - new ConfigNodeFlavors(Optional.ofNullable(flavorsConfig).orElseGet(ProvisioningTester::createConfig)), + new NodeFlavors(Optional.ofNullable(flavorsConfig).orElseGet(ProvisioningTester::createConfig)), Optional.ofNullable(zone).orElseGet(Zone::defaultZone), Optional.ofNullable(nameResolver).orElseGet(() -> new MockNameResolver().mockAnyLookup()), orchestrator, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ResourceCapacityTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ResourceCapacityTest.java index 0355aecfe03..7883d9e58ed 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ResourceCapacityTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ResourceCapacityTest.java @@ -2,7 +2,6 @@ package com.yahoo.vespa.hosted.provision.provisioning; import com.yahoo.config.provision.Flavor; -import com.yahoo.config.provision.internal.ConfigFlavor; import com.yahoo.config.provisioning.FlavorsConfig; import org.junit.Test; @@ -18,24 +17,24 @@ public class ResourceCapacityTest { @Test public void basic_capacity_and_compare_operations() { FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor("host-large", 6., 6., 6, Flavor.Environment.BARE_METAL); - b.addFlavor("host-small", 3., 3., 3, Flavor.Environment.BARE_METAL); - b.addFlavor("d-1", 1, 1., 1, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-2", 2, 2., 2, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-3", 3, 3., 3, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-3-disk", 3, 3., 5, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-3-mem", 3, 5., 3, Flavor.Environment.DOCKER_CONTAINER); - b.addFlavor("d-3-cpu", 5, 3., 3, Flavor.Environment.DOCKER_CONTAINER); + b.addFlavor("host-large", 6., 6., 6, Flavor.Type.BARE_METAL); + b.addFlavor("host-small", 3., 3., 3, Flavor.Type.BARE_METAL); + b.addFlavor("d-1", 1, 1., 1, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-2", 2, 2., 2, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-3", 3, 3., 3, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-3-disk", 3, 3., 5, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-3-mem", 3, 5., 3, Flavor.Type.DOCKER_CONTAINER); + b.addFlavor("d-3-cpu", 5, 3., 3, Flavor.Type.DOCKER_CONTAINER); FlavorsConfig flavors = b.build(); - Flavor hostLargeFlavor = new ConfigFlavor(flavors.flavor(0)); - Flavor hostSmallFlavor = new ConfigFlavor(flavors.flavor(1)); - Flavor d1Flavor = new ConfigFlavor(flavors.flavor(2)); - Flavor d2Flavor = new ConfigFlavor(flavors.flavor(3)); - Flavor d3Flavor = new ConfigFlavor(flavors.flavor(4)); - Flavor d3DiskFlavor = new ConfigFlavor(flavors.flavor(5)); - Flavor d3MemFlavor = new ConfigFlavor(flavors.flavor(6)); - Flavor d3CPUFlavor = new ConfigFlavor(flavors.flavor(7)); + Flavor hostLargeFlavor = new Flavor(flavors.flavor(0)); + Flavor hostSmallFlavor = new Flavor(flavors.flavor(1)); + Flavor d1Flavor = new Flavor(flavors.flavor(2)); + Flavor d2Flavor = new Flavor(flavors.flavor(3)); + Flavor d3Flavor = new Flavor(flavors.flavor(4)); + Flavor d3DiskFlavor = new Flavor(flavors.flavor(5)); + Flavor d3MemFlavor = new Flavor(flavors.flavor(6)); + Flavor d3CPUFlavor = new Flavor(flavors.flavor(7)); ResourceCapacity capacityOfHostSmall = ResourceCapacity.of(hostSmallFlavor); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/filter/NodeIdentifierTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/filter/NodeIdentifierTest.java index e5d64d54d1e..cc23be4ddb4 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/filter/NodeIdentifierTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/filter/NodeIdentifierTest.java @@ -11,7 +11,6 @@ import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; -import com.yahoo.config.provision.internal.ConfigFlavor; import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.security.KeyUtils; import com.yahoo.security.Pkcs10Csr; @@ -235,7 +234,7 @@ public class NodeIdentifierTest { emptySet(), HOSTNAME, Optional.of("parenthost"), - new ConfigFlavor(createFlavourConfig().flavor(0)), + new Flavor(createFlavourConfig().flavor(0)), NodeType.tenant) .with( new Allocation( @@ -265,7 +264,7 @@ public class NodeIdentifierTest { private static FlavorsConfig createFlavourConfig() { FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor("docker", 1., 2., 50, Flavor.Environment.DOCKER_CONTAINER).cost(1); + b.addFlavor("docker", 1., 2., 50, Flavor.Type.DOCKER_CONTAINER).cost(1); return b.build(); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/cfg1.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/cfg1.json index 8e15913ac0d..f57f40ea171 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/cfg1.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/cfg1.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/cfg2.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/cfg2.json index bb4f11b7153..54cf3269b09 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/cfg2.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/cfg2.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/controller1.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/controller1.json index bfa34bc0517..a5d2a7a37dd 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/controller1.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/controller1.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-container1.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-container1.json index b4944cd5591..c98fbb46ff8 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-container1.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-container1.json @@ -10,6 +10,7 @@ "canonicalFlavor": "docker", "minDiskAvailableGb": 100.0, "minMainMemoryAvailableGb": 0.5, + "description": "Flavor-name-is-docker", "minCpuCores": 0.2, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node1-os-upgrade-complete.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node1-os-upgrade-complete.json index da5cf6613da..e01264a0c9d 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node1-os-upgrade-complete.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node1-os-upgrade-complete.json @@ -9,6 +9,7 @@ "canonicalFlavor": "large", "minDiskAvailableGb": 1600.0, "minMainMemoryAvailableGb": 32.0, + "description": "Flavor-name-is-large", "minCpuCores": 4.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node1-os-upgrade.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node1-os-upgrade.json index 639fa954817..5eebea57890 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node1-os-upgrade.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node1-os-upgrade.json @@ -9,6 +9,7 @@ "canonicalFlavor": "large", "minDiskAvailableGb": 1600.0, "minMainMemoryAvailableGb": 32.0, + "description": "Flavor-name-is-large", "minCpuCores": 4.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node1.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node1.json index 76cfb64940e..213ebc5440f 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node1.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node1.json @@ -9,6 +9,7 @@ "canonicalFlavor": "large", "minDiskAvailableGb": 1600.0, "minMainMemoryAvailableGb": 32.0, + "description": "Flavor-name-is-large", "minCpuCores": 4.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node2.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node2.json index 84cd2e3e749..eb0dc65e61b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node2.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node2.json @@ -9,6 +9,7 @@ "canonicalFlavor": "large", "minDiskAvailableGb": 1600.0, "minMainMemoryAvailableGb": 32.0, + "description": "Flavor-name-is-large", "minCpuCores": 4.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node3.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node3.json index 786666835aa..326476f783a 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node3.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node3.json @@ -9,6 +9,7 @@ "canonicalFlavor": "large", "minDiskAvailableGb": 1600.0, "minMainMemoryAvailableGb": 32.0, + "description": "Flavor-name-is-large", "minCpuCores": 4.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node4.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node4.json index 4188d42a8f4..c202376af9b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node4.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node4.json @@ -9,6 +9,7 @@ "canonicalFlavor": "large", "minDiskAvailableGb": 1600.0, "minMainMemoryAvailableGb": 32.0, + "description": "Flavor-name-is-large", "minCpuCores": 4.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node5.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node5.json index b9340df35da..3149a39ef32 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node5.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/docker-node5.json @@ -9,6 +9,7 @@ "canonicalFlavor": "large", "minDiskAvailableGb": 1600.0, "minMainMemoryAvailableGb": 32.0, + "description": "Flavor-name-is-large", "minCpuCores": 4.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/dockerhost1-with-firmware-data.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/dockerhost1-with-firmware-data.json index 175ee0b1a48..7d3e0b43b53 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/dockerhost1-with-firmware-data.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/dockerhost1-with-firmware-data.json @@ -9,6 +9,7 @@ "canonicalFlavor": "large", "minDiskAvailableGb": 1600.0, "minMainMemoryAvailableGb": 32.0, + "description": "Flavor-name-is-large", "minCpuCores": 4.0, "fastDisk": true, "bandwidth": 0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node1.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node1.json index c7b71c7372c..7d979676173 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node1.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node1.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node10.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node10.json index 7b029ec266c..847fbd47bb7 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node10.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node10.json @@ -10,6 +10,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node11.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node11.json index 3fd2e60ec9b..b1329eebb2d 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node11.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node11.json @@ -10,6 +10,7 @@ "canonicalFlavor": "docker", "minDiskAvailableGb": 100.0, "minMainMemoryAvailableGb": 0.5, + "description": "Flavor-name-is-docker", "minCpuCores": 0.2, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node2.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node2.json index bea421e14da..64b64888bcd 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node2.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node2.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node3.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node3.json index b911318563e..66fa0179c35 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node3.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node3.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 500.0, "minMainMemoryAvailableGb": 12.0, + "description": "Flavor-name-is-expensive", "minCpuCores": 6.0, "cost": 200, "fastDisk": true, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4-after-changes.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4-after-changes.json index fd81049f5ed..14c1201f1de 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4-after-changes.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4-after-changes.json @@ -10,6 +10,7 @@ "canonicalFlavor": "medium-disk", "minDiskAvailableGb": 56.0, "minMainMemoryAvailableGb": 12.0, + "description": "Flavor-name-is-medium-disk", "minCpuCores": 6.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4.json index 55e3280e831..a02035efd88 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4.json @@ -10,6 +10,7 @@ "canonicalFlavor": "docker", "minDiskAvailableGb": 100.0, "minMainMemoryAvailableGb": 0.5, + "description": "Flavor-name-is-docker", "minCpuCores": 0.2, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5-after-changes.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5-after-changes.json index a7313204d36..8eb3a74ce2a 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5-after-changes.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5-after-changes.json @@ -10,6 +10,7 @@ "canonicalFlavor": "docker", "minDiskAvailableGb": 100.0, "minMainMemoryAvailableGb": 0.5, + "description": "Flavor-name-is-docker", "minCpuCores": 0.2, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5.json index 9c1ae62be2e..a14443e096d 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5.json @@ -10,6 +10,7 @@ "canonicalFlavor": "docker", "minDiskAvailableGb": 100.0, "minMainMemoryAvailableGb": 0.5, + "description": "Flavor-name-is-docker", "minCpuCores": 0.2, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55-after-changes.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55-after-changes.json index 0b9c687a203..16ec6fe4a99 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55-after-changes.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55-after-changes.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55.json index f0ff68d784d..aca7875db31 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-after-changes.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-after-changes.json index 800a686c4e1..a15b62a6dd4 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-after-changes.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-after-changes.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb":400.0, "minMainMemoryAvailableGb":16.0, + "description":"Flavor-name-is-default", "minCpuCores":2.0, "fastDisk":true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-reports-2.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-reports-2.json index 2722b348a03..c1b05045ff1 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-reports-2.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-reports-2.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-reports-3.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-reports-3.json index d6452720168..ac34074c4fd 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-reports-3.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-reports-3.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-reports.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-reports.json index e5385790d44..cfe361549c7 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-reports.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6-reports.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6.json index 3d3f6c60ba4..c1321aa113a 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node7.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node7.json index d5496828767..e6e06c74cdc 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node7.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node7.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node8.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node8.json index 62386e05980..a768cf73dda 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node8.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node8.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node9.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node9.json index 9818e97b80d..019eef8c1f2 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node9.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node9.json @@ -9,6 +9,7 @@ "canonicalFlavor": "large", "minDiskAvailableGb": 2000.0, "minMainMemoryAvailableGb": 128.0, + "description": "Flavor-name-is-large-variant", "minCpuCores": 64.0, "fastDisk": true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent1.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent1.json index 3477d71c735..afe0fc5f2e1 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent1.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent1.json @@ -9,6 +9,7 @@ "canonicalFlavor": "default", "minDiskAvailableGb": 400.0, "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", "minCpuCores": 2.0, "fastDisk":true, "bandwidth":0.0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent2.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent2.json index 18f1a31be69..45668ca341d 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent2.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent2.json @@ -9,6 +9,7 @@ "canonicalFlavor": "large", "minDiskAvailableGb": 2000.0, "minMainMemoryAvailableGb": 128.0, + "description": "Flavor-name-is-large-variant", "minCpuCores": 64.0, "fastDisk":true, "bandwidth":0.0, |