/*
* JBoss, Home of Professional Open Source.
* Copyright 2015, 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;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.CHILD_TYPE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DIRECTORY;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DOMAIN_CONFIG;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.HOST;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.HOST_CONFIG;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NAMES;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_CHILDREN_NAMES_OPERATION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SYSTEM_PROPERTY;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VALUE;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.jboss.as.controller.PathAddress;
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.as.test.integration.domain.suites.DomainTestSuite;
import org.jboss.dmr.ModelNode;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Tests using host-config and domain-config parameters in the :reload operation
*
* @author Kabir Khan
*/
public class ReloadWithConfigTestCase {
private static final String MASTER = "master";
private static final String SLAVE = "slave";
private static final String RELOAD_TEST_CASE_ONE = "reload-test-case-one";
private static final String RELOAD_TEST_CASE_TWO = "reload-test-case-two";
private static DomainTestSupport testSupport;
private static DomainLifecycleUtil domainMasterLifecycleUtil;
private static DomainLifecycleUtil domainSlaveLifecycleUtil;
Map<String, File> snapshotDirectories = new HashMap<>();
@BeforeClass
public static void setupDomain() throws Exception {
testSupport = DomainTestSuite.createSupport(ReloadWithConfigTestCase.class.getSimpleName());
domainMasterLifecycleUtil = testSupport.getDomainMasterLifecycleUtil();
domainSlaveLifecycleUtil = testSupport.getDomainSlaveLifecycleUtil();
}
@AfterClass
public static void tearDownDomain() throws Exception {
testSupport = null;
domainMasterLifecycleUtil = null;
domainSlaveLifecycleUtil = null;
DomainTestSuite.stopSupport();
}
@Test
public void reloadFromSnapshotTestCase() throws Exception {
DomainClient masterClient = domainMasterLifecycleUtil.getDomainClient();
DomainClient slaveClient = domainSlaveLifecycleUtil.getDomainClient();
cleanSnapshotDirectory(masterClient, null);
cleanSnapshotDirectory(masterClient, MASTER);
cleanSnapshotDirectory(slaveClient, SLAVE);
try {
addSystemProperty(masterClient, null, RELOAD_TEST_CASE_ONE, "1");
addSystemProperty(masterClient, MASTER, RELOAD_TEST_CASE_ONE, "1");
addSystemProperty(slaveClient, SLAVE, RELOAD_TEST_CASE_ONE, "1");
takeSnapshot(masterClient, null);
takeSnapshot(masterClient, MASTER);
takeSnapshot(slaveClient, SLAVE);
addSystemProperty(masterClient, null, RELOAD_TEST_CASE_TWO, "2");
addSystemProperty(masterClient, MASTER, RELOAD_TEST_CASE_TWO, "2");
addSystemProperty(slaveClient, SLAVE, RELOAD_TEST_CASE_TWO, "2");
List<File> domainSnapshots = listSnapshots(masterClient, null);
List<File> masterSnapshots = listSnapshots(masterClient, MASTER);
List<File> slaveSnapshots = listSnapshots(slaveClient, SLAVE);
Assert.assertEquals(1, domainSnapshots.size());
Assert.assertEquals(1, masterSnapshots.size());
Assert.assertEquals(1, slaveSnapshots.size());
masterClient = reloadHost(domainMasterLifecycleUtil, MASTER, masterSnapshots.get(0).getName(), domainSnapshots.get(0).getName());
slaveClient = reloadHost(domainSlaveLifecycleUtil, SLAVE, slaveSnapshots.get(0).getName(), null);
assertSystemPropertyOneButNotTwo(masterClient, null);
assertSystemPropertyOneButNotTwo(masterClient, MASTER);
assertSystemPropertyOneButNotTwo(slaveClient, SLAVE);
} finally {
removeSystemProperty(masterClient, null, RELOAD_TEST_CASE_ONE);
removeSystemProperty(masterClient, null, RELOAD_TEST_CASE_TWO);
removeSystemProperty(masterClient, MASTER, RELOAD_TEST_CASE_ONE);
removeSystemProperty(masterClient, MASTER, RELOAD_TEST_CASE_TWO);
removeSystemProperty(slaveClient, SLAVE, RELOAD_TEST_CASE_ONE);
removeSystemProperty(slaveClient, SLAVE, RELOAD_TEST_CASE_TWO);
cleanSnapshotDirectory(masterClient, null);
cleanSnapshotDirectory(masterClient, MASTER);
cleanSnapshotDirectory(slaveClient, SLAVE);
}
}
private void addSystemProperty(DomainClient client, String host, String name, String value) throws Exception {
ModelNode op = Util.createAddOperation(getRootAddress(host).append(SYSTEM_PROPERTY, name));
op.get(VALUE).set(value);
DomainTestUtils.executeForResult(op, client);
}
private void takeSnapshot(DomainClient client, String host) throws Exception {
DomainTestUtils.executeForResult(Util.createEmptyOperation("take-snapshot", getRootAddress(host)), client);
}
private List<File> listSnapshots(DomainClient client, String host) throws Exception {
final ModelNode op = Util.createEmptyOperation("list-snapshots", getRootAddress(host));
final ModelNode result = DomainTestUtils.executeForResult(op, client);
String dir = result.get(DIRECTORY).asString();
ModelNode names = result.get(NAMES);
List<File> snapshotFiles = new ArrayList<>();
for (ModelNode nameNode : names.asList()) {
snapshotFiles.add(new File(dir, nameNode.asString()));
}
return snapshotFiles;
}
private void cleanSnapshotDirectory(DomainClient client, String host) throws Exception {
for (File file : getSnapshotDir(client, host).listFiles()) {
Assert.assertTrue(file.delete());
}
}
private File getSnapshotDir(DomainClient client, String host) throws Exception {
String key = host == null ? "domain" : host;
File snapshotDir = snapshotDirectories.get(key);
if (snapshotDir == null) {
final ModelNode op = Util.createEmptyOperation("list-snapshots", getRootAddress(host));
final ModelNode result = DomainTestUtils.executeForResult(op, client);
final String dir = result.get(DIRECTORY).asString();
snapshotDir = new File(dir);
snapshotDirectories.put(key, snapshotDir);
}
return snapshotDir;
}
private void removeSystemProperty(DomainClient client, String host, String name) throws Exception {
try {
PathAddress addr = getRootAddress(host).append(SYSTEM_PROPERTY, name);
DomainTestUtils.executeForResult(Util.createRemoveOperation(addr), client);
} catch (Exception e) {
e.printStackTrace();
}
}
private PathAddress getRootAddress(String host) {
return host == null ? PathAddress.EMPTY_ADDRESS : PathAddress.pathAddress(HOST, host);
}
private void assertSystemPropertyOneButNotTwo(DomainClient client, String host) throws Exception {
final ModelNode readChildrenNames = Util.createEmptyOperation(READ_CHILDREN_NAMES_OPERATION, getRootAddress(host));
readChildrenNames.get(CHILD_TYPE).set(SYSTEM_PROPERTY);
Set<String> names = DomainTestUtils.executeForResult(readChildrenNames, client).asList()
.stream().map(node -> node.asString()).collect(Collectors.toSet());
Assert.assertTrue(names.contains(RELOAD_TEST_CASE_ONE));
Assert.assertFalse(names.contains(RELOAD_TEST_CASE_TWO));
}
private DomainClient reloadHost(DomainLifecycleUtil util, String host, String hostConfig, String domainConfig) throws Exception {
ModelNode reload = Util.createEmptyOperation("reload", getRootAddress(host));
reload.get(HOST_CONFIG).set(hostConfig);
if (domainConfig != null) {
reload.get(DOMAIN_CONFIG).set(domainConfig);
}
util.executeAwaitConnectionClosed(reload);
util.connect();
util.awaitHostController(System.currentTimeMillis());
return util.createDomainClient();
}
}