/* * Copyright 2016 JBoss by Red Hat. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.as.core.model.test.deployment; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ARCHIVE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.CONTENT; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DEPLOYMENT; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP; import static org.jboss.as.model.test.FailedOperationTransformationConfig.REJECTED_RESOURCE; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.jboss.as.controller.ModelVersion; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathElement; import org.jboss.as.core.model.test.AbstractCoreModelTest; import org.jboss.as.core.model.test.KernelServices; import org.jboss.as.core.model.test.KernelServicesBuilder; import org.jboss.as.core.model.test.TestModelType; import org.jboss.as.core.model.test.TransformersTestParameterized; import org.jboss.as.core.model.test.TransformersTestParameterized.TransformersParameter; import org.jboss.as.core.model.test.util.TransformersTestParameter; import org.jboss.as.model.test.FailedOperationTransformationConfig; import org.jboss.as.model.test.ModelFixer; import org.jboss.as.model.test.ModelTestControllerVersion; import org.jboss.as.model.test.ModelTestUtils; import org.jboss.dmr.ModelNode; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; /** * Test for deployment transformers. * @author Emmanuel Hugonnet (c) 2016 Red Hat, inc. */ @RunWith(TransformersTestParameterized.class) public class DomainDeploymentTransformersTestCase extends AbstractCoreModelTest { private final ModelVersion modelVersion; private final ModelTestControllerVersion testControllerVersion; public DomainDeploymentTransformersTestCase(TransformersTestParameter params) { this.modelVersion = params.getModelVersion(); this.testControllerVersion = params.getTestControllerVersion(); } @TransformersParameter public static List<TransformersTestParameter> parameters() { return TransformersTestParameter.setupVersions(); } @Test public void domainDeployment() throws Exception { try { KernelServicesBuilder builder = createKernelServicesBuilder(TestModelType.DOMAIN) .setXmlResource("domain-deployments.xml") .createContentRepositoryContent("12345678901234567890"); builder.createLegacyKernelServicesBuilder(modelVersion, testControllerVersion).configureReverseControllerCheck(ARCHIVE_REDEFINER, ARCHIVE_REDEFINER); KernelServices mainServices = builder.build(); Assert.assertTrue(mainServices.isSuccessfulBoot()); KernelServices legacyServices = mainServices.getLegacyServices(modelVersion); Assert.assertTrue("Legacy services didn't boot for version " + modelVersion, legacyServices.isSuccessfulBoot()); checkCoreModelTransformation(mainServices, modelVersion); } catch (Exception ex) { throw new RuntimeException("Error for version " + modelVersion + " " + ex.getMessage(), ex); } } @Test public void domainExplodedDeployment() throws Exception { try { KernelServicesBuilder builder = createKernelServicesBuilder(TestModelType.DOMAIN) .setXmlResource("domain-deployments.xml") .createContentRepositoryContent("12345678901234567890"); builder.createLegacyKernelServicesBuilder(modelVersion, testControllerVersion).configureReverseControllerCheck(ARCHIVE_REDEFINER, ARCHIVE_REDEFINER); KernelServices mainServices = builder.build(); Assert.assertTrue(mainServices.isSuccessfulBoot()); KernelServices legacyServices = mainServices.getLegacyServices(modelVersion); Assert.assertTrue("Legacy services didn't boot for version " + modelVersion, legacyServices.isSuccessfulBoot()); List<ModelNode> operations = builder.parseXmlResource("domain-exploded-deployments.xml"); //removing the ading of "management-client-content" => "rollout-plans operations = operations.subList(0, operations.size() -2); ModelTestUtils.checkFailedTransformedBootOperations(mainServices, modelVersion, operations, getConfig()); } catch (Exception ex) { throw new RuntimeException("Error for version " + modelVersion + " " + ex.getMessage(), ex); } } private FailedOperationTransformationConfig getConfig() { return new FailedOperationTransformationConfig() .addFailedAttribute(PathAddress.pathAddress().append(DEPLOYMENT, "myThirdApp"), new RejectArchiveConfig()) .addFailedAttribute(PathAddress.pathAddress(PathElement.pathElement("management-client-content","rollout-plans")), REJECTED_RESOURCE); } private static final ModelFixer ARCHIVE_REDEFINER = new ModelFixer() { @Override public ModelNode fixModel(ModelNode modelNode) { ModelNode clone = modelNode.clone(); List<String> applications = Arrays.asList("myFirstApp", "mySecondApp", "myThirdApp"); for (String app : applications) { if (modelNode.hasDefined("deployment", app, "content")) { clone.get("deployment", app, "content").clear().set(removeArchive(modelNode.get("deployment", app, "content"))); } } return clone; } private ModelNode removeArchive(ModelNode content) { ModelNode clone = content.clone(); if (content.hasDefined(0) && !content.get(0).hasDefined(ARCHIVE)) { clone.get(0).get(ARCHIVE).set(true); } return clone; } }; public static class RejectArchiveConfig implements FailedOperationTransformationConfig.PathAddressConfig { @Override public boolean expectFailed(ModelNode operation) { if (ADD.equals(operation.get(OP).asString())) { if (operation.hasDefined(CONTENT) && operation.get(CONTENT).hasDefined(0)) { ModelNode content = operation.require(CONTENT).require(0); return content.hasDefined(ARCHIVE); } } return false; } @Override public boolean canCorrectMore(ModelNode operation) { return false; } @Override public ModelNode correctOperation(ModelNode operation) { return operation; } @Override public List<ModelNode> createWriteAttributeOperations(ModelNode operation) { return Collections.emptyList(); } @Override public boolean expectFailedWriteAttributeOperation(ModelNode operation) { return false; } @Override public ModelNode correctWriteAttributeOperation(ModelNode operation) { return operation; } @Override public boolean expectDiscarded(ModelNode operation) { return false; } } }