/*
* JBoss, Home of Professional Open Source.
* Copyright 2012, 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.COMPOSITE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.EXTENSION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.HOST;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.HOST_FAILURE_DESCRIPTIONS;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.MANAGEMENT_MAJOR_VERSION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.MANAGEMENT_MICRO_VERSION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.MANAGEMENT_MINOR_VERSION;
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.READ_RESOURCE_OPERATION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REMOVE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESULT;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SERVER_GROUPS;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.STEPS;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUBSYSTEM;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUCCESS;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VALUE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.WRITE_ATTRIBUTE_OPERATION;
import static org.jboss.as.test.integration.domain.management.util.DomainTestUtils.createCompositeOperation;
import static org.jboss.as.test.integration.domain.management.util.DomainTestUtils.createOperation;
import static org.jboss.as.test.integration.domain.management.util.DomainTestUtils.executeForFailure;
import static org.jboss.as.test.integration.domain.management.util.DomainTestUtils.executeForResult;
import static org.jboss.as.test.integration.domain.management.util.DomainTestUtils.exists;
import static org.jboss.as.test.integration.domain.management.util.DomainTestUtils.getRunningServerAddress;
import org.junit.Assert;
import org.jboss.as.controller.ModelVersion;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.client.helpers.domain.DomainClient;
import org.jboss.as.test.integration.domain.extension.ExtensionSetup;
import org.jboss.as.test.integration.domain.extension.VersionedExtensionCommon;
import org.jboss.as.test.integration.domain.management.util.DomainLifecycleUtil;
import org.jboss.as.test.integration.domain.management.util.DomainTestSupport;
import org.jboss.dmr.ModelNode;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* @author Emanuel Muckenhuber
*/
public class OperationTransformationTestCase {
private static DomainTestSupport testSupport;
private static DomainLifecycleUtil master;
private static DomainLifecycleUtil slave;
@BeforeClass
public static void setupDomain() throws Exception {
testSupport = DomainTestSuite.createSupport(OperationTransformationTestCase.class.getSimpleName());
master = testSupport.getDomainMasterLifecycleUtil();
slave = testSupport.getDomainSlaveLifecycleUtil();
// Initialize the extension
ExtensionSetup.initializeTransformersExtension(testSupport);
}
@AfterClass
public static void tearDownDomain() throws Exception {
DomainTestSuite.stopSupport();
testSupport = null;
master = null;
slave = null;
}
@Test
public void test() throws Exception {
final PathAddress extension = PathAddress.pathAddress(PathElement.pathElement(EXTENSION, VersionedExtensionCommon.EXTENSION_NAME));
final PathAddress address = PathAddress.pathAddress(PathElement.pathElement(PROFILE, "default"),
PathElement.pathElement(SUBSYSTEM, VersionedExtensionCommon.SUBSYSTEM_NAME));
final PathAddress ignored = PathAddress.pathAddress(PathElement.pathElement(PROFILE, "ignored"),
PathElement.pathElement(SUBSYSTEM, VersionedExtensionCommon.SUBSYSTEM_NAME));
final ModelNode serverAddress = getRunningServerAddress("slave", "main-three");
serverAddress.add(SUBSYSTEM, VersionedExtensionCommon.SUBSYSTEM_NAME);
final DomainClient client = master.getDomainClient();
// Add extension
final ModelNode extensionAdd = createAdd(extension);
executeForResult(extensionAdd, client);
// Add subsystem
final ModelNode subsystemAdd = createAdd(address);
executeForResult(subsystemAdd, client);
// Check master version
final ModelNode mExt = create(READ_RESOURCE_OPERATION, extension.append(PathElement.pathElement(SUBSYSTEM, VersionedExtensionCommon.SUBSYSTEM_NAME)));
assertVersion(executeForResult(mExt, client), ModelVersion.create(2));
// Create subsystem in the ignored profile for further use
final ModelNode newIgnored = createAdd(ignored);
executeForResult(newIgnored, client);
Assert.assertTrue(exists(ignored, client));
// Check the new element
final PathAddress newElement = address.append(PathElement.pathElement("new-element", "new1"));
final ModelNode addNew = createAdd(newElement);
executeForResult(addNew, client);
Assert.assertTrue(exists(newElement, client));
// And remove it again
final ModelNode remove = addNew.clone();
remove.get(OP).set(REMOVE);
executeForResult(remove, client);
Assert.assertFalse(exists(newElement, client));
// The add operation on the slave should have been discarded
final ModelNode newElementOnSlave = serverAddress.clone();
newElementOnSlave.add("new-element", "new1");
Assert.assertFalse(exists(newElementOnSlave, client));
// Other new element
final PathElement otherNewElementPath = PathElement.pathElement("other-new-element", "new1");
// This needs to get rejected
final ModelNode addOtherNew = createAdd(address.append(otherNewElementPath));
final ModelNode otherFailure = executeForFailure(addOtherNew, client);
Assert.assertTrue(otherFailure.hasDefined(HOST_FAILURE_DESCRIPTIONS));
Assert.assertTrue(otherFailure.get(HOST_FAILURE_DESCRIPTIONS).hasDefined("slave"));
// Check that the host-failure contains WFLYCTL0304 rejected
Assert.assertTrue(otherFailure.get(HOST_FAILURE_DESCRIPTIONS, "slave").asString().contains("WFLYCTL0304"));
// This should work
final ModelNode addOtherNewIgnored = createAdd(ignored.append(otherNewElementPath));
executeForResult(addOtherNewIgnored, client);
// Same if wrapped in a composite
final ModelNode cpa = createCompositeOperation(
createAdd(address.append(PathElement.pathElement("new-element", "new2"))), // discard
createAdd(ignored.append(PathElement.pathElement("other-new-element", "new2"))), // ignored
createAdd(address.append(PathElement.pathElement("other-new-element", "new2")))); // fail
final ModelNode compositeFailure = executeForFailure(cpa, client);
Assert.assertTrue(compositeFailure.hasDefined(HOST_FAILURE_DESCRIPTIONS));
Assert.assertTrue(compositeFailure.get(HOST_FAILURE_DESCRIPTIONS).hasDefined("slave"));
// Check that the host-failure contains WFLYCTL0304 rejected
Assert.assertTrue(compositeFailure.get(HOST_FAILURE_DESCRIPTIONS, "slave").asString().contains("WFLYCTL0304"));
// Successful composite
executeForResult(createCompositeOperation(
createAdd(address.append(PathElement.pathElement("new-element", "new3"))), // discard
createAdd(ignored.append(PathElement.pathElement("other-new-element", "new3"))) // ignored
), client);
// Check the renamed element
final PathAddress renamedAddress = address.append(PathElement.pathElement("renamed", "element"));
final ModelNode renamedAdd = createAdd(renamedAddress);
executeForResult(renamedAdd, client);
Assert.assertTrue(exists(renamedAddress, client));
// renamed > element
final ModelNode renamedElementOnSlave = serverAddress.clone();
renamedElementOnSlave.add("renamed", "element");
Assert.assertFalse(exists(renamedElementOnSlave, client));
// element > renamed
final ModelNode elementRenamedOnSlave = serverAddress.clone();
elementRenamedOnSlave.add("element", "renamed");
Assert.assertTrue(exists(elementRenamedOnSlave, client));
// final ModelNode op = create(READ_RESOURCE_OPERATION, PathAddress.pathAddress(PathElement.pathElement("profile", "ignored")));
// System.out.println(executeForResult(op, slave.getDomainClient()));
final ModelNode update = new ModelNode();
update.get(OP).set("update");
update.get(OP_ADDR).set(address.toModelNode());
//
final ModelNode updateResult = client.execute(update);
Assert.assertEquals(updateResult.toString(), updateResult.get(OUTCOME).asString(), SUCCESS);
// "result" => {"test-attribute" => "test"},
Assert.assertEquals("test", updateResult.get(RESULT, "test-attribute").asString());
// server-result
//Assert.assertEquals("test", updateResult.get(SERVER_GROUPS, "main-server-group", HOST, "slave", "main-three", "response", RESULT, "test-attribute").asString());
//
final ModelNode write = new ModelNode();
write.get(OP).set(WRITE_ATTRIBUTE_OPERATION);
write.get(OP_ADDR).set(address.toModelNode());
write.get(NAME).set("test-attribute");
write.get(VALUE).set("test123");
//
final ModelNode composite = new ModelNode();
composite.get(OP).set(COMPOSITE);
composite.get(OP_ADDR).setEmptyList();
final ModelNode steps = composite.get(STEPS);
final ModelNode test = new ModelNode();
test.get(OP).set("test");
test.get(OP_ADDR).set(serverAddress);
steps.add(write);
steps.add(test);
final ModelNode compositeResult = client.execute(composite);
// server-result
Assert.assertEquals(false, compositeResult.get(SERVER_GROUPS, "main-server-group", HOST, "slave", "main-three", "response", RESULT, "step-2", RESULT).asBoolean());
// Test expression replacement
testPropertiesModel();
}
protected void testPropertiesModel() throws Exception {
final DomainClient client = master.getDomainClient();
final DomainClient slaveClient = slave.getDomainClient();
final PathAddress address = PathAddress.pathAddress(PathElement.pathElement(PROFILE, "default"));
// Test the properties model
final PathAddress properties = address.append(PathElement.pathElement(SUBSYSTEM, VersionedExtensionCommon.SUBSYSTEM_NAME));
final ModelNode writePropertiesInt = writeAttribute(properties, "int", "${org.jboss.domain.tests.int:1}");
executeForFailure(writePropertiesInt, client);
// Check both master and slave
Assert.assertFalse(executeForResult(readAttribute(properties, "int"), client).isDefined());
Assert.assertFalse(executeForResult(readAttribute(properties, "int"), slaveClient).isDefined());
final ModelNode writePropertiesString = writeAttribute(properties, "string", "${org.jboss.domain.tests.string:abc}");
executeForFailure(writePropertiesString, client);
// Check both master and slave
Assert.assertFalse(executeForResult(readAttribute(properties, "string"), client).isDefined());
Assert.assertFalse(executeForResult(readAttribute(properties, "string"), slaveClient).isDefined());
// Test the ignored model
final PathAddress ignored = PathAddress.pathAddress(PathElement.pathElement(PROFILE, "ignored"), PathElement.pathElement(SUBSYSTEM, VersionedExtensionCommon.SUBSYSTEM_NAME));
final ModelNode writeIgnoredString = writeAttribute(ignored, "string", "${org.jboss.domain.tests.string:abc}");
executeForResult(writeIgnoredString, client);
Assert.assertTrue(executeForResult(readAttribute(ignored, "string"), client).isDefined());
executeForFailure(readAttribute(ignored, "string"), slaveClient);
final ModelNode writeIgnoredInt = writeAttribute(ignored, "int", "${org.jboss.domain.tests.int:1}");
executeForResult(writeIgnoredInt, client);
Assert.assertTrue(executeForResult(readAttribute(ignored, "int"), client).isDefined());
executeForFailure(readAttribute(ignored, "int"), slaveClient);
}
static ModelNode createAdd(PathAddress address) {
return create(ADD, address);
}
static ModelNode create(String op, ModelNode address) {
return createOperation(op, address);
}
static ModelNode create(String op, PathAddress address) {
return createOperation(op, address);
}
static ModelNode writeAttribute(PathAddress address, String name, int value) {
final ModelNode operation = writeAttribute(address, name);
operation.get(VALUE).set(value);
return operation;
}
static ModelNode writeAttribute(PathAddress address, String name, String value) {
final ModelNode operation = writeAttribute(address, name);
operation.get(VALUE).set(value);
return operation;
}
static ModelNode readAttribute(PathAddress address, String name) {
final ModelNode operation = createOperation(READ_ATTRIBUTE_OPERATION, address);
operation.get(NAME).set(name);
return operation;
}
static ModelNode writeAttribute(PathAddress address, String name) {
final ModelNode operation = createOperation(WRITE_ATTRIBUTE_OPERATION, address);
operation.get(NAME).set(name);
return operation;
}
static void assertVersion(final ModelNode v, ModelVersion version) {
Assert.assertEquals(version.getMajor(), v.get(MANAGEMENT_MAJOR_VERSION).asInt());
Assert.assertEquals(version.getMinor(), v.get(MANAGEMENT_MINOR_VERSION).asInt());
Assert.assertEquals(version.getMicro(), v.get(MANAGEMENT_MICRO_VERSION).asInt());
}
}