diff options
Diffstat (limited to 'config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/GlobalDocumentChangeValidator.java')
-rw-r--r-- | config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/GlobalDocumentChangeValidator.java | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/GlobalDocumentChangeValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/GlobalDocumentChangeValidator.java index 0590bb2d1e6..df8bf0e9b01 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/GlobalDocumentChangeValidator.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/GlobalDocumentChangeValidator.java @@ -2,35 +2,30 @@ package com.yahoo.vespa.model.application.validation.change; import com.yahoo.config.application.api.ValidationId; -import com.yahoo.config.model.api.ConfigChangeAction; -import com.yahoo.config.model.deploy.DeployState; +import com.yahoo.config.provision.ClusterSpec; import com.yahoo.documentmodel.NewDocumentType; -import com.yahoo.vespa.model.VespaModel; +import com.yahoo.vespa.model.application.validation.Validation.ChangeContext; import com.yahoo.vespa.model.content.cluster.ContentCluster; -import java.util.List; import java.util.Map; /** - * Class that fails via exception if global attribute changes for a document + * Class that adds a validation failure if global attribute changes for a document * type in a content cluster unless corresponding override is present. */ public class GlobalDocumentChangeValidator implements ChangeValidator { @Override - public List<ConfigChangeAction> validate(VespaModel currentModel, VespaModel nextModel, DeployState deployState) { - if (!deployState.validationOverrides().allows(ValidationId.globalDocumentChange.value(), deployState.now())) { - for (Map.Entry<String, ContentCluster> currentEntry : currentModel.getContentClusters().entrySet()) { - ContentCluster nextCluster = nextModel.getContentClusters().get(currentEntry.getKey()); + public void validate(ChangeContext context) { + for (Map.Entry<String, ContentCluster> currentEntry : context.previousModel().getContentClusters().entrySet()) { + ContentCluster nextCluster = context.model().getContentClusters().get(currentEntry.getKey()); if (nextCluster == null) continue; - validateContentCluster(currentEntry.getValue(), nextCluster); + validateContentCluster(context, currentEntry.getValue(), nextCluster); } - } - return List.of(); } - private void validateContentCluster(ContentCluster currentCluster, ContentCluster nextCluster) { + private void validateContentCluster(ChangeContext context, ContentCluster currentCluster, ContentCluster nextCluster) { String clusterName = currentCluster.getName(); currentCluster.getDocumentDefinitions().forEach((documentTypeName, currentDocumentType) -> { NewDocumentType nextDocumentType = nextCluster.getDocumentDefinitions().get(documentTypeName); @@ -38,10 +33,12 @@ public class GlobalDocumentChangeValidator implements ChangeValidator { boolean currentIsGlobal = currentCluster.isGloballyDistributed(currentDocumentType); boolean nextIsGlobal = nextCluster.isGloballyDistributed(nextDocumentType); if (currentIsGlobal != nextIsGlobal) { - throw new IllegalStateException(String.format("Document type %s in cluster %s changed global from %s to %s. " + - "Add validation override '%s' to force this change through. " + - "First, stop services on all content nodes. Then, deploy with validation override. Finally, start services on all content nodes.", - documentTypeName, clusterName, currentIsGlobal, nextIsGlobal, ValidationId.globalDocumentChange.value())); + String reason = "Document type %s in cluster %s changed global from %s to %s. ".formatted(documentTypeName, clusterName, currentIsGlobal, nextIsGlobal) + + "To handle this change, first stop services on all content nodes. Then, deploy with validation override. Finally, start services on all content nodes"; + if ( ! context.deployState().validationOverrides().allows(ValidationId.globalDocumentChange, context.deployState().now())) + context.invalid(ValidationId.globalDocumentChange, reason); + else if (context.deployState().isHosted()) + context.require(new VespaRestartAction(ClusterSpec.Id.from(clusterName), reason)); } } }); |