aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src
diff options
context:
space:
mode:
Diffstat (limited to 'config-model/src')
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/provision/HostsXmlProvisioner.java5
-rw-r--r--config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java60
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java19
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,