summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorJon Marius Venstad <jonmv@users.noreply.github.com>2023-04-21 08:41:57 +0200
committerGitHub <noreply@github.com>2023-04-21 08:41:57 +0200
commitaf978333909c38c81fae4a0f71b8f2ed181c3439 (patch)
treeaeb73226427745c532abf28165b71985e39c98fd /config-model
parent84d334ac701675f68497e91b5afe7ae6f2ca0b29 (diff)
parentc762d24109dc8893b03dea661a9d4a34eeaf8f8c (diff)
Merge pull request #26797 from vespa-engine/jonmv/require-containers-in-cloud
Forbid applications without a container cluster in hosted Vespa
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/ContainerInCloudValidator.java19
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validation.java1
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/application/validation/ContainerInCloudValidatorTest.java60
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/application/validation/ValidationTester.java2
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/IndexingModeChangeValidatorTest.java3
5 files changed, 84 insertions, 1 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/ContainerInCloudValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/ContainerInCloudValidator.java
new file mode 100644
index 00000000000..d9bf82980d7
--- /dev/null
+++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/ContainerInCloudValidator.java
@@ -0,0 +1,19 @@
+package com.yahoo.vespa.model.application.validation;
+
+import com.yahoo.config.model.deploy.DeployState;
+import com.yahoo.vespa.model.VespaModel;
+
+/**
+ * Validates that a Vespa Cloud application has at least one container cluster.
+ *
+ * @author jonmv
+ */
+public class ContainerInCloudValidator extends Validator {
+
+ @Override
+ public void validate(VespaModel model, DeployState deployState) {
+ if (deployState.isHosted() && model.getContainerClusters().isEmpty())
+ throw new IllegalArgumentException("Vespa Cloud applications must have at least one container cluster");
+ }
+
+}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validation.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validation.java
index 2576d9cb392..4f2f8e7932c 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validation.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validation.java
@@ -76,6 +76,7 @@ public class Validation {
new StreamingValidator().validate(model, deployState);
new RankSetupValidator(validationParameters.ignoreValidationErrors()).validate(model, deployState);
new NoPrefixForIndexes().validate(model, deployState);
+ new ContainerInCloudValidator().validate(model, deployState);
new DeploymentSpecValidator().validate(model, deployState);
new ValidationOverridesValidator().validate(model, deployState);
new ConstantValidator().validate(model, deployState);
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ContainerInCloudValidatorTest.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ContainerInCloudValidatorTest.java
new file mode 100644
index 00000000000..3feb8888821
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ContainerInCloudValidatorTest.java
@@ -0,0 +1,60 @@
+package com.yahoo.vespa.model.application.validation;
+
+import com.yahoo.config.application.api.ApplicationPackage;
+import com.yahoo.config.model.NullConfigModelRegistry;
+import com.yahoo.config.model.deploy.DeployState;
+import com.yahoo.config.model.deploy.TestProperties;
+import com.yahoo.config.model.test.MockApplicationPackage;
+import com.yahoo.vespa.model.VespaModel;
+import org.junit.jupiter.api.Test;
+import org.xml.sax.SAXException;
+
+import java.io.IOException;
+
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class ContainerInCloudValidatorTest {
+
+ @Test
+ void failsWhenNoContainerInCloud() throws IOException, SAXException {
+ String noContainer = "";
+ String container = """
+ <container id='default' version='1.0'>
+ <nodes count='2' />
+ </container>
+ """;
+ runValidatorOnApp(false, container);
+ runValidatorOnApp(false, noContainer);
+ runValidatorOnApp(true, container);
+ assertEquals("Vespa Cloud applications must have at least one container cluster",
+ assertThrows(IllegalArgumentException.class,
+ () -> runValidatorOnApp(true, noContainer))
+ .getMessage());
+ }
+
+ private static void runValidatorOnApp(boolean isHosted, String container) throws IOException, SAXException {
+ String servicesXml = """
+ <services version='1.0'>
+ %s
+ <content version='1.0'>
+ <redundancy>2</redundancy>
+ <documents>
+ </documents>
+ <nodes count='2' />
+ </content>
+ </services>
+ """.formatted(container);
+ ApplicationPackage app = new MockApplicationPackage.Builder()
+ .withServices(servicesXml)
+ .build();
+ DeployState deployState = new DeployState.Builder()
+ .applicationPackage(app)
+ .properties(new TestProperties().setHostedVespa(isHosted).setAllowUserFilters(false))
+ .build();
+ VespaModel model = new VespaModel(new NullConfigModelRegistry(), deployState);
+ new ContainerInCloudValidator().validate(model, deployState);
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ValidationTester.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ValidationTester.java
index cb535380b18..78d3838d39d 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ValidationTester.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ValidationTester.java
@@ -35,7 +35,7 @@ public class ValidationTester {
/** Creates a validation tester with 1 node available (in addition to cluster controllers) */
public ValidationTester() {
- this(4);
+ this(5);
}
/** Creates a validation tester with number of nodes available and the given test properties */
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/IndexingModeChangeValidatorTest.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/IndexingModeChangeValidatorTest.java
index 5d0a1704a1d..784174a35a0 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/IndexingModeChangeValidatorTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/IndexingModeChangeValidatorTest.java
@@ -79,6 +79,9 @@ public class IndexingModeChangeValidatorTest {
private static String getServices(String indexingMode) {
return "<services version='1.0'>" +
+ " <container id='default-container' version='1.0'>" +
+ " <nodes count='1'/>" +
+ " </container>" +
" <content id='default' version='1.0'>" +
" <redundancy>1</redundancy>" +
" <documents>" +