aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/config/model/provision
diff options
context:
space:
mode:
authorJon Bratseth <jonbratseth@yahoo.com>2016-09-04 16:00:49 +0200
committerGitHub <noreply@github.com>2016-09-04 16:00:49 +0200
commit9c77a8cdfa0ae4874e254c85feec7965524b51d3 (patch)
treee040b05fa79e086b8b1a1890d4d912faccdba00c /config-model/src/main/java/com/yahoo/config/model/provision
parent3b6478d3a6db1dd5c5cdfc50ce5aadd53f72cf92 (diff)
Revert "Revert "Revert "Revert "Revert "Bratseth/lockdown zk"""""
Diffstat (limited to 'config-model/src/main/java/com/yahoo/config/model/provision')
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/provision/Host.java21
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/provision/Hosts.java108
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/provision/HostsXmlProvisioner.java21
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java8
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/provision/SingleNodeProvisioner.java5
5 files changed, 91 insertions, 72 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/provision/Host.java b/config-model/src/main/java/com/yahoo/config/model/provision/Host.java
index 360853d0f79..afe4de7ef0d 100644
--- a/config-model/src/main/java/com/yahoo/config/model/provision/Host.java
+++ b/config-model/src/main/java/com/yahoo/config/model/provision/Host.java
@@ -1,39 +1,40 @@
// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.config.model.provision;
-import com.google.common.collect.ImmutableList;
-
import java.util.ArrayList;
import java.util.List;
/**
- * A hostname with zero or more aliases. This is immutable.
+ * A hostname with zero or more aliases.
*
* @author hmusum
*/
public class Host {
private final String hostname;
- private final ImmutableList<String> aliases;
+ private final List<String> hostAliases;
public Host(String hostname) {
this.hostname = hostname;
- this.aliases = ImmutableList.of();
+ this.hostAliases = new ArrayList<>();
}
public Host(String hostname, List<String> hostAliases) {
this.hostname = hostname;
- this.aliases = ImmutableList.copyOf(hostAliases);
+ this.hostAliases = hostAliases;
}
- public String hostname() { return hostname; }
+ public String getHostname() {
+ return hostname;
+ }
- /** Returns an immutable list of the aliases of this node, which may be empty but never null */
- public List<String> aliases() { return aliases; }
+ public List<String> getHostAliases() {
+ return hostAliases;
+ }
@Override
public String toString() {
- return hostname + (aliases.size() > 0 ? " (aliases: " + aliases + ")" : "" );
+ return hostname + " (aliases: " + hostAliases + ")";
}
}
diff --git a/config-model/src/main/java/com/yahoo/config/model/provision/Hosts.java b/config-model/src/main/java/com/yahoo/config/model/provision/Hosts.java
index 1a145e6c83e..bfb77612d31 100644
--- a/config-model/src/main/java/com/yahoo/config/model/provision/Hosts.java
+++ b/config-model/src/main/java/com/yahoo/config/model/provision/Hosts.java
@@ -1,9 +1,8 @@
// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.config.model.provision;
-import com.google.common.collect.ImmutableMap;
-import com.yahoo.cloud.config.ConfigserverConfig;
import com.yahoo.config.model.builder.xml.XmlHelper;
+import com.yahoo.log.LogLevel;
import com.yahoo.net.HostName;
import com.yahoo.text.XML;
import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder;
@@ -18,60 +17,26 @@ import java.util.*;
import java.util.logging.Logger;
/**
- * A collection of hosts
+ * TODO: What is this?
*
- * @author bratseth
+ * @author hmusum
*/
public class Hosts {
public static final Logger log = Logger.getLogger(Hosts.class.getPackage().toString());
- private final ImmutableMap<String, Host> hosts;
+ private final HashMap<String, Host> hosts = new LinkedHashMap<>();
+ private final Map<String, String> alias2hostname = new LinkedHashMap<>();
+ private final Map<String, Host> alias2host = new LinkedHashMap<>();
- public Hosts(Collection<Host> hosts) {
- validateAliases(hosts);
-
- ImmutableMap.Builder<String, Host> hostsBuilder = new ImmutableMap.Builder<>();
- for (Host host : hosts)
- hostsBuilder.put(host.hostname(), host);
- this.hosts = hostsBuilder.build();
-
- System.setProperty("zookeeper.vespa.clients", toHostnameString(hosts)); // See com.yahoo.vespa.zookeeper.ZooKeeperServer
- }
-
- /** Throw IllegalArgumentException if host aliases breaks invariants */
- private void validateAliases(Collection<Host> hosts) {
- Set<String> aliases = new HashSet<>();
- for (Host host : hosts) {
- if (host.aliases().size() > 0) {
- if (host.aliases().size() < 1)
- throw new IllegalArgumentException("Host '" + host.hostname() + "' must have at least one <alias> tag.");
- for (String alias : host.aliases()) {
- if (aliases.contains(alias))
- throw new IllegalArgumentException("Alias '" + alias + "' is used by multiple hosts.");
- aliases.add(alias);
- }
- }
- }
- }
-
- private String toHostnameString(Collection<Host> hosts) {
- StringBuilder b = new StringBuilder();
- for (Host host : hosts)
- b.append(host.hostname()).append(",");
- if (b.length() > 0)
- b.setLength(b.length() - 1); // remove last comma
- return b.toString();
- }
-
/**
* Builds host system from a hosts.xml file
*
* @param hostsFile a reader for host from application package
* @return the HostSystem for this application package
*/
- public static Hosts readFrom(Reader hostsFile) {
- List<Host> hosts = new ArrayList<>();
+ public static Hosts getHosts(Reader hostsFile) {
+ Hosts hosts = new Hosts();
Document doc;
try {
doc = XmlHelper.getDocumentBuilder().parse(new InputSource(hostsFile));
@@ -90,13 +55,62 @@ public class Hosts {
if (hostAliases.isEmpty()) {
throw new IllegalArgumentException("No host aliases defined for host '" + name + "'");
}
- hosts.add(new Host(name, hostAliases));
+ Host host = new Host(name, hostAliases);
+ hosts.addHost(host, hostAliases);
+ }
+ log.log(LogLevel.DEBUG, "Created hosts:" + hosts);
+ return hosts;
+ }
+
+ public Collection<Host> getHosts() {
+ return hosts.values();
+ }
+
+ /**
+ * Adds one host to this host system.
+ *
+ * @param host The host to add
+ * @param aliases The aliases for this host.
+ */
+ public void addHost(Host host, List<String> aliases) {
+ hosts.put(host.getHostname(), host);
+ if ((aliases != null) && (aliases.size() > 0)) {
+ addHostAliases(aliases, host);
}
- return new Hosts(hosts);
}
- /** Returns an immutable collection of the hosts of this */
- public Collection<Host> asCollection() { return hosts.values(); }
+ /**
+ * Add all aliases for one host
+ *
+ * @param hostAliases A list of host aliases
+ * @param host The Host instance to add the alias for
+ */
+ private void addHostAliases(List<String> hostAliases, Host host) {
+ if (hostAliases.size() < 1) {
+ throw new RuntimeException("Host '" + host.getHostname() + "' must have at least one <alias> tag.");
+ }
+ for (String alias : hostAliases) {
+ addHostAlias(alias, host);
+ }
+ }
+
+ /**
+ * Adds an alias for the given host
+ *
+ * @param alias alias (string) for a Host
+ * @param host the {@link Host} to add the alias for
+ */
+ protected void addHostAlias(String alias, Host host) {
+ if (alias2hostname.containsKey(alias)) {
+ throw new RuntimeException("Alias '" + alias + "' must be used for only one host!");
+ }
+ alias2hostname.put(alias, host.getHostname());
+ alias2host.put(alias, host);
+ }
+
+ public Map<String, Host> getAlias2host() {
+ return alias2host;
+ }
@Override
public String toString() {
diff --git a/config-model/src/main/java/com/yahoo/config/model/provision/HostsXmlProvisioner.java b/config-model/src/main/java/com/yahoo/config/model/provision/HostsXmlProvisioner.java
index 32a7e79d278..bf630b74272 100644
--- a/config-model/src/main/java/com/yahoo/config/model/provision/HostsXmlProvisioner.java
+++ b/config-model/src/main/java/com/yahoo/config/model/provision/HostsXmlProvisioner.java
@@ -22,24 +22,27 @@ public class HostsXmlProvisioner implements HostProvisioner {
public static final String IMPLICIT_ADMIN_HOSTALIAS = "INTERNAL_VESPA_IMPLICIT_ADMIN";
public HostsXmlProvisioner(Reader hosts) {
- this.hosts = Hosts.readFrom(hosts);
+ this.hosts = Hosts.getHosts(hosts);
}
@Override
public HostSpec allocateHost(String alias) {
- // Some special rules to allow no admin elements as well as jdisc element without nodes.
+ /**
+ * Some special rules to allow no admin elements as well
+ * as jdisc element without nodes.
+ */
if (alias.equals(IMPLICIT_ADMIN_HOSTALIAS)) {
- if (hosts.asCollection().size() > 1) {
- throw new IllegalArgumentException("More than 1 host specified (" + hosts.asCollection().size() + ") and <admin> not specified");
+ if (hosts.getHosts().size() > 1) {
+ throw new IllegalArgumentException("More than 1 host specified (" + hosts.getHosts().size() + ") and <admin> not specified");
} else {
return host2HostSpec(getFirstHost());
}
} else if (alias.equals(Container.SINGLENODE_CONTAINER_SERVICESPEC)) {
return host2HostSpec(getFirstHost());
}
- for (Host host : hosts.asCollection()) {
- if (host.aliases().contains(alias)) {
- return new HostSpec(host.hostname(), host.aliases());
+ for (Host host : hosts.getHosts()) {
+ if (host.getHostAliases().contains(alias)) {
+ return new HostSpec(host.getHostname(), host.getHostAliases());
}
}
throw new IllegalArgumentException("Unable to find host for alias '" + alias + "'");
@@ -51,11 +54,11 @@ public class HostsXmlProvisioner implements HostProvisioner {
}
private HostSpec host2HostSpec(Host host) {
- return new HostSpec(host.hostname(), host.aliases());
+ return new HostSpec(host.getHostname(), host.getHostAliases());
}
private Host getFirstHost() {
- return hosts.asCollection().iterator().next();
+ return hosts.getHosts().iterator().next();
}
}
diff --git a/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java b/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java
index 5c9d03b434f..69054cb7ae6 100644
--- a/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java
+++ b/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java
@@ -49,12 +49,12 @@ public class InMemoryProvisioner implements HostProvisioner {
/** Creates this with a set of hosts of the flavor 'default' */
public InMemoryProvisioner(Hosts hosts, boolean failOnOutOfCapacity, String ... retiredHostNames) {
- this(Collections.singletonMap("default", hosts.asCollection()), failOnOutOfCapacity, 0, retiredHostNames);
+ this(Collections.singletonMap("default", hosts.getHosts()), failOnOutOfCapacity, 0, retiredHostNames);
}
/** Creates this with a set of hosts of the flavor 'default' */
public InMemoryProvisioner(Hosts hosts, boolean failOnOutOfCapacity, int startIndexForClusters, String ... retiredHostNames) {
- this(Collections.singletonMap("default", hosts.asCollection()), failOnOutOfCapacity, startIndexForClusters, retiredHostNames);
+ this(Collections.singletonMap("default", hosts.getHosts()), failOnOutOfCapacity, startIndexForClusters, retiredHostNames);
}
public InMemoryProvisioner(Map<String, Collection<Host>> hosts, boolean failOnOutOfCapacity, int startIndexForClusters, String ... retiredHostNames) {
@@ -88,7 +88,7 @@ public class InMemoryProvisioner implements HostProvisioner {
List<Host> defaultHosts = freeNodes.get("default");
if (defaultHosts.isEmpty()) throw new IllegalArgumentException("No more hosts of default flavor available");
Host newHost = freeNodes.removeValue("default", 0);
- HostSpec hostSpec = new HostSpec(newHost.hostname(), newHost.aliases());
+ HostSpec hostSpec = new HostSpec(newHost.getHostname(), newHost.getHostAliases());
legacyMapping.put(alias, hostSpec);
return hostSpec;
}
@@ -141,7 +141,7 @@ public class InMemoryProvisioner implements HostProvisioner {
if (freeNodes.get(flavor).isEmpty()) throw new IllegalArgumentException("No nodes of flavor '" + flavor + "' available");
Host newHost = freeNodes.removeValue(flavor, 0);
ClusterMembership membership = ClusterMembership.from(clusterGroup, nextIndex++);
- allocation.add(new HostSpec(newHost.hostname(), newHost.aliases(), membership));
+ allocation.add(new HostSpec(newHost.getHostname(), newHost.getHostAliases(), membership));
}
nextIndexInCluster.put(new Pair<>(clusterGroup.type(), clusterGroup.id()), nextIndex);
diff --git a/config-model/src/main/java/com/yahoo/config/model/provision/SingleNodeProvisioner.java b/config-model/src/main/java/com/yahoo/config/model/provision/SingleNodeProvisioner.java
index 1d5544873d9..67e80ec95d6 100644
--- a/config-model/src/main/java/com/yahoo/config/model/provision/SingleNodeProvisioner.java
+++ b/config-model/src/main/java/com/yahoo/config/model/provision/SingleNodeProvisioner.java
@@ -1,6 +1,7 @@
// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.config.model.provision;
+import com.yahoo.config.application.api.DeployLogger;
import com.yahoo.config.model.api.HostProvisioner;
import com.yahoo.config.provision.*;
import com.yahoo.net.HostName;
@@ -30,7 +31,7 @@ public class SingleNodeProvisioner implements HostProvisioner {
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
- this.hostSpec = new HostSpec(host.hostname(), host.aliases());
+ this.hostSpec = new HostSpec(host.getHostname(), host.getHostAliases());
}
@Override
@@ -41,7 +42,7 @@ public class SingleNodeProvisioner implements HostProvisioner {
@Override
public List<HostSpec> prepare(ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger) { // TODO: This should fail if capacity requested is more than 1
List<HostSpec> hosts = new ArrayList<>();
- hosts.add(new HostSpec(host.hostname(), host.aliases(), ClusterMembership.from(cluster, counter++)));
+ hosts.add(new HostSpec(host.getHostname(), host.getHostAliases(), ClusterMembership.from(cluster, counter++)));
return hosts;
}