summaryrefslogtreecommitdiffstats
path: root/config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2017-01-22 14:47:45 +0100
committerJon Bratseth <bratseth@yahoo-inc.com>2017-01-22 14:47:45 +0100
commit0501d0d549caf74111ab5da8498744d35e2aea52 (patch)
tree41f6f3bf01cad46329920a59d33d316a62cdbc74 /config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java
parentd7640ecc7ab7d1f776756d78efe1e46a3769575f (diff)
Move node-repository config to provisioning
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.java71
1 files changed, 71 insertions, 0 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
new file mode 100644
index 00000000000..9451e47cbc3
--- /dev/null
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java
@@ -0,0 +1,71 @@
+// Copyright 2016 Yahoo Inc. 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 java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import com.yahoo.config.provisioning.FlavorsConfig;
+
+/**
+ * All the available node flavors.
+ *
+ * @author bratseth
+ */
+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 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));
+ }
+
+ /** Returns the flavor with the given name or throws an IllegalArgumentException if it does not exist */
+ public Flavor getFlavorOrThrow(String flavorName) {
+ Optional<Flavor> flavor = getFlavor(flavorName);
+ if ( flavor.isPresent()) return flavor.get();
+ throw new IllegalArgumentException("Unknown flavor '" + flavorName + "'. Flavors are " + canonicalFlavorNames());
+ }
+
+ private List<String> canonicalFlavorNames() {
+ 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();
+ }
+ return flavors.values();
+ }
+
+}