diff options
author | Jon Marius Venstad <jonmv@users.noreply.github.com> | 2023-04-21 08:41:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-21 08:41:57 +0200 |
commit | af978333909c38c81fae4a0f71b8f2ed181c3439 (patch) | |
tree | aeb73226427745c532abf28165b71985e39c98fd /config-model | |
parent | 84d334ac701675f68497e91b5afe7ae6f2ca0b29 (diff) | |
parent | c762d24109dc8893b03dea661a9d4a34eeaf8f8c (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')
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>" + |