diff options
author | Harald Musum <musum@verizonmedia.com> | 2019-08-14 20:25:52 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-14 20:25:52 +0200 |
commit | 4e52564e8d01d3af68d611d9bd88e497bbd08e25 (patch) | |
tree | ef0e2e43d1189ad03565e9d911a991474c0f9f6e /config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java | |
parent | fc6ebf45c0ef126043eb9db4cf613958ce665411 (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.java | 45 |
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)); } } |