aboutsummaryrefslogtreecommitdiffstats
path: root/config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2019-08-14 20:25:52 +0200
committerGitHub <noreply@github.com>2019-08-14 20:25:52 +0200
commit4e52564e8d01d3af68d611d9bd88e497bbd08e25 (patch)
treeef0e2e43d1189ad03565e9d911a991474c0f9f6e /config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java
parentfc6ebf45c0ef126043eb9db4cf613958ce665411 (diff)
Revert "Bratseth/remove allocation by flavor"
Diffstat (limited to 'config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java')
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java45
1 files changed, 42 insertions, 3 deletions
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 a9f031cae70..4d4d3c8cf86 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
@@ -41,7 +41,10 @@ public class NodeFlavors {
return Optional.of(configuredFlavors.get(name));
NodeResources nodeResources = NodeResources.fromLegacyName(name);
- return Optional.of(new Flavor(nodeResources));
+ if (nodeResources.allocateByLegacyName())
+ return Optional.empty();
+ else
+ return Optional.of(new Flavor(nodeResources));
}
/**
@@ -49,7 +52,8 @@ public class NodeFlavors {
* and cannot be created on the fly.
*/
public Flavor getFlavorOrThrow(String flavorName) {
- return getFlavor(flavorName).orElseThrow(() -> new IllegalArgumentException("Unknown flavor '" + flavorName + "'"));
+ return getFlavor(flavorName).orElseThrow(() -> new IllegalArgumentException("Unknown flavor '" + flavorName +
+ "'. Flavors are " + canonicalFlavorNames()));
}
/** Returns true if this flavor is configured or can be created on the fly */
@@ -57,8 +61,43 @@ public class NodeFlavors {
return getFlavor(flavorName).isPresent();
}
+ private List<String> canonicalFlavorNames() {
+ return configuredFlavors.values().stream().map(Flavor::canonicalName).distinct().sorted().collect(Collectors.toList());
+ }
+
private static Collection<Flavor> toFlavors(FlavorsConfig config) {
- return config.flavor().stream().map(Flavor::new).collect(Collectors.toList());
+ 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));
}
}