/*
* JBoss, Home of Professional Open Source.
* Copyright 2011, 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.domain.suites;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.BLOCKING;
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.GROUP;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.HASH;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.HOST;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.INPUT_STREAM_INDEX;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NAME;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;
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.PROFILE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_ATTRIBUTE_OPERATION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SERVER_CONFIG;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SERVER_GROUP;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SOCKET_BINDING_GROUP;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.START;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.STEPS;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.STOP;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUCCESS;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.HashUtil;
import org.jboss.as.controller.client.Operation;
import org.jboss.as.controller.client.OperationBuilder;
import org.jboss.as.controller.client.helpers.domain.DomainClient;
import org.jboss.as.controller.operations.common.Util;
import org.jboss.as.test.integration.domain.management.util.DomainLifecycleUtil;
import org.jboss.as.test.integration.domain.management.util.DomainTestSupport;
import org.jboss.as.test.integration.domain.management.util.DomainTestUtils;
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.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Test of slave hosts ignoring unused deployment and configuration when ignore-unused-configuration is true
* on the slave
*
* @author Ken Wills (c) 2015 Red Hat Inc.
*/
public class IgnoreUnusedConfigurationTestCase {
static final PathAddress SLAVE_ADDR = PathAddress.pathAddress(HOST, "slave");
static final PathAddress MASTER_ADDR = PathAddress.pathAddress(HOST, "master");
private static DomainTestSupport testSupport;
private static DomainLifecycleUtil domainMasterLifecycleUtil;
private static DomainLifecycleUtil domainSlaveLifecycleUtil;
@BeforeClass
public static void setupDomain() throws Exception {
testSupport = DomainTestSuite.createSupport(IgnoredResourcesTestCase.class.getSimpleName());
domainMasterLifecycleUtil = testSupport.getDomainMasterLifecycleUtil();
domainSlaveLifecycleUtil = testSupport.getDomainSlaveLifecycleUtil();
createServerGroup(domainMasterLifecycleUtil.getDomainClient(), "slave-ignore-group", "default");
createServer(domainMasterLifecycleUtil.getDomainClient(), "master-only-server", "slave-ignore-group");
startServer(domainMasterLifecycleUtil.getDomainClient(), "master-only-server");
}
@AfterClass
public static void tearDownDomain() throws Exception {
stopServer(domainMasterLifecycleUtil.getDomainClient(), "master-only-server");
DomainTestUtils.executeForResult(Util.createRemoveOperation(MASTER_ADDR.append(SERVER_CONFIG, "master-only-server")), domainMasterLifecycleUtil.getDomainClient());
DomainTestUtils.executeForResult(Util.createRemoveOperation(PathAddress.pathAddress(SERVER_GROUP, "slave-ignore-group")), domainMasterLifecycleUtil.getDomainClient());
testSupport = null;
domainMasterLifecycleUtil = null;
domainSlaveLifecycleUtil = null;
DomainTestSuite.stopSupport();
}
@Test
public void testDeploymentIgnoredByIgnoreUnusedConfiguration() throws Exception {
final JavaArchive archive = ShrinkWrap.create(JavaArchive.class);
archive.add(new StringAsset("test"), "test");
final InputStream is = archive.as(ZipExporter.class).exportAsInputStream();
try {
final ModelNode composite = new ModelNode();
composite.get(OP).set(COMPOSITE);
composite.get(OP_ADDR).setEmptyList();
final ModelNode steps = composite.get(STEPS);
final ModelNode add = steps.add();
add.get(OP).set(ADD);
add.get(OP_ADDR).add(DEPLOYMENT, "testIUC.jar");
add.get(CONTENT).add().get(INPUT_STREAM_INDEX).set(0);
final ModelNode sAdd = steps.add();
sAdd.get(OP).set(ADD);
sAdd.get(OP_ADDR).add(SERVER_GROUP, "slave-ignore-group").add(DEPLOYMENT, "testIUC.jar");
final Operation operation = OperationBuilder.create(composite).addInputStream(is).build();
final ModelNode result = domainMasterLifecycleUtil.getDomainClient().execute(operation);
Assert.assertEquals(result.asString(), result.get(OUTCOME).asString(), SUCCESS);
final ModelNode ra = new ModelNode();
ra.get(OP).set(READ_ATTRIBUTE_OPERATION);
ra.get(OP_ADDR).add(DEPLOYMENT, "testIUC.jar");
ra.get(NAME).set(CONTENT);
final ModelNode r = DomainTestUtils.executeForResult(ra, domainMasterLifecycleUtil.getDomainClient());
final byte[] hash = r.get(0).get(HASH).asBytes();
Assert.assertTrue(exists(domainMasterLifecycleUtil, hash));
Assert.assertFalse(exists(domainSlaveLifecycleUtil, hash));
// undeploy and check that both master and slave don't have the deployment
ModelNode undeploy = new ModelNode();
undeploy.get(OP).set(COMPOSITE);
ModelNode undeploySteps = undeploy.get(STEPS);
undeploySteps.add(Util.createRemoveOperation(
PathAddress.pathAddress(SERVER_GROUP, "slave-ignore-group").append(DEPLOYMENT, "testIUC.jar")));
undeploySteps.add(Util.createRemoveOperation(PathAddress.pathAddress(DEPLOYMENT, "testIUC.jar")));
ModelNode undeployResult = DomainTestUtils.executeForResult(undeploy, domainMasterLifecycleUtil.getDomainClient());
Assert.assertFalse(exists(domainMasterLifecycleUtil, hash));
Assert.assertFalse(exists(domainSlaveLifecycleUtil, hash));
} finally {
if (is != null) try {
is.close();
} catch (IOException e) {
// ignored
}
}
}
static boolean exists(final DomainLifecycleUtil util, final byte[] hash) {
final File home = new File(util.getConfiguration().getDomainDirectory());
// Domain contents
final File data = new File(home, "data");
final File contents = new File(data, "content");
return exists(contents, hash);
}
static boolean exists(final File root, final byte[] hash) {
final String sha1 = HashUtil.bytesToHexString(hash);
final String partA = sha1.substring(0,2);
final String partB = sha1.substring(2);
final File da = new File(root, partA);
final File db = new File(da, partB);
final File content = new File(db, "content");
return content.exists();
}
static void createServerGroup(DomainClient client, String name, String profile) throws Exception {
ModelNode add = Util.createAddOperation(PathAddress.pathAddress(SERVER_GROUP, name));
add.get(PROFILE).set(profile);
add.get(SOCKET_BINDING_GROUP).set("standard-sockets");
DomainTestUtils.executeForResult(add, client);
}
static void createServer(DomainClient client, String name, String serverGroup) throws Exception {
ModelNode add = Util.createAddOperation(MASTER_ADDR.append(SERVER_CONFIG, name));
add.get(GROUP).set(serverGroup);
//add.get(PORT_OFFSET).set(portOffset);
DomainTestUtils.executeForResult(add, client);
}
static void startServer(DomainClient client, String name) throws Exception {
ModelNode start = Util.createEmptyOperation(START, MASTER_ADDR.append(SERVER_CONFIG, name));
start.get(BLOCKING).set(true);
DomainTestUtils.executeForResult(start, client);
}
static void stopServer(DomainClient client, String name) throws Exception {
PathAddress serverAddr = MASTER_ADDR.append(SERVER_CONFIG, name);
ModelNode stop = Util.createEmptyOperation(STOP, serverAddr);
stop.get(BLOCKING).set(true);
DomainTestUtils.executeForResult(stop, client);
}
}