/*
* 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.wildfly.core.test.standalone.mgmt;
import static org.hamcrest.CoreMatchers.is;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ANY_ADDRESS;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ATTRIBUTES;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.CHILD_TYPE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.COMPOSITE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIPTION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.FAILED;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.FAILURE_DESCRIPTION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.INCLUDE_RUNTIME;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.INTERFACE;
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.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.PORT;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_ATTRIBUTE_OPERATION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_CHILDREN_NAMES_OPERATION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_RESOURCE_DESCRIPTION_OPERATION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_RESOURCE_OPERATION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RECURSIVE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RECURSIVE_DEPTH;
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.ROLLBACK_ON_RUNTIME_FAILURE;
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.SYSTEM_PROPERTY;
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.controller.parsing.Element.LINK_LOCAL_ADDRESS;
import static org.jboss.as.controller.parsing.Element.LOOPBACK;
import static org.jboss.as.test.integration.domain.management.util.DomainTestSupport.validateFailedResponse;
import static org.jboss.as.test.integration.domain.management.util.DomainTestSupport.validateResponse;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributeView;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.inject.Inject;
import org.jboss.as.controller.CompositeOperationHandler;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.client.helpers.Operations;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.controller.operations.common.Util;
import org.jboss.as.test.deployment.trivial.ServiceActivatorDeploymentUtil;
import org.jboss.as.test.integration.management.util.MgmtOperationException;
import org.jboss.as.test.integration.management.util.ServerReload;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.wildfly.core.testrunner.ManagementClient;
import org.wildfly.core.testrunner.ServerSetup;
import org.wildfly.core.testrunner.WildflyTestRunner;
/**
* Basic management operation unit test.
*
* @author Emanuel Muckenhuber
*/
@ServerSetup(ServerReload.SetupTask.class)
@RunWith(WildflyTestRunner.class)
public class BasicOperationsUnitTestCase {
private static final DateTimeFormatter DATE_FORMAT = new DateTimeFormatterBuilder().appendInstant().appendZoneId().toFormatter(Locale.ENGLISH);
private static final ZoneId ZONE_ID = ZoneId.of(Calendar.getInstance().getTimeZone().getID());
@Inject
private static ManagementClient managementClient;
@Test
public void testSocketBindingsWildcards() throws IOException {
final ModelNode address = new ModelNode();
address.add("socket-binding-group", "*");
address.add("socket-binding", "*");
address.protect();
final ModelNode operation = new ModelNode();
operation.get(OP).set(READ_RESOURCE_OPERATION);
operation.get(OP_ADDR).set(address);
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertTrue(result.hasDefined(RESULT));
assertEquals(SUCCESS, result.get(OUTCOME).asString());
final Collection<ModelNode> steps = getSteps(result.get(RESULT));
assertFalse(steps.isEmpty());
for(final ModelNode step : steps) {
assertTrue(step.hasDefined(OP_ADDR));
assertTrue(step.hasDefined(RESULT));
assertEquals(SUCCESS, step.get(OUTCOME).asString());
}
}
@Test
public void testPathInfo() throws IOException {
ModelNode address = new ModelNode();
address.add(SUBSYSTEM, "logging");
address.add("periodic-rotating-file-handler", "FILE");
address.protect();
ModelNode operation = new ModelNode();
operation.get(OP).set("resolve-path");
operation.get(OP_ADDR).set(address);
ModelNode result = managementClient.getControllerClient().execute(operation);
assertTrue(result.toJSONString(true), Operations.isSuccessfulOutcome(result));
assertTrue(result.toJSONString(true), result.hasDefined(RESULT));
Path logFile = Paths.get(Operations.readResult(result).asString());
Assert.assertTrue("The log file was not created.", Files.exists(logFile));
operation = new ModelNode();
operation.get(OP).set("path-info");
operation.get(OP_ADDR).set(address);
result = managementClient.getControllerClient().execute(operation);
assertTrue(result.toJSONString(true), Operations.isSuccessfulOutcome(result));
assertTrue(result.hasDefined(RESULT));
long size = result.get(RESULT).get("file").get("path").get("used-space").asLong();
BasicFileAttributes attributes = Files.getFileAttributeView(logFile, BasicFileAttributeView.class).readAttributes();
Assert.assertEquals("The log file has not the correct size.", attributes.size(), size);
Assert.assertEquals("The log file has not the last modified time.", DATE_FORMAT.format(attributes.lastModifiedTime().toInstant().atZone(ZONE_ID)), result.get(RESULT).get("file").get("path").get("last-modified").asString());
Assert.assertEquals("The log file has not the creation time.", DATE_FORMAT.format(attributes.creationTime().toInstant().atZone(ZONE_ID)), result.get(RESULT).get("file").get("path").get("creation-time").asString());
address = new ModelNode();
address.add("path", "jboss.server.base.dir");
address.protect();
operation = new ModelNode();
operation.get(OP).set("path-info");
operation.get(OP_ADDR).set(address);
result = managementClient.getControllerClient().execute(operation);
assertTrue(result.toJSONString(true), Operations.isSuccessfulOutcome(result));
assertTrue(result.toJSONString(true), result.hasDefined(RESULT));
assertTrue(result.toJSONString(true), Operations.readResult(result).get("path").get("used-space").asDouble() > 0.0D);
assertTrue(result.toJSONString(true), Operations.readResult(result).get("path").get("last-modified").isDefined());
assertTrue(result.toJSONString(true), Operations.readResult(result).get("path").get("creation-time").isDefined());
assertTrue(result.toJSONString(true), Operations.readResult(result).get("path").get("resolved-path").isDefined());
address = new ModelNode();
address.add("core-service", "server-environment");
address.protect();
operation = new ModelNode();
operation.get(OP).set("path-info");
operation.get(OP_ADDR).set(address);
result = managementClient.getControllerClient().execute(operation);
assertTrue(result.toJSONString(true), Operations.isSuccessfulOutcome(result));
assertTrue(result.toJSONString(true), result.hasDefined(RESULT));
assertTrue(result.toJSONString(true), Operations.readResult(result).get("content-dir").get("used-space").asDouble() >= 0.0D);
assertTrue(result.toJSONString(true), Operations.readResult(result).get("content-dir").get("last-modified").isDefined());
assertTrue(result.toJSONString(true), Operations.readResult(result).get("content-dir").get("creation-time").isDefined());
assertTrue(result.toJSONString(true), Operations.readResult(result).get("content-dir").get("resolved-path").isDefined());
assertTrue(result.toJSONString(true), Operations.readResult(result).get("data-dir").get("used-space").asDouble() > 0.0D);
assertTrue(result.toJSONString(true), Operations.readResult(result).get("data-dir").get("last-modified").isDefined());
assertTrue(result.toJSONString(true), Operations.readResult(result).get("data-dir").get("creation-time").isDefined());
assertTrue(result.toJSONString(true), Operations.readResult(result).get("data-dir").get("resolved-path").isDefined());
assertTrue(result.toJSONString(true), Operations.readResult(result).get("temp-dir").get("used-space").asDouble() > 0.0D);
assertTrue(result.toJSONString(true), Operations.readResult(result).get("temp-dir").get("last-modified").isDefined());
assertTrue(result.toJSONString(true), Operations.readResult(result).get("temp-dir").get("creation-time").isDefined());
assertTrue(result.toJSONString(true), Operations.readResult(result).get("temp-dir").get("resolved-path").isDefined());
assertTrue(result.toJSONString(true), Operations.readResult(result).get("log-dir").get("used-space").asDouble() > 0.0D);
assertTrue(result.toJSONString(true), Operations.readResult(result).get("log-dir").get("last-modified").isDefined());
assertTrue(result.toJSONString(true), Operations.readResult(result).get("log-dir").get("creation-time").isDefined());
assertTrue(result.toJSONString(true), Operations.readResult(result).get("log-dir").get("resolved-path").isDefined());
}
@Test
public void testReadResourceRecursiveDepthRecursiveUndefined() throws IOException {
// WFCORE-76
final ModelNode operation = new ModelNode();
operation.get(OP).set(READ_RESOURCE_OPERATION);
operation.get(OP_ADDR).setEmptyList();
operation.get(RECURSIVE_DEPTH).set(1);
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertEquals(SUCCESS, result.get(OUTCOME).asString());
assertTrue(result.hasDefined(RESULT));
final ModelNode logging = result.get(RESULT, SUBSYSTEM, "logging");
assertTrue(logging.hasDefined("logger"));
final ModelNode rootLogger = result.get(RESULT, SUBSYSTEM, "logging", "root-logger");
assertFalse(rootLogger.hasDefined("ROOT"));
}
@Test
public void testReadResourceRecursiveDepthRecursiveTrue() throws IOException {
// WFCORE-76
final ModelNode operation = new ModelNode();
operation.get(OP).set(READ_RESOURCE_OPERATION);
operation.get(OP_ADDR).setEmptyList();
operation.get(RECURSIVE).set(true);
operation.get(RECURSIVE_DEPTH).set(1);
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertEquals(SUCCESS, result.get(OUTCOME).asString());
assertTrue(result.hasDefined(RESULT));
final ModelNode logging = result.get(RESULT, SUBSYSTEM, "logging");
assertTrue(logging.hasDefined("logger"));
final ModelNode rootLogger = result.get(RESULT, SUBSYSTEM, "logging", "root-logger");
assertFalse(rootLogger.hasDefined("ROOT"));
}
@Test
public void testReadResourceWithSubsystem() throws IOException {
// WFCORE-857
final ModelNode operation = new ModelNode();
operation.get(OP).set(READ_RESOURCE_OPERATION);
operation.get(OP_ADDR).set(PathAddress.parseCLIStyleAddress("/deployment=foo.war/subsystem=*").toModelNode());
operation.get(RECURSIVE).set(false);
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertEquals(FAILED, result.get(OUTCOME).asString());
}
@Test
public void testReadResourceRecursiveDepthGt1RecursiveTrue() throws IOException {
// WFCORE-76
final ModelNode operation = new ModelNode();
operation.get(OP).set(READ_RESOURCE_OPERATION);
operation.get(OP_ADDR).setEmptyList();
operation.get(RECURSIVE).set(true);
operation.get(RECURSIVE_DEPTH).set(2);
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertEquals(SUCCESS, result.get(OUTCOME).asString());
assertTrue(result.hasDefined(RESULT));
final ModelNode logging = result.get(RESULT, SUBSYSTEM, "logging");
assertTrue(logging.hasDefined("logger"));
final ModelNode rootLogger = result.get(RESULT, SUBSYSTEM, "logging", "root-logger");
assertTrue(rootLogger.hasDefined("ROOT"));
}
@Test
public void testReadResourceRecursiveDepthRecursiveFalse() throws IOException {
// WFCORE-76
final ModelNode operation = new ModelNode();
operation.get(OP).set(READ_RESOURCE_OPERATION);
operation.get(OP_ADDR).setEmptyList();
operation.get(RECURSIVE).set(false);
operation.get(RECURSIVE_DEPTH).set(1);
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertEquals(SUCCESS, result.get(OUTCOME).asString());
assertTrue(result.hasDefined(RESULT));
final ModelNode logging = result.get(RESULT, SUBSYSTEM, "logging");
assertFalse(logging.hasDefined("logger"));
}
@Test
public void testReadResourceNoRecursiveDepthRecursiveTrue() throws IOException {
// WFCORE-76
final ModelNode operation = new ModelNode();
operation.get(OP).set(READ_RESOURCE_OPERATION);
operation.get(OP_ADDR).setEmptyList();
operation.get(RECURSIVE).set(true);
operation.get(RECURSIVE_DEPTH).set(0);
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertEquals(SUCCESS, result.get(OUTCOME).asString());
assertTrue(result.hasDefined(RESULT));
final ModelNode logging = result.get(RESULT, SUBSYSTEM, "logging");
assertFalse(logging.hasDefined("logger"));
}
@Test
public void testReadAttributeWildcards() throws IOException {
final ModelNode address = new ModelNode();
address.add("socket-binding-group", "*");
address.add("socket-binding", "*");
address.protect();
final ModelNode operation = new ModelNode();
operation.get(OP).set(READ_ATTRIBUTE_OPERATION);
operation.get(OP_ADDR).set(address);
operation.get(NAME).set(PORT);
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertTrue(result.hasDefined(RESULT));
assertEquals(SUCCESS, result.get(OUTCOME).asString());
final Collection<ModelNode> steps = getSteps(result.get(RESULT));
assertFalse(steps.isEmpty());
for(final ModelNode step : steps) {
assertTrue(step.hasDefined(OP_ADDR));
assertTrue(step.hasDefined(RESULT));
final ModelNode stepResult = step.get(RESULT);
assertTrue(stepResult.getType() == ModelType.EXPRESSION || stepResult.asInt() >= 0);
}
}
@Test
public void testSocketBindingDescriptions() throws IOException {
final ModelNode address = new ModelNode();
address.add("socket-binding-group", "*");
address.add("socket-binding", "*");
address.protect();
final ModelNode operation = new ModelNode();
operation.get(OP).set(READ_RESOURCE_DESCRIPTION_OPERATION);
operation.get(OP_ADDR).set(address);
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertTrue(result.hasDefined(RESULT));
assertEquals(SUCCESS, result.get(OUTCOME).asString());
final Collection<ModelNode> steps = result.get(RESULT).asList();
assertFalse(steps.isEmpty());
assertEquals("should only contain a single type", 1, steps.size());
for(final ModelNode step : steps) {
assertTrue(step.hasDefined(OP_ADDR));
assertTrue(step.hasDefined(RESULT));
assertEquals(SUCCESS, step.get(OUTCOME).asString());
final ModelNode stepResult = step.get(RESULT);
assertTrue(stepResult.hasDefined(DESCRIPTION));
assertTrue(stepResult.hasDefined(ATTRIBUTES));
assertTrue(stepResult.get(ModelDescriptionConstants.ATTRIBUTES).hasDefined(ModelDescriptionConstants.NAME));
assertTrue(stepResult.get(ModelDescriptionConstants.ATTRIBUTES).hasDefined(ModelDescriptionConstants.INTERFACE));
assertTrue(stepResult.get(ModelDescriptionConstants.ATTRIBUTES).hasDefined(ModelDescriptionConstants.PORT));
}
}
@Test
public void testRecursiveReadIncludingRuntime() throws IOException {
final ModelNode operation = new ModelNode();
operation.get(OP).set(READ_RESOURCE_OPERATION);
operation.get(OP_ADDR).setEmptyList();
operation.get(RECURSIVE).set(true);
operation.get(INCLUDE_RUNTIME).set(true);
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertEquals(result.get(FAILURE_DESCRIPTION).isDefined() ? result.get(FAILURE_DESCRIPTION).asString() : "", SUCCESS, result.get(OUTCOME).asString());
assertTrue(result.hasDefined(RESULT));
assertTrue(result.get(RESULT).hasDefined(ModelDescriptionConstants.UUID));
}
@Test
public void testHttpSocketBinding() throws IOException {
final ModelNode address = new ModelNode();
address.add("socket-binding-group", "*");
address.add("socket-binding", "management-http");
address.protect();
final ModelNode operation = new ModelNode();
operation.get(OP).set(READ_RESOURCE_OPERATION);
operation.get(OP_ADDR).set(address);
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertTrue(result.hasDefined(RESULT));
assertEquals(SUCCESS, result.get(OUTCOME).asString());
final List<ModelNode> steps = getSteps(result.get(RESULT));
assertEquals(1, steps.size());
final ModelNode httpBinding = steps.get(0);
assertEquals(9990, httpBinding.get(RESULT, "port").resolve().asInt());
}
@Test
public void testSimpleReadAttribute() throws IOException {
final ModelNode address = new ModelNode();
address.add("subsystem", "logging");
address.add("console-handler", "CONSOLE");
final ModelNode operation = createReadAttributeOperation(address, "level");
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertSuccessful(result);
assertEquals("INFO", result.get(RESULT).asString());
}
@Test
public void testSimpleReadWithStringAddress() throws IOException {
final ModelNode address = new ModelNode("/subsystem=logging/console-handler=CONSOLE");
final ModelNode operation = createReadAttributeOperation(address, "level");
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertSuccessful(result);
assertEquals("INFO", result.get(RESULT).asString());
}
@Test
public void testMetricReadAttribute() throws IOException {
final ModelNode address = new ModelNode();
address.add("subsystem", "request-controller");
final ModelNode operation = createReadAttributeOperation(address, "active-requests");
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertSuccessful(result);
assertTrue(result.asInt() >= 0);
}
@Test
public void testReadAttributeChild() throws IOException {
final ModelNode address = new ModelNode();
address.add("subsystem", "deployment-scanner");
final ModelNode operation = createReadAttributeOperation(address, "scanner");
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertEquals(FAILED, result.get(OUTCOME).asString());
}
@Test
public void testInterfaceAdd() throws IOException {
final ModelNode base = new ModelNode();
final PathAddress addr = PathAddress.pathAddress(INTERFACE, "test");
base.get(OP).set(WRITE_ATTRIBUTE_OPERATION);
base.get(OP_ADDR).set(addr.toModelNode());
base.protect();
final ModelNode add = base.clone();
add.get(OP).set(ADD);
add.get(ANY_ADDRESS).set(true);
// Add interface
execute(add);
final ModelNode any = base.clone();
any.get(NAME).set(ANY_ADDRESS);
any.get(VALUE).set(false);
final ModelNode linkLocalAddress = base.clone();
linkLocalAddress.get(NAME).set(LINK_LOCAL_ADDRESS.getLocalName()) ;
linkLocalAddress.get(VALUE).set(false);
final ModelNode loopBack = base.clone();
loopBack.get(NAME).set(LOOPBACK.getLocalName());
loopBack.get(VALUE).set(true);
final ModelNode composite = new ModelNode();
composite.get(OP).set(COMPOSITE);
composite.get(OP_ADDR).setEmptyList();
composite.get(STEPS).add(any);
composite.get(STEPS).add(linkLocalAddress);
composite.get(STEPS).add(loopBack);
//Since any-address, link-local-address and loopback are all mutually exclusive, remove two of them from the composite
composite.get(STEPS).add(Util.getUndefineAttributeOperation(addr, ANY_ADDRESS));
composite.get(STEPS).add(Util.getUndefineAttributeOperation(addr, LINK_LOCAL_ADDRESS.getLocalName()));
execute(composite);
// Remove interface
final ModelNode remove = base.clone();
remove.get(OP).set(REMOVE);
execute(remove);
}
@Test
public void testBadAddress() throws IOException {
ModelNode operation = new ModelNode();
operation.get(OP).set("whoami");
operation.get(OP_ADDR).set("a");
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertEquals(FAILED, result.get(OUTCOME).asString());
assertTrue(result.hasDefined(FAILURE_DESCRIPTION));
assertTrue(result.get(FAILURE_DESCRIPTION).asString() + "should contain WFLYCTL0387", result.get(FAILURE_DESCRIPTION).asString().contains("WFLYCTL0387"));
}
@Test
public void testEmptyOperation() throws IOException {
ModelNode operation = new ModelNode();
operation.get(OP_ADDR).setEmptyList();
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertEquals(FAILED, result.get(OUTCOME).asString());
assertTrue(result.hasDefined(FAILURE_DESCRIPTION));
assertTrue(result.get(FAILURE_DESCRIPTION).asString() + "should contain WFLYCTL0383", result.get(FAILURE_DESCRIPTION).asString().contains("WFLYCTL0383"));
}
@Test
public void testRemoveAddSystemPropertyInBatch() throws Exception {
final String propertyName = "my.property";
ModelNode addPropertyOp = Operations.createAddOperation(PathAddress.EMPTY_ADDRESS.append(SYSTEM_PROPERTY, propertyName).toModelNode());
addPropertyOp.get(VALUE).set("test");
ModelNode removePropertyOp = Operations.createRemoveOperation(PathAddress.EMPTY_ADDRESS.append(SYSTEM_PROPERTY, propertyName).toModelNode());
try {
int origPropCount = countSystemProperties();
Map<String, String> properties = Collections.singletonMap(propertyName, "test");
validateSystemProperty(properties, propertyName, false, origPropCount);
ModelNode response = managementClient.getControllerClient().execute(addPropertyOp);
validateResponse(response, false);
validateSystemProperty(properties, propertyName, true, origPropCount);
ModelNode composite = new ModelNode();
composite.get(OP).set(CompositeOperationHandler.NAME);
composite.get(OP_ADDR).setEmptyList();
composite.get(OPERATION_HEADERS, ROLLBACK_ON_RUNTIME_FAILURE).set(false);
composite.get(STEPS).add(removePropertyOp);
composite.get(STEPS).add(addPropertyOp);
ModelNode result = managementClient.getControllerClient().execute(composite);
validateResponse(result);
validateSystemProperty(properties, propertyName, true, origPropCount);
} finally {
managementClient.getControllerClient().execute(removePropertyOp);
}
}
private static int countSystemProperties() throws IOException {
ModelNode readProperties = Operations.createOperation(READ_CHILDREN_NAMES_OPERATION, PathAddress.EMPTY_ADDRESS.toModelNode());
readProperties.get(CHILD_TYPE).set(SYSTEM_PROPERTY);
ModelNode response = managementClient.getControllerClient().execute(readProperties);
ModelNode properties = validateResponse(response);
return properties.asList().size();
}
private static void validateSystemProperty(Map<String, String> properties, String propertyName, boolean exist, int origPropCount) throws IOException, MgmtOperationException {
ModelNode readProperties = Operations.createOperation(READ_CHILDREN_NAMES_OPERATION, PathAddress.EMPTY_ADDRESS.toModelNode());
readProperties.get(CHILD_TYPE).set(SYSTEM_PROPERTY);
ModelNode response = managementClient.getControllerClient().execute(readProperties);
if (exist) {
ModelNode propertiesNode = validateResponse(response);
assertThat(propertiesNode.asList().size(), is(origPropCount + 1));
ModelNode property = validateResponse(managementClient.getControllerClient().execute(createReadResourceOperation(
PathAddress.EMPTY_ADDRESS.append(SYSTEM_PROPERTY, propertyName).toModelNode())));
assertThat(property.hasDefined(VALUE), is(true));
assertThat(property.get(VALUE).asString(), is(properties.get(propertyName)));
ServiceActivatorDeploymentUtil.validateProperties(managementClient.getControllerClient(), PathAddress.EMPTY_ADDRESS, properties);
} else {
ModelNode propertiesNode = validateResponse(response);
assertThat("We have found " + propertiesNode.asList(), propertiesNode.asList().size(), is(origPropCount));
ModelNode property = validateFailedResponse(managementClient.getControllerClient().execute(createReadResourceOperation(
PathAddress.EMPTY_ADDRESS.append(SYSTEM_PROPERTY, propertyName).toModelNode())));
assertThat(property.hasDefined(VALUE), is(false));
ServiceActivatorDeploymentUtil.validateNoProperties(managementClient.getControllerClient(), PathAddress.EMPTY_ADDRESS, properties.keySet());
}
}
protected ModelNode execute(final ModelNode operation) throws IOException {
final ModelNode result = managementClient.getControllerClient().execute(operation);
assertEquals(result.toString(), SUCCESS, result.get(OUTCOME).asString());
return result;
}
static void assertSuccessful(final ModelNode result) {
assertEquals(SUCCESS, result.get(OUTCOME).asString());
assertTrue(result.hasDefined(RESULT));
}
static ModelNode createReadAttributeOperation(final ModelNode address, final String attributeName) {
final ModelNode operation = new ModelNode();
operation.get(OP).set(READ_ATTRIBUTE_OPERATION);
operation.get(OP_ADDR).set(address);
operation.get(NAME).set(attributeName);
return operation;
}
static ModelNode createReadResourceOperation(ModelNode address) {
final ModelNode operation = new ModelNode();
operation.get(OP).set(READ_RESOURCE_OPERATION);
operation.get(OP_ADDR).set(address);
operation.get(RECURSIVE).set(true);
return operation;
}
protected static List<ModelNode> getSteps(final ModelNode result) {
assertTrue(result.isDefined());
return result.asList();
}
}