/*
* 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;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.FAILURE_DESCRIPTION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.GROUP;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.HOST;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OUTCOME;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESULT;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SERVER_CONFIG;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUCCESS;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.client.ModelControllerClient;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.controller.operations.common.Util;
import org.jboss.as.host.controller.model.host.AdminOnlyDomainConfigPolicy;
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.WildFlyManagedConfiguration;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
/**
* Tests of running domain hosts in admin-only move.
*/
@Ignore("[WFCORE-1958] Clean up testsuite Elytron registration.")
public class AdminOnlyPolicyTestCase {
private static DomainTestSupport testSupport;
private static DomainLifecycleUtil domainSlaveLifecycleUtil;
private static final long initTime = System.currentTimeMillis();
private static int slaveCount;
@BeforeClass
public static void setupDomain() throws Exception {
testSupport = DomainTestSupport.createAndStartSupport(DomainTestSupport.Configuration.create(AdminOnlyPolicyTestCase.class.getSimpleName(),
"domain-configs/domain-standard.xml", "host-configs/host-master.xml", null));
}
@AfterClass
public static void tearDownDomain() throws Exception {
testSupport.stop();
testSupport = null;
}
@After
public void stopSecondSlave() throws Exception {
if (domainSlaveLifecycleUtil != null) {
domainSlaveLifecycleUtil.stop();
domainSlaveLifecycleUtil = null;
}
}
@Test
public void testAllowNoConfigWithDiscovery() throws URISyntaxException, IOException {
createSecondSlave(AdminOnlyDomainConfigPolicy.ALLOW_NO_CONFIG, true, false);
validateProfiles();
}
@Test
public void testAllowNoConfigWithoutDiscovery() throws URISyntaxException, IOException {
createSecondSlave(AdminOnlyDomainConfigPolicy.ALLOW_NO_CONFIG, false, false);
validateProfiles();
}
@Test
public void testAllowNoConfigWithCachedDC() throws URISyntaxException, IOException {
createSecondSlave(AdminOnlyDomainConfigPolicy.ALLOW_NO_CONFIG, false, true);
validateProfiles("cached-remote-test");
}
@Test
public void testFetchFromMasterWithDiscovery() throws URISyntaxException, IOException {
String hostName = createSecondSlave(AdminOnlyDomainConfigPolicy.FETCH_FROM_MASTER, true, false);
validateProfiles("default");
// Now we validate that we can pull down further data if needed
PathAddress pa = PathAddress.pathAddress(PathElement.pathElement(HOST, hostName), PathElement.pathElement(SERVER_CONFIG, "other1"));
ModelNode op = Util.createAddOperation(pa);
op.get(GROUP).set("other-server-group");
executeForResult(domainSlaveLifecycleUtil.getDomainClient(), op);
// This should have pulled down the 'other' profile
validateProfiles("default", "other");
// ModelNode remove = Util.createRemoveOperation(pa);
// executeForResult(domainSlaveLifecycleUtil.getDomainClient(), remove);
//
// // This should have pulled down the 'other' profile
// validateProfiles("default");
}
@Test
public void testChangeProfile() throws URISyntaxException, IOException {
String hostName = createSecondSlave(AdminOnlyDomainConfigPolicy.FETCH_FROM_MASTER, true, false);
validateProfiles("default");
// Now we validate that we can pull down further data if needed
PathAddress pa = PathAddress.pathAddress(PathElement.pathElement(HOST, hostName), PathElement.pathElement(SERVER_CONFIG, "other1"));
ModelNode op = Util.createAddOperation(pa);
op.get(GROUP).set("other-server-group");
executeForResult(domainSlaveLifecycleUtil.getDomainClient(), op);
// This should have pulled down the 'other' profile
validateProfiles("default", "other");
// ModelNode remove = Util.createRemoveOperation(pa);
// executeForResult(domainSlaveLifecycleUtil.getDomainClient(), remove);
//
// // This should have pulled down the 'other' profile
// validateProfiles("default");
}
@Test
public void testFetchFromMasterWithoutDiscovery() throws URISyntaxException {
try {
createSecondSlave(AdminOnlyDomainConfigPolicy.FETCH_FROM_MASTER, false, false);
Assert.fail("secondSlaveLifecyleUtil should not have started");
} catch (RuntimeException e) {
Assert.assertTrue(domainSlaveLifecycleUtil.getProcessExitCode() >= 0);
}
}
@Test
public void testFetchFromMasterWithCachedDC() throws URISyntaxException, IOException {
createSecondSlave(AdminOnlyDomainConfigPolicy.FETCH_FROM_MASTER, false, true);
validateProfiles("cached-remote-test");
}
@Test
public void testRequireLocalConfigWithDiscovery() throws URISyntaxException {
try {
createSecondSlave(AdminOnlyDomainConfigPolicy.REQUIRE_LOCAL_CONFIG, true, false);
Assert.fail("secondSlaveLifecyleUtil should not have started");
} catch (RuntimeException e) {
Assert.assertTrue(domainSlaveLifecycleUtil.getProcessExitCode() >= 0);
}
}
@Test
public void testRequireLocalConfigWithoutDiscovery() throws URISyntaxException {
try {
createSecondSlave(AdminOnlyDomainConfigPolicy.REQUIRE_LOCAL_CONFIG, false, false);
Assert.fail("secondSlaveLifecyleUtil should not have started");
} catch (RuntimeException e) {
Assert.assertTrue(domainSlaveLifecycleUtil.getProcessExitCode() >= 0);
}
}
@Test
public void testRequireLocalConfigWithCachedDC() throws URISyntaxException, IOException {
createSecondSlave(AdminOnlyDomainConfigPolicy.REQUIRE_LOCAL_CONFIG, false, true);
validateProfiles("cached-remote-test");
}
private String createSecondSlave(AdminOnlyDomainConfigPolicy policy, boolean discovery, boolean cachedDC) throws URISyntaxException {
String hostName = "slave-" + initTime + "-" + (slaveCount++);
String hostConfigPath = "host-configs/" + (discovery ? "admin-only-discovery.xml" : "admin-only-no-discovery.xml");
WildFlyManagedConfiguration slaveConfig = DomainTestSupport.getSlaveConfiguration(hostName, hostConfigPath,
getClass().getSimpleName(), false);
slaveConfig.setHostControllerManagementPort(29999);
slaveConfig.setAdminOnly(true);
slaveConfig.addHostCommandLineProperty("-Djboss.test.admin-only-policy=" + policy.toString());
slaveConfig.addHostCommandLineProperty("-Djboss.host.name=" + hostName);
if (cachedDC) {
slaveConfig.setCachedDC(true);
ClassLoader tccl = Thread.currentThread().getContextClassLoader();
URL url = tccl.getResource("domain-configs/domain.cached-remote.xml");
assert url != null;
slaveConfig.setDomainConfigFile(new File(url.toURI()).getAbsolutePath());
}
domainSlaveLifecycleUtil = new DomainLifecycleUtil(slaveConfig, testSupport.getSharedClientConfiguration());
domainSlaveLifecycleUtil.start();
return hostName;
}
private void validateProfiles(String... expectedNames) throws IOException {
Set<String> set = new HashSet<String>(Arrays.asList(expectedNames));
ModelNode op = Util.createEmptyOperation(ModelDescriptionConstants.READ_CHILDREN_NAMES_OPERATION, PathAddress.EMPTY_ADDRESS);
op.get(ModelDescriptionConstants.CHILD_TYPE).set(ModelDescriptionConstants.PROFILE);
ModelNode result = executeForResult(domainSlaveLifecycleUtil.getDomainClient(), op);
Assert.assertEquals(result.toString(), ModelType.LIST, result.getType());
Assert.assertEquals(result.toString(), set.size(), result.asInt());
for (ModelNode profile : result.asList()) {
String name = profile.asString();
Assert.assertTrue(name, set.remove(name));
}
Assert.assertTrue(set.toString(), set.isEmpty());
}
private ModelNode executeForResult(final ModelControllerClient client, final ModelNode operation) throws IOException {
final ModelNode result = client.execute(operation);
return validateResponse(result);
}
private ModelNode validateResponse(ModelNode response) {
return validateResponse(response, true);
}
private ModelNode validateResponse(ModelNode response, boolean validateResult) {
if(! SUCCESS.equals(response.get(OUTCOME).asString())) {
System.out.println("Failed response:");
System.out.println(response);
Assert.fail(response.get(FAILURE_DESCRIPTION).toString());
}
if (validateResult) {
Assert.assertTrue("result exists", response.has(RESULT));
}
return response.get(RESULT);
}
}