diff options
Diffstat (limited to 'config-model/src')
3 files changed, 78 insertions, 6 deletions
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 a9ee440f22c..5a6a8e86e6a 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 @@ -45,9 +45,12 @@ public class HostsXmlProvisioner implements HostProvisioner { throw new IllegalArgumentException("Unable to find host for alias '" + alias + "'"); } + /** Called when provisioning nodes using <nodes count="..." */ @Override public List<HostSpec> prepare(ClusterSpec cluster, Capacity quantity, ProvisionLogger logger) { - throw new UnsupportedOperationException("Prepare on an XML host provisioner is not supported"); + throw new UnsupportedOperationException("Using <nodes count=\"...\"> is not supported when there is a " + + "hosts.xml file. Remove hosts.xml to make this deployable on " + + "Vespa Cloud and single-node self-hosted instances."); } private HostSpec host2HostSpec(Host host) { 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 9852952bacb..1977ec0687d 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 @@ -1654,7 +1654,7 @@ public class ModelProvisioningTest { /** Deploying an application with "nodes count" standalone should give a single-node deployment */ @Test public void testThatHostedSyntaxWorksOnStandalone() { - String xmlWithNodes = + String services = "<?xml version='1.0' encoding='utf-8' ?>" + "<services>" + " <container version='1.0' id='container1'>" + @@ -1672,7 +1672,63 @@ public class ModelProvisioningTest { VespaModelTester tester = new VespaModelTester(); tester.setHosted(false); tester.addHosts(3); - VespaModel model = tester.createModel(xmlWithNodes, true); + VespaModel model = tester.createModel(services, true); + + assertEquals("Nodes in container cluster", 1, + model.getContainerClusters().get("container1").getContainers().size()); + assertEquals("Nodes in content cluster (downscaled)", 1, + model.getContentClusters().get("content").getRootGroup().getNodes().size()); + + assertEquals(1, model.getAdmin().getSlobroks().size()); + + model.getConfig(new StorStatusConfig.Builder(), "default"); + StorageCluster storage = model.getContentClusters().get("content").getStorageCluster(); + StorCommunicationmanagerConfig.Builder builder = new StorCommunicationmanagerConfig.Builder(); + storage.getChildren().get("0").getConfig(builder); + } + + /** + * Deploying an application with "nodes count" standalone should give a single-node deployment, + * also if the user has a lingering hosts file from running self-hosted. + * + * NOTE: This does *not* work (but gives an understandable error message), + * but the current code does not get provoke the error that is thrown from HostsXmlProvisioner.prepare + */ + @Test + public void testThatHostedSyntaxWorksOnStandaloneAlsoWithAHostedFile() { + String services = + "<?xml version='1.0' encoding='utf-8' ?>" + + "<services>" + + " <container version='1.0' id='container1'>" + + " <search/>" + + " <nodes count='1'/>" + + " </container>" + + " <content version='1.0'>" + + " <redundancy>2</redundancy>" + + " <documents>" + + " <document type='type1' mode='index'/>" + + " </documents>" + + " <nodes count='2'/>" + + " </content>" + + "</services>"; + String hosts = + "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" + + "<hosts>\n" + + " <host name=\"vespa-1\">\n" + + " <alias>vespa-1</alias>\n" + + " </host>\n" + + " <host name=\"vespa-2\">\n" + + " <alias>vespa-2</alias>\n" + + " </host>\n" + + " <host name=\"vespa-3\">\n" + + " <alias>vespa-3</alias>\n" + + " </host>\n" + + "</hosts>"; + + VespaModelTester tester = new VespaModelTester(); + tester.setHosted(false); + tester.addHosts(3); + VespaModel model = tester.createModel(services, hosts, true); assertEquals("Nodes in container cluster", 1, model.getContainerClusters().get("container1").getContainers().size()); 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 1e4ef7f7bb4..77c790e7082 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 @@ -116,7 +116,12 @@ public class VespaModelTester { /** Creates a model which uses 0 as start index */ public VespaModel createModel(String services, boolean failOnOutOfCapacity, String ... retiredHostNames) { - return createModel(Zone.defaultZone(), services, failOnOutOfCapacity, false, false, 0, + return createModel(services, null, failOnOutOfCapacity, retiredHostNames); + } + + /** Creates a model which uses 0 as start index */ + public VespaModel createModel(String services, String hosts, boolean failOnOutOfCapacity, String ... retiredHostNames) { + return createModel(Zone.defaultZone(), services, hosts, failOnOutOfCapacity, false, false, 0, Optional.empty(), new DeployState.Builder(), retiredHostNames); } @@ -156,20 +161,28 @@ public class VespaModelTester { Optional.empty(), deployStateBuilder, retiredHostNames); } + public VespaModel createModel(Zone zone, String services, boolean failOnOutOfCapacity, boolean useMaxResources, + boolean alwaysReturnOneNode, + int startIndexForClusters, Optional<VespaModel> previousModel, + DeployState.Builder deployStatebuilder, String ... retiredHostNames) { + return createModel(zone, services, null, failOnOutOfCapacity, useMaxResources, alwaysReturnOneNode, + startIndexForClusters, previousModel, deployStatebuilder, retiredHostNames); + } /** * Creates a model using the hosts already added to this * * @param services the services xml string + * @param hosts the hosts xml string, or null if none * @param useMaxResources false to use the minmal resources (when given a range), true to use max * @param failOnOutOfCapacity whether we should get an exception when not enough hosts of the requested flavor * is available or if we should just silently receive a smaller allocation * @return the resulting model */ - public VespaModel createModel(Zone zone, String services, boolean failOnOutOfCapacity, boolean useMaxResources, + public VespaModel createModel(Zone zone, String services, String hosts, boolean failOnOutOfCapacity, boolean useMaxResources, boolean alwaysReturnOneNode, int startIndexForClusters, Optional<VespaModel> previousModel, DeployState.Builder deployStatebuilder, String ... retiredHostNames) { - VespaModelCreatorWithMockPkg modelCreatorWithMockPkg = new VespaModelCreatorWithMockPkg(null, services, generateSchemas("type1")); + VespaModelCreatorWithMockPkg modelCreatorWithMockPkg = new VespaModelCreatorWithMockPkg(hosts, services, generateSchemas("type1")); ApplicationPackage appPkg = modelCreatorWithMockPkg.appPkg; provisioner = hosted ? new ProvisionerAdapter(new InMemoryProvisioner(hostsByResources, |