/*
* JBoss, Home of Professional Open Source
* Copyright 2014, JBoss Inc., and individual contributors as indicated
* by the @authors tag.
*
* 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.test.manualmode.deployment;
import static org.hamcrest.CoreMatchers.is;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.FAILED;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OUTCOME;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.PATH;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RELATIVE_TO;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SYSTEM_PROPERTY;
import static org.junit.Assert.assertThat;
import java.io.File;
import javax.inject.Inject;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.client.ModelControllerClient;
import org.jboss.as.controller.client.helpers.Operations;
import org.jboss.as.controller.operations.common.Util;
import org.jboss.as.server.deployment.scanner.FileSystemDeploymentScanHandler;
import org.jboss.as.test.integration.domain.management.util.DomainTestSupport;
import org.jboss.as.test.shared.TestSuiteEnvironment;
import org.jboss.as.test.shared.TimeoutUtil;
import org.jboss.dmr.ModelNode;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.wildfly.core.testrunner.ServerControl;
import org.wildfly.core.testrunner.ServerController;
import org.wildfly.core.testrunner.WildflyTestRunner;
/**
* Testing the rollback of a composite operation with a manual scan.
* @author <a href="mailto:ehugonne@redhat.com">Emmanuel Hugonnet</a> (c) 2015 Red Hat, inc.
*/
@RunWith(WildflyTestRunner.class)
@ServerControl(manual = true)
public class DeploymentScannerOperationRollbackTestCase extends AbstractDeploymentScannerOperationTestCase {
private static final int FAILING_TIMEOUT = 3000;
@Inject
private ServerController container;
@Test
public void testRollBackAfterOperationfailure() throws Exception {
container.start();
try {
try (ModelControllerClient client = TestSuiteEnvironment.getModelControllerClient()) {
final File deploymentOne = new File(deployDir, "deployment-one.jar");
createDeployment(deploymentOne, "org.jboss.modules");
addDeploymentScanner(client);
prepareRollback(client);
try {
assertThat(exists(client, DEPLOYMENT_ONE), is(false));
runFailingScan(client);
// Wait until deployed ...
long timeout = System.currentTimeMillis() + TimeoutUtil.adjust(FAILING_TIMEOUT);
while (!exists(client, DEPLOYMENT_ONE) && System.currentTimeMillis() < timeout) {
Thread.sleep(DELAY);
}
assertThat(exists(client, DEPLOYMENT_ONE), is(false));
String[] files = deployDir.list();
assertThat(files.length, is(1));
assertThat(files[0], is("deployment-one.jar"));
deploymentOne.delete();
} finally {
removeDeploymentScanner(client);
cleanRollback(client);
}
}
} finally {
container.stop();
}
}
private void prepareRollback(ModelControllerClient client) throws Exception {
final Operations.CompositeOperationBuilder builder = Operations.CompositeOperationBuilder.create();
ModelNode addParentPath = Operations.createAddOperation(PathAddress.pathAddress(PATH, "parent.path").toModelNode());
addParentPath.get(PATH).set("parent");
addParentPath.get(RELATIVE_TO).set("jboss.home.dir");
builder.addStep(addParentPath);
ModelNode addChildPath = Operations.createAddOperation(PathAddress.pathAddress(PATH, "child.path").toModelNode());
addChildPath.get(PATH).set("child");
addChildPath.get(RELATIVE_TO).set("parent.path");
builder.addStep(addChildPath);
DomainTestSupport.validateResponse(client.execute(builder.build()), false);
}
private void cleanRollback(ModelControllerClient client) throws Exception {
ModelNode removeChildPath = Operations.createRemoveOperation(PathAddress.pathAddress(PATH, "child.path").toModelNode());
DomainTestSupport.validateResponse(client.execute(removeChildPath), false);
ModelNode removeParentPath = Operations.createRemoveOperation(PathAddress.pathAddress(PATH, "parent.path").toModelNode());
DomainTestSupport.validateResponse(client.execute(removeParentPath), false);
}
private void runFailingScan(ModelControllerClient client) throws Exception {
final Operations.CompositeOperationBuilder builder = Operations.CompositeOperationBuilder.create();
builder.addStep(Operations.createAddOperation(PathAddress.pathAddress(SYSTEM_PROPERTY, "my.property").toModelNode()));
builder.addStep(Operations.createWriteAttributeOperation(PathAddress.pathAddress(SYSTEM_PROPERTY, "my.property").toModelNode(), "value", "test"));
builder.addStep(Util.createEmptyOperation(FileSystemDeploymentScanHandler.OPERATION_NAME, getTestDeploymentScannerResourcePath()));
builder.addStep(Operations.createRemoveOperation(PathAddress.pathAddress(PATH, "parent.path").toModelNode()));
final ModelNode result = executeOperation(client, builder.build().getOperation());
assertThat(result.get(OUTCOME).asString(), is(FAILED));
}
}