/* * Copyright 2016 JBoss by Red Hat. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.as.test.integration.domain; import static org.hamcrest.CoreMatchers.is; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ACCESS; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.AUDIT; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.AUDIT_LOG; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.CORE_SERVICE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.HOST; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.HTTP_INTERFACE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.IN_MEMORY_HANDLER; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.LOGGER; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.MANAGEMENT; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.MANAGEMENT_INTERFACE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.MAX_HISTORY; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SYSTEM_PROPERTY; import static org.junit.Assert.assertThat; import java.io.IOException; import java.util.List; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathElement; import org.jboss.as.controller.client.helpers.ClientConstants; import org.jboss.as.controller.client.helpers.domain.DomainClient; import org.jboss.as.controller.descriptions.ModelDescriptionConstants; import org.jboss.as.controller.operations.common.Util; import org.jboss.as.domain.management.LegacyConfigurationChangeResourceDefinition; 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.jboss.logging.Logger; import org.junit.AfterClass; import org.junit.BeforeClass; import org.wildfly.core.testrunner.UnsuccessfulOperationException; /** * * @author Emmanuel Hugonnet (c) 2016 Red Hat, inc. */ public abstract class AbstractConfigurationChangesTestCase { protected static DomainTestSupport testSupport; protected static DomainLifecycleUtil domainMasterLifecycleUtil; protected static DomainLifecycleUtil domainSlaveLifecycleUtil; private static final Logger logger = Logger.getLogger(AbstractConfigurationChangesTestCase.class); protected static final int MAX_HISTORY_SIZE = 100; protected static final PathElement HOST_MASTER = PathElement.pathElement(HOST, "master"); protected static final PathElement HOST_SLAVE = PathElement.pathElement(HOST, "slave"); protected static final PathAddress ALLOWED_ORIGINS_ADDRESS = PathAddress.pathAddress() .append(CORE_SERVICE, MANAGEMENT) .append(MANAGEMENT_INTERFACE, HTTP_INTERFACE); protected static final PathAddress AUDIT_LOG_ADDRESS = PathAddress.pathAddress() .append(CORE_SERVICE, MANAGEMENT) .append(ACCESS, AUDIT) .append(LOGGER, AUDIT_LOG); protected static final PathAddress SYSTEM_PROPERTY_ADDRESS = PathAddress.pathAddress() .append(SYSTEM_PROPERTY, "test"); protected static final PathAddress IN_MEMORY_HANDLER_ADDRESS = PathAddress.pathAddress() .append(CORE_SERVICE, MANAGEMENT) .append(ACCESS, AUDIT) .append(IN_MEMORY_HANDLER, "test"); @BeforeClass public static void setupDomain() throws Exception { DomainTestSupport.Configuration configuration = DomainTestSupport.Configuration.create( AbstractConfigurationChangesTestCase.class.getSimpleName(), "domain-configs/domain-config-changes.xml", "host-configs/host-master-config-changes.xml", "host-configs/host-slave-config-changes.xml", false, false, false, false, false); testSupport = DomainTestSupport.createAndStartSupport(configuration); domainMasterLifecycleUtil = testSupport.getDomainMasterLifecycleUtil(); domainSlaveLifecycleUtil = testSupport.getDomainSlaveLifecycleUtil(); } @AfterClass public static void tearDownDomain() throws Exception { testSupport.stop(); domainMasterLifecycleUtil = null; domainSlaveLifecycleUtil = null; testSupport = null; } protected abstract PathAddress getAddress(); public void createConfigurationChanges(PathElement host) throws Exception { DomainClient client = domainMasterLifecycleUtil.getDomainClient(); final ModelNode add = Util.createAddOperation(PathAddress.pathAddress().append(host).append(getAddress())); add.get(LegacyConfigurationChangeResourceDefinition.MAX_HISTORY.getName()).set(MAX_HISTORY_SIZE); executeForResult(client, add); PathAddress allowedOrigins = PathAddress.pathAddress().append(host).append(ALLOWED_ORIGINS_ADDRESS); ModelNode setAllowedOrigins = Util.createEmptyOperation("list-add", allowedOrigins); setAllowedOrigins.get(ModelDescriptionConstants.NAME).set(ModelDescriptionConstants.ALLOWED_ORIGINS); setAllowedOrigins.get(ModelDescriptionConstants.VALUE).set("http://www.wildfly.org"); client.execute(setAllowedOrigins); PathAddress auditLogAddress = PathAddress.pathAddress().append(host).append(AUDIT_LOG_ADDRESS); ModelNode disableLogBoot = Util.getWriteAttributeOperation(auditLogAddress, ModelDescriptionConstants.LOG_BOOT, false); client.execute(disableLogBoot); //read client.execute(Util.getReadAttributeOperation(allowedOrigins, ModelDescriptionConstants.ALLOWED_ORIGINS)); //invalid operation client.execute(Util.getUndefineAttributeOperation(allowedOrigins, "not-exists-attribute")); //invalid operation client.execute(Util.getWriteAttributeOperation(allowedOrigins, "not-exists-attribute", "123456")); //write operation, failed ModelNode setAllowedOriginsFails = Util.getWriteAttributeOperation(allowedOrigins, ModelDescriptionConstants.ALLOWED_ORIGINS, "123456"); //wrong type, expected is LIST, op list-add client.execute(setAllowedOriginsFails); PathAddress systemPropertyAddress = PathAddress.pathAddress().append(host).append(SYSTEM_PROPERTY_ADDRESS); ModelNode setSystemProperty = Util.createAddOperation(systemPropertyAddress); setSystemProperty.get(ModelDescriptionConstants.VALUE).set("changeConfig"); client.execute(setSystemProperty); ModelNode unsetAllowedOrigins = Util.getUndefineAttributeOperation(allowedOrigins, ModelDescriptionConstants.ALLOWED_ORIGINS); client.execute(unsetAllowedOrigins); ModelNode enableLogBoot = Util.getWriteAttributeOperation(auditLogAddress, ModelDescriptionConstants.LOG_BOOT, true); client.execute(enableLogBoot); ModelNode unsetSystemProperty = Util.createRemoveOperation(systemPropertyAddress); client.execute(unsetSystemProperty); PathAddress inMemoryAddress = PathAddress.pathAddress().append(host).append(IN_MEMORY_HANDLER_ADDRESS); ModelNode addInMemoryHandler = Util.createAddOperation(inMemoryAddress); client.execute(addInMemoryHandler); ModelNode editInMemoryHandler = Util.getWriteAttributeOperation(inMemoryAddress, ModelDescriptionConstants.MAX_HISTORY, 50); client.execute(editInMemoryHandler); ModelNode removeInMemoryHandler = Util.createRemoveOperation(inMemoryAddress); client.execute(removeInMemoryHandler); } protected PathAddress removePrefix(ModelNode operation) { return PathAddress.pathAddress(operation.get(ModelDescriptionConstants.OP_ADDR)).subAddress(1); } public List<ModelNode> readConfigurationChanges(DomainClient client, PathElement prefix) throws IOException { PathAddress address = getAddress(); if (prefix != null) { address = PathAddress.pathAddress().append(prefix).append(getAddress()); } ModelNode readConfigChanges = Util.createOperation(LegacyConfigurationChangeResourceDefinition.OPERATION_NAME, address); ModelNode response = client.execute(readConfigChanges); assertThat(response.asString(), response.get(ClientConstants.OUTCOME).asString(), is(ClientConstants.SUCCESS)); logger.info("For " + prefix + " we have " + response.get(ClientConstants.RESULT)); return response.get(ClientConstants.RESULT).asList(); } protected void setConfigurationChangeMaxHistory(DomainClient client, PathElement prefix, int size) throws IOException, UnsuccessfulOperationException { PathAddress address = PathAddress.pathAddress().append(prefix).append(getAddress()); ModelNode writeMaxHistorySize = Util.getWriteAttributeOperation(address, "max-history", size); executeForResult(client, writeMaxHistorySize); checkMaxHistorySize(client, size, prefix); } protected void checkMaxHistorySize(DomainClient client, int expectedSize, PathElement ... prefix) throws UnsuccessfulOperationException { PathAddress address = PathAddress.pathAddress().append(prefix).append(getAddress()); ModelNode readMaxHistorySize = Util.getReadAttributeOperation(address, MAX_HISTORY); ModelNode result = executeForResult(client, readMaxHistorySize); assertThat(result.asInt(), is(expectedSize)); } protected void clearConfigurationChanges(PathElement host) throws UnsuccessfulOperationException { DomainClient client = domainMasterLifecycleUtil.getDomainClient(); final ModelNode remove = Util.createRemoveOperation(PathAddress.pathAddress().append(host).append(getAddress())); executeForResult(client, remove); } protected ModelNode executeForResult(final DomainClient client, final ModelNode operation) throws UnsuccessfulOperationException { try { final ModelNode result = client.execute(operation); checkSuccessful(result, operation); return result.get(ClientConstants.RESULT); } catch (IOException e) { throw new RuntimeException(e); } } protected void checkSuccessful(final ModelNode result, final ModelNode operation) throws UnsuccessfulOperationException { if (!ClientConstants.SUCCESS.equals(result.get(ClientConstants.OUTCOME).asString())) { logger.error("Operation " + operation + " did not succeed. Result was " + result); throw new UnsuccessfulOperationException(result.get(ClientConstants.FAILURE_DESCRIPTION).toString()); } } }