/*
* JBoss, Home of Professional Open Source.
* Copyright 2013, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.test.integration.deployment;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.COMPOSITE;
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.ENABLED;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.FAILED;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.INPUT_STREAM_INDEX;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OPERATION_HEADERS;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OUTCOME;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_RESOURCE_OPERATION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESULT;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ROLLBACK_ON_RUNTIME_FAILURE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.STEPS;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUCCESS;
import static org.jboss.as.protocol.StreamUtils.safeClose;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.client.ModelControllerClient;
import org.jboss.as.controller.client.Operation;
import org.jboss.as.controller.client.OperationBuilder;
import org.jboss.as.controller.operations.common.Util;
import org.jboss.as.test.integration.management.base.ContainerResourceMgmtTestBase;
import org.jboss.dmr.ModelNode;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.exporter.ZipExporter;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* @author Emanuel Muckenhuber
*/
@RunWith(Arquillian.class)
@RunAsClient
public class DeploymentOperationsTestCase extends ContainerResourceMgmtTestBase {
private final PathAddress DEPLOYMENT_ONE = PathAddress.pathAddress(PathElement.pathElement(DEPLOYMENT, "deployment-one"));
private final PathAddress DEPLOYMENT_TWO = PathAddress.pathAddress(PathElement.pathElement(DEPLOYMENT, "deployment-two"));
private static final String tempDir = System.getProperty("java.io.tmpdir");
private File deployDir;
@Before
public void before() throws Exception {
deployDir = new File(tempDir + File.separator + "tempDeployments");
if (deployDir.exists()) {
FileUtils.deleteDirectory(deployDir);
}
assertTrue("Unable to create deployment scanner directory.", deployDir.mkdir());
}
@After
public void after() throws Exception {
FileUtils.deleteDirectory(deployDir);
}
@Test
public void testDeploymentRollbackOnRuntimeFailure() throws Exception {
final File deploymentOne = new File(deployDir, "deployment-one.jar");
final File deploymentTwo = new File(deployDir, "deployment-two.jar");
createDeployment(deploymentOne, "org.jboss.modules");
createDeployment(deploymentTwo, "non.existing.dependency");
final ModelNode composite = new ModelNode();
composite.get(OP).set(COMPOSITE);
composite.get(OPERATION_HEADERS).get(ROLLBACK_ON_RUNTIME_FAILURE).set(false);
final ModelNode nested = composite.get(STEPS).setEmptyList().add();
nested.get(OP).set(COMPOSITE);
nested.get(OP_ADDR).setEmptyList();
final ModelNode steps = nested.get(STEPS).setEmptyList();
final ModelNode deployOne = steps.add();
deployOne.get(OP).set(ADD);
deployOne.get(OP_ADDR).set(DEPLOYMENT_ONE.toModelNode());
deployOne.get(ENABLED).set(true);
deployOne.get(CONTENT).add().get(INPUT_STREAM_INDEX).set(0);
final ModelNode deployTwo = steps.add();
deployTwo.get(OP).set(ADD);
deployTwo.get(OP_ADDR).set(DEPLOYMENT_TWO.toModelNode());
deployTwo.get(ENABLED).set(true);
deployTwo.get(CONTENT).add().get(INPUT_STREAM_INDEX).set(1);
final Operation operation = OperationBuilder.create(composite, true)
.addFileAsAttachment(deploymentOne)
.addFileAsAttachment(deploymentTwo)
.build();
final ModelControllerClient client = getModelControllerClient();
try {
// Deploy
final ModelNode overallResult = client.execute(operation);
Assert.assertTrue(overallResult.asString(), SUCCESS.equals(overallResult.get(OUTCOME).asString()));
final ModelNode result = overallResult.get(RESULT, "step-1");
Assert.assertTrue(result.asString(), SUCCESS.equals(result.get(OUTCOME).asString()));
final ModelNode step1 = result.get(RESULT, "step-1");
Assert.assertEquals(SUCCESS, step1.get(OUTCOME).asString());
final ModelNode step2 = result.get(RESULT, "step-2");
Assert.assertEquals(FAILED, step2.get(OUTCOME).asString());
} finally {
safeClose(operation);
}
// Check if deployment-one and -two exist
executeOperation(Util.createEmptyOperation(READ_RESOURCE_OPERATION, DEPLOYMENT_ONE));
executeOperation(Util.createEmptyOperation(READ_RESOURCE_OPERATION, DEPLOYMENT_TWO));
//do cleanup
executeOperation(Util.createRemoveOperation(DEPLOYMENT_ONE));
executeOperation(Util.createRemoveOperation(DEPLOYMENT_TWO));
}
protected void createDeployment(final File file, final String dependency) throws IOException {
final JavaArchive archive = ShrinkWrap.create(JavaArchive.class);
final String dependencies = "Dependencies: " + dependency;
archive.add(new StringAsset(dependencies), "META-INF/MANIFEST.MF");
archive.as(ZipExporter.class).exportTo(file);
}
}