diff options
6 files changed, 36 insertions, 15 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java b/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java index f04e52e86e9..3cad2b7c2ef 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java @@ -29,6 +29,9 @@ public class HostResource implements Comparable<HostResource> { private int allocatedPorts = 0; + // Empty for self-hosted Vespa. + private Optional<String> flavor = Optional.empty(); + /** * Create a new {@link HostResource} bound to a specific {@link com.yahoo.vespa.model.Host}. * @@ -224,6 +227,11 @@ public class HostResource implements Comparable<HostResource> { .collect(Collectors.toSet())); } + public void setFlavor(Optional<String> flavor) { this.flavor = flavor; } + + /** Returns the flavor of this resource. Empty for self-hosted Vespa. */ + public Optional<String> getFlavor() { return flavor; } + @Override public String toString() { return "host '" + host.getHostName() + "'"; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java b/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java index 2d825e3332d..c1822df2861 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java @@ -154,7 +154,7 @@ public class HostSystem extends AbstractConfigProducer<Host> { public Map<HostResource, ClusterMembership> allocateHosts(ClusterSpec cluster, Capacity capacity, int groups, DeployLogger logger) { List<HostSpec> allocatedHosts = provisioner.prepare(cluster, capacity, groups, new ProvisionDeployLogger(logger)); - // TODO: Let hostresource own a membership rather than using a map? + // TODO: Let hostresource own a membership rather than using a map Map<HostResource, ClusterMembership> retAllocatedHosts = new LinkedHashMap<>(); for (HostSpec host : allocatedHosts) { // This is needed for single node host provisioner to work in unit tests for hosted vespa applications. @@ -164,6 +164,7 @@ public class HostSystem extends AbstractConfigProducer<Host> { } else { retAllocatedHosts.put(addNewHost(host), host.membership().orElse(null)); } + getExistingHost(host).get().setFlavor(host.flavor()); } return retAllocatedHosts; } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java b/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java index 671690030b6..8671f44ad6a 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java @@ -95,16 +95,19 @@ public class VespaModelFactoryTest { HostProvisioner provisionerToOverride = new HostProvisioner() { @Override public HostSpec allocateHost(String alias) { - return new HostSpec(hostName, ClusterMembership.from(ClusterSpec.from(ClusterSpec.Type.admin, - new ClusterSpec.Id(routingClusterName), - ClusterSpec.Group.from(0), - Optional.empty()), - 0)); + return new HostSpec(hostName, + Collections.emptyList(), + ClusterMembership.from(ClusterSpec.from(ClusterSpec.Type.admin, + new ClusterSpec.Id(routingClusterName), + ClusterSpec.Group.from(0), + Optional.empty()), + 0)); } @Override public List<HostSpec> prepare(ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger) { return Collections.singletonList(new HostSpec(hostName, + Collections.emptyList(), ClusterMembership.from(ClusterSpec.from(ClusterSpec.Type.container, new ClusterSpec.Id(routingClusterName), ClusterSpec.Group.from(0), diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java b/config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java index b68139f3578..174a8ce4d97 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java @@ -24,26 +24,29 @@ public class HostSpec implements Comparable<HostSpec> { /** The current membership role of this host in the cluster it belongs to */ private final Optional<ClusterMembership> membership; + private final Optional<String> flavor; + public HostSpec(String hostname, Optional<ClusterMembership> membership) { - this(hostname, new ArrayList<>(), membership); + this(hostname, new ArrayList<>(), Optional.empty(), membership); } - public HostSpec(String hostname, ClusterMembership membership) { - this(hostname, new ArrayList<>(), Optional.of(membership)); + public HostSpec(String hostname, ClusterMembership membership, String flavor) { + this(hostname, new ArrayList<>(), Optional.of(flavor), Optional.of(membership)); } public HostSpec(String hostname, List<String> aliases) { - this(hostname, aliases, Optional.empty()); + this(hostname, aliases, Optional.empty(), Optional.empty()); } public HostSpec(String hostname, List<String> aliases, ClusterMembership membership) { - this(hostname, aliases, Optional.of(membership)); + this(hostname, aliases, Optional.empty(), Optional.of(membership)); } - public HostSpec(String hostname, List<String> aliases, Optional<ClusterMembership> membership) { + public HostSpec(String hostname, List<String> aliases, Optional<String> flavor, Optional<ClusterMembership> membership) { if (hostname == null || hostname.isEmpty()) throw new IllegalArgumentException("Hostname must be specified"); this.hostname = hostname; this.aliases = ImmutableList.copyOf(aliases); + this.flavor = flavor; this.membership = membership; } @@ -53,6 +56,8 @@ public class HostSpec implements Comparable<HostSpec> { /** Returns the aliases of this host as an immutable list. This may be empty but never null. */ public List<String> aliases() { return aliases; } + public Optional<String> flavor() { return flavor; } + /** Returns the membership of this host, or an empty value if not present */ public Optional<ClusterMembership> membership() { return membership; } diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java b/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java index 988819aae2d..e903332bd6f 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java @@ -71,7 +71,7 @@ public class ProvisionInfo { private static HostSpec createHostSpec(Inspector object) { Optional<ClusterMembership> membership = object.field(hostSpecMembership).valid() ? Optional.of(readMembership(object)) : Optional.empty(); - HostSpec h = new HostSpec(object.field(hostSpecHostName).asString(), Collections.<String>emptyList(), membership); + HostSpec h = new HostSpec(object.field(hostSpecHostName).asString(), Collections.emptyList(), Optional.empty(), membership); return h; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java index 2d731d3a90a..67886aa9b2c 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java @@ -22,9 +22,11 @@ import com.yahoo.vespa.hosted.provision.node.filter.NodeHostFilter; import java.time.Clock; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Comparator; import java.util.List; +import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; @@ -109,9 +111,11 @@ public class NodeRepositoryProvisioner implements Provisioner { private List<HostSpec> asSortedHosts(List<Node> nodes) { nodes.sort(Comparator.comparingInt((Node node) -> node.allocation().get().membership().index())); List<HostSpec> hosts = new ArrayList<>(nodes.size()); - for (Node node : nodes) + for (Node node : nodes) { hosts.add(new HostSpec(node.hostname(), - node.allocation().orElseThrow(IllegalStateException::new).membership())); + node.allocation().orElseThrow(IllegalStateException::new).membership(), + node.flavor().canonicalName())); + } return hosts; } |