diff options
author | Jon Bratseth <jonbratseth@yahoo.com> | 2016-09-04 16:00:49 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-04 16:00:49 +0200 |
commit | 9c77a8cdfa0ae4874e254c85feec7965524b51d3 (patch) | |
tree | e040b05fa79e086b8b1a1890d4d912faccdba00c /config-model | |
parent | 3b6478d3a6db1dd5c5cdfc50ce5aadd53f72cf92 (diff) |
Revert "Revert "Revert "Revert "Revert "Bratseth/lockdown zk"""""
Diffstat (limited to 'config-model')
10 files changed, 97 insertions, 85 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; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/configserver/ConfigserverCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/configserver/ConfigserverCluster.java index ef0f4882f1c..c52a7375528 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/configserver/ConfigserverCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/configserver/ConfigserverCluster.java @@ -178,5 +178,4 @@ public class ConfigserverCluster extends AbstractConfigProducer public void getConfig(HealthMonitorConfig.Builder builder) { builder.snapshot_interval(60.0); } - } diff --git a/config-model/src/test/java/com/yahoo/config/model/provision/HostsXmlProvisionerTest.java b/config-model/src/test/java/com/yahoo/config/model/provision/HostsXmlProvisionerTest.java index ba38c9a3223..6d047c66a5a 100644 --- a/config-model/src/test/java/com/yahoo/config/model/provision/HostsXmlProvisionerTest.java +++ b/config-model/src/test/java/com/yahoo/config/model/provision/HostsXmlProvisionerTest.java @@ -11,13 +11,11 @@ import java.util.*; import static junit.framework.TestCase.assertTrue; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.assertEquals; /** * @author hmusum */ public class HostsXmlProvisionerTest { - private static final String oneHost = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<hosts>\n" + " <host name=\"test1.yahoo.com\">\n" + @@ -73,8 +71,6 @@ public class HostsXmlProvisionerTest { assertThat(map.size(), is(3)); assertCorrectNumberOfHosts(map, 3); assertTrue(map.keySet().containsAll(aliases)); - - assertEquals("test1.yahoo.com,test2.yahoo.com,test3.yahoo.com", System.getProperty("zookeeper.vespa.clients")); } @Test(expected = IllegalArgumentException.class) diff --git a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java index f2b235a29da..34f75d46a1c 100644 --- a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java +++ b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java @@ -81,7 +81,7 @@ public class ModelProvisioningTest { + " </host>" + "</hosts>"; VespaModelCreatorWithMockPkg creator = new VespaModelCreatorWithMockPkg(null, services); - VespaModel model = creator.create(new DeployState.Builder().modelHostProvisioner(new InMemoryProvisioner(Hosts.readFrom(new StringReader(hosts)), true))); + VespaModel model = creator.create(new DeployState.Builder().modelHostProvisioner(new InMemoryProvisioner(Hosts.getHosts(new StringReader(hosts)), true))); assertThat(model.getContainerClusters().get("mydisc").getContainers().size(), is(3)); assertThat(model.getContainerClusters().get("mydisc").getContainers().get(0).getConfigId(), is("mydisc/container.0")); assertTrue(model.getContainerClusters().get("mydisc").getContainers().get(0).isInitialized()); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java b/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java index 05f5145cfa7..b4e366c1609 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java @@ -47,7 +47,7 @@ public class DedicatedAdminV4Test { + " </host>" + "</hosts>"; ApplicationPackage app = new MockApplicationPackage.Builder().withHosts(hosts).withServices(services).build(); - VespaModel model = new VespaModel(new NullConfigModelRegistry(), new DeployState.Builder().applicationPackage(app).modelHostProvisioner(new InMemoryProvisioner(Hosts.readFrom(app.getHosts()), true)).build()); + VespaModel model = new VespaModel(new NullConfigModelRegistry(), new DeployState.Builder().applicationPackage(app).modelHostProvisioner(new InMemoryProvisioner(Hosts.getHosts(app.getHosts()), true)).build()); assertEquals(3, model.getHosts().size()); Set<String> serviceNames0 = serviceNames(model.getConfig(SentinelConfig.class, "hosts/myhost0")); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java b/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java index 0c57d036998..6eb38dd6f66 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java @@ -13,11 +13,9 @@ import com.yahoo.vespa.model.VespaModel; import com.yahoo.vespa.model.test.utils.ApplicationPackageUtils; import com.yahoo.vespa.model.test.utils.VespaModelCreatorWithMockPkg; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -50,11 +48,11 @@ public class VespaModelTester { public Hosts addHosts(int count) { return addHosts("default", count); } /** Adds some hosts to this system */ public Hosts addHosts(String flavor, int count) { - List<Host> hosts = new ArrayList<>(); + Hosts hosts = new Hosts(); for (int i = 0; i < count; i++) - hosts.add(new com.yahoo.config.model.provision.Host(flavor + i)); - this.hosts.put(flavor.isEmpty() ? "default" : flavor, hosts); - return new Hosts(hosts); + hosts.addHost(new com.yahoo.config.model.provision.Host(flavor + i), Collections.emptyList()); + this.hosts.put(flavor.isEmpty() ? "default" : flavor, hosts.getHosts()); + return hosts; } /** Creates a model which uses 0 as start index and fails on out of capacity */ |