/*
* JBoss, Home of Professional Open Source.
* Copyright 2011, Red Hat Middleware LLC, 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.domain.controller.operations;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
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.PROFILE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REMOVE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SERVER_GROUP;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SOCKET_BINDING_GROUP;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VALUE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.WRITE_ATTRIBUTE_OPERATION;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.OperationStepHandler;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.registry.Resource;
import org.jboss.as.domain.controller.resources.ServerGroupResourceDefinition;
import org.jboss.dmr.ModelNode;
import org.junit.Assert;
import org.junit.Test;
/**
*
* @author <a href="kabir.khan@jboss.com">Kabir Khan</a>
*/
public class ServerGroupAffectedResourceServerGroupOperationsTestCase extends AbstractOperationTestCase {
@Test
public void testAddServerGroupMaster() throws Exception {
testAddServerGroup(true, false);
}
@Test
public void testAddServerGroupSlave() throws Exception {
testAddServerGroup(false, false);
}
@Test
public void testAddServerGroupMasterRollback() throws Exception {
testAddServerGroup(true, true);
}
@Test
public void testAddServerGroupSlaveRollback() throws Exception {
testAddServerGroup(false, true);
}
private void testAddServerGroup(boolean master, boolean rollback) throws Exception {
testAddServerGroupBadInfo(master, rollback, false, false);
}
// // WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testAddServerGroupBadProfile()
// @Test(expected=OperationFailedException.class)
// public void testAddServerGroupBadProfileMaster() throws Exception {
// testAddServerGroupBadInfo(true, false, true, false);
// }
//
// // WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testAddServerGroupBadProfile()
// @Test(expected=OperationFailedException.class)
// public void testAddServerGroupBadProfileSlave() throws Exception {
// testAddServerGroupBadInfo(false, false, true, false);
// }
//
// // WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testAddServerGroupBadProfile()
// @Test(expected=OperationFailedException.class)
// public void testAddServerGroupBadProfileMasterRollback() throws Exception {
// //This won't actually get to the rollback part
// testAddServerGroupBadInfo(true, true, true, false);
// }
//
// // WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testAddServerGroupBadProfile()
// @Test(expected=OperationFailedException.class)
// public void testAddServerGroupBadProfileSlaveRollback() throws Exception {
// testAddServerGroupBadInfo(false, true, true, false);
// }
// WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testAddServerGroupBadSocketBindingGroup()
// @Test(expected=OperationFailedException.class)
// public void testAddServerGroupBadSocketBindingGroupMaster() throws Exception {
// testAddServerGroupBadInfo(true, false, false, true);
// }
// WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testAddServerGroupBadSocketBindingGroup()
// @Test(expected=OperationFailedException.class)
// public void testAddServerGroupBadSocketBindingGroupSlave() throws Exception {
// testAddServerGroupBadInfo(false, false, false, true);
// }
// WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testAddServerGroupBadSocketBindingGroup()
// @Test(expected=OperationFailedException.class)
// public void testAddServerGroupBadSocketBindingGroupMasterRollback() throws Exception {
// //This won't actually get to the rollback part
// testAddServerGroupBadInfo(true, true, false, true);
// }
// WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testAddServerGroupBadSocketBindingGroup()
// @Test(expected=OperationFailedException.class)
// public void testAddServerGroupBadSocketBindingGroupSlaveRollback() throws Exception {
// testAddServerGroupBadInfo(false, true, false, true);
// }
private void testAddServerGroupBadInfo(boolean master, boolean rollback, boolean badProfile, boolean badSocketBindingGroup) throws Exception {
PathAddress pa = PathAddress.pathAddress(PathElement.pathElement(SERVER_GROUP, "group-three"));
final MockOperationContext operationContext = getOperationContext(rollback, pa);
String profileName = badProfile ? "bad-profile" : "profile-two";
String socketBindingGroupName = badSocketBindingGroup ? "bad-group" : "binding-two";
final ModelNode operation = new ModelNode();
operation.get(OP_ADDR).set(pa.toModelNode());
operation.get(OP).set(ADD);
operation.get(PROFILE).set(profileName);
operation.get(SOCKET_BINDING_GROUP).set(socketBindingGroupName);
try {
operationContext.executeStep(ServerGroupAddHandler.INSTANCE, operation);
} catch(RuntimeException e) {
// MockOperationContext impl throws RuntimeException in case one of the steps
// throws OperationFailedException
final Throwable t = e.getCause();
if(t instanceof OperationFailedException) {
throw (OperationFailedException) t;
}
throw e;
}
if (master && (badProfile || badSocketBindingGroup)) {
// Assert.fail();
}
if (rollback) {
Assert.assertFalse(operationContext.isReloadRequired());
}
}
@Test
public void testRemoveServerGroupMaster() throws Exception {
testRemoveServerGroup(true, false);
}
@Test
public void testRemoveServerGroupSlave() throws Exception {
testRemoveServerGroup(false, false);
}
@Test
public void testRemoveServerGroupMasterRollback() throws Exception {
testRemoveServerGroup(true, true);
}
@Test
public void testRemoveServerGroupSlaveRollback() throws Exception {
testRemoveServerGroup(false, true);
}
private void testRemoveServerGroup(boolean master, boolean rollback) throws Exception {
PathAddress pa = PathAddress.pathAddress(PathElement.pathElement(SERVER_GROUP, "group-one"));
final MockOperationContext operationContext = getOperationContext(rollback, pa);
final ModelNode operation = new ModelNode();
operation.get(OP_ADDR).set(pa.toModelNode());
operation.get(OP).set(REMOVE);
new ServerGroupRemoveHandler(null).execute(operationContext, operation);
Assert.assertFalse(operationContext.isReloadRequired());
}
@Test
public void testUpdateServerGroupProfileMaster() throws Exception {
testUpdateServerGroupProfile(true, false, false);
}
@Test
public void testUpdateServerGroupProfileSlave() throws Exception {
testUpdateServerGroupProfile(false, false, false);
}
@Test
public void testUpdateServerGroupProfileMasterRollback() throws Exception {
testUpdateServerGroupProfile(true, true, false);
}
@Test
public void testUpdateServerGroupProfileSlaveRollback() throws Exception {
testUpdateServerGroupProfile(false, true, false);
}
// // WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testChangeServerGroupInvalidProfile()
// @Test(expected=OperationFailedException.class)
// public void testUpdateServerGroupBadProfileMaster() throws Exception {
// testUpdateServerGroupProfile(true, false, true);
// }
//
// // WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testChangeServerGroupInvalidProfile()
// @Test(expected=OperationFailedException.class)
// public void testUpdateServerGroupBadProfileSlave() throws Exception {
// testUpdateServerGroupProfile(false, false, true);
// }
//
// // WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testChangeServerGroupInvalidProfile()
// @Test(expected=OperationFailedException.class)
// public void testUpdateServerGroupBadProfileMasterRollback() throws Exception {
// testUpdateServerGroupProfile(true, true, true);
// }
//
// // WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testChangeServerGroupInvalidProfile()
// @Test(expected=OperationFailedException.class)
// public void testUpdateServerGroupBadProfileSlaveRollback() throws Exception {
// testUpdateServerGroupProfile(false, true, true);
// }
private void testUpdateServerGroupProfile(boolean master, boolean rollback, boolean badProfile) throws Exception {
PathAddress pa = PathAddress.pathAddress(PathElement.pathElement(SERVER_GROUP, "group-one"));
final MockOperationContext operationContext = getOperationContext(rollback, pa);
String profileName = badProfile ? "bad-profile" : "profile-two";
final ModelNode operation = new ModelNode();
operation.get(OP_ADDR).set(pa.toModelNode());
operation.get(OP).set(WRITE_ATTRIBUTE_OPERATION);
operation.get(NAME).set(PROFILE);
operation.get(VALUE).set(profileName);
try {
operationContext.executeStep(ServerGroupResourceDefinition.createRestartRequiredHandler(), operation);
} catch (RuntimeException e) {
final Throwable t = e.getCause();
if (t instanceof OperationFailedException) {
throw (OperationFailedException) t;
}
throw e;
}
if (master && badProfile) {
//master will throw an exception
Assert.fail();
}
if (rollback) {
Assert.assertFalse(operationContext.isReloadRequired());
}
}
@Test
public void testUpdateServerGroupSocketBindingGroupMaster() throws Exception {
testUpdateServerGroupSocketBindingGroup(true, false, false);
}
@Test
public void testUpdateServerGroupSocketBindingGroupSlave() throws Exception {
testUpdateServerGroupSocketBindingGroup(false, false, false);
}
@Test
public void testUpdateServerGroupSocketBindingGroupMasterRollback() throws Exception {
testUpdateServerGroupSocketBindingGroup(true, true, false);
}
@Test
public void testUpdateServerGroupSocketBindingGroupSlaveRollback() throws Exception {
testUpdateServerGroupSocketBindingGroup(false, true, false);
}
// // WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testChangeServerGroupInvalidSocketBindingGroup()
// @Test(expected=OperationFailedException.class)
// public void testUpdateServerGroupBadSocketBindingGroupMaster() throws Exception {
// testUpdateServerGroupSocketBindingGroup(true, false, true);
// }
//
// // WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testChangeServerGroupInvalidSocketBindingGroup()
// @Test(expected=OperationFailedException.class)
// public void testUpdateServerGroupBadSocketBindingGroupSlave() throws Exception {
// testUpdateServerGroupSocketBindingGroup(false, false, true);
// }
//
// // WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testChangeServerGroupInvalidSocketBindingGroup()
// @Test(expected=OperationFailedException.class)
// public void testUpdateServerGroupBadSocketBindingGroupMasterRollback() throws Exception {
// testUpdateServerGroupSocketBindingGroup(true, true, true);
// }
//
// // WFCORE-833 replaced by core-model-test DomainServerGroupTestCase.testChangeServerGroupInvalidSocketBindingGroup()
// @Test(expected=OperationFailedException.class)
// public void testUpdateServerGroupBadSocketBindingGroupSlaveRollback() throws Exception {
// testUpdateServerGroupSocketBindingGroup(false, true, true);
// }
private void testUpdateServerGroupSocketBindingGroup(boolean master, boolean rollback, boolean badSocketBindingGroup) throws Exception {
PathAddress pa = PathAddress.pathAddress(PathElement.pathElement(SERVER_GROUP, "group-one"));
final MockOperationContext operationContext = getOperationContext(rollback, pa);
String socketBindingGroupName = badSocketBindingGroup ? "bad-group" : "binding-two";
final ModelNode operation = new ModelNode();
operation.get(OP_ADDR).set(pa.toModelNode());
operation.get(OP).set(WRITE_ATTRIBUTE_OPERATION);
operation.get(NAME).set(SOCKET_BINDING_GROUP);
operation.get(VALUE).set(socketBindingGroupName);
try {
operationContext.executeStep(ServerGroupResourceDefinition.createRestartRequiredHandler(), operation);
} catch (RuntimeException e) {
final Throwable t = e.getCause();
if (t instanceof OperationFailedException) {
throw (OperationFailedException) t;
}
throw e;
}
if (master && badSocketBindingGroup) {
//master will throw an exception
Assert.fail();
}
if (rollback) {
Assert.assertFalse(operationContext.isReloadRequired());
}
}
MockOperationContext getOperationContext(final boolean rollback, final PathAddress operationAddress) {
final Resource root = createRootResource();
return new MockOperationContext(root, false, operationAddress, rollback);
}
private class MockOperationContext extends AbstractOperationTestCase.MockOperationContext {
private boolean reloadRequired;
private boolean rollback;
private OperationStepHandler nextStep;
private ModelNode nextStepOp;
protected MockOperationContext(final Resource root, final boolean booting, final PathAddress operationAddress, final boolean rollback) {
super(root, booting, operationAddress);
this.rollback = rollback;
}
void executeStep(OperationStepHandler handler, ModelNode operation) throws OperationFailedException {
handler.execute(this, operation);
if (nextStep != null) {
completed();
}
}
@Override
public void completeStep(ResultHandler resultHandler) {
if (nextStep != null) {
completed();
} else if (rollback) {
resultHandler.handleResult(ResultAction.ROLLBACK, this, null);
}
}
@Override
public void stepCompleted() {
completed();
}
private void completed() {
if (nextStep != null) {
try {
OperationStepHandler step = nextStep;
nextStep = null;
step.execute(this, nextStepOp);
} catch (OperationFailedException e) {
throw new RuntimeException(e);
}
}
}
public void reloadRequired() {
reloadRequired = true;
}
public boolean isReloadRequired() {
return reloadRequired;
}
public void revertReloadRequired() {
reloadRequired = false;
}
public void addStep(OperationStepHandler step, OperationContext.Stage stage) throws IllegalArgumentException {
addStep(null, step, stage);
}
public void addStep(ModelNode operation, OperationStepHandler step, OperationContext.Stage stage) throws IllegalArgumentException {
nextStep = step;
nextStepOp = operation;
}
}
}