/*
* 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.core.model.test.deployment;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.BYTES;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.CONTENT;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DEPLOYMENT;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ENABLED;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NAME;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.PERSISTENT;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.PROFILE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RUNTIME_NAME;
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.SUBDEPLOYMENT;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VALUE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.WRITE_ATTRIBUTE_OPERATION;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.operations.common.Util;
import org.jboss.as.controller.registry.Resource;
import org.jboss.as.core.model.test.AbstractCoreModelTest;
import org.jboss.as.core.model.test.KernelServices;
import org.jboss.as.core.model.test.KernelServicesBuilder;
import org.jboss.as.core.model.test.ModelInitializer;
import org.jboss.as.core.model.test.ModelWriteSanitizer;
import org.jboss.as.core.model.test.TestModelType;
import org.jboss.as.domain.controller.operations.deployment.DeploymentAddHandler;
import org.jboss.as.domain.controller.operations.deployment.DeploymentRemoveHandler;
import org.jboss.as.model.test.ModelTestUtils;
import org.jboss.as.server.deployment.DeploymentDeployHandler;
import org.jboss.as.server.deployment.DeploymentRedeployHandler;
import org.jboss.as.server.deployment.DeploymentUndeployHandler;
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 ServerGroupDeploymentTestCase extends AbstractCoreModelTest {
@Test
public void testCantHaveTwoSameDeploymentsWithSameName() throws Exception {
KernelServices kernelServices = createKernelServices();
ModelNode op = createAddOperation(kernelServices, "Test1");
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op));
checkSingleDeployment(kernelServices, "Test1", false);
op = createAddOperation(kernelServices, "Test1");
kernelServices.executeForFailure(op);
}
@Test
public void testCanHaveTwoDeploymentsWithDifferentNames() throws Exception {
KernelServices kernelServices = createKernelServices();
ModelNode op = createAddOperation(kernelServices, "Test1");
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op));
op = createAddOperation(kernelServices, "Test2");
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op));
ModelNode deployments = getDeploymentParentResource(kernelServices);
Assert.assertEquals(2, deployments.keys().size());
Assert.assertEquals(false, deployments.get("Test1", ENABLED).asBoolean());
Assert.assertEquals("Test1", deployments.get("Test1", NAME).asString());
Assert.assertEquals("Test1", deployments.get("Test1", RUNTIME_NAME).asString());
Assert.assertFalse(deployments.get("Test1", PERSISTENT).isDefined());
Assert.assertFalse(deployments.get("Test1", SUBDEPLOYMENT).isDefined());
Assert.assertEquals(false, deployments.get("Test2", ENABLED).asBoolean());
Assert.assertEquals("Test2", deployments.get("Test2", NAME).asString());
Assert.assertEquals("Test2", deployments.get("Test2", RUNTIME_NAME).asString());
Assert.assertFalse(deployments.get("Test1", PERSISTENT).isDefined());
Assert.assertFalse(deployments.get("Test2", SUBDEPLOYMENT).isDefined());
}
@Test
public void testDeploymentWithDifferentEnabledRuntimeNameAndPersistentSettings() throws Exception {
KernelServices kernelServices = createKernelServices();
ModelNode op = createAddOperation(kernelServices, "Test1", "ONE", false);
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op));
op = createAddOperation(kernelServices, "Test2", "TWO", true);
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op));
ModelNode deployments = getDeploymentParentResource(kernelServices);
Assert.assertEquals(2, deployments.keys().size());
Assert.assertEquals(false, deployments.get("Test1", ENABLED).asBoolean());
Assert.assertEquals("Test1", deployments.get("Test1", NAME).asString());
Assert.assertEquals("ONE", deployments.get("Test1", RUNTIME_NAME).asString());
Assert.assertFalse(deployments.get("Test1", PERSISTENT).isDefined());
Assert.assertFalse(deployments.get("Test1", SUBDEPLOYMENT).isDefined());
Assert.assertEquals(true, deployments.get("Test2", ENABLED).asBoolean());
Assert.assertEquals("Test2", deployments.get("Test2", NAME).asString());
Assert.assertEquals("TWO", deployments.get("Test2", RUNTIME_NAME).asString());
Assert.assertFalse(deployments.get("Test1", PERSISTENT).isDefined());
Assert.assertFalse(deployments.get("Test2", SUBDEPLOYMENT).isDefined());
}
@Test
public void testAddRemoveManagedDeployments() throws Exception {
KernelServices kernelServices = createKernelServices();
ModelNode op = createAddOperation(kernelServices, "Test1");
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op, new ByteArrayInputStream(new byte[] {1, 2, 3, 4, 5})));
checkSingleDeployment(kernelServices, "Test1", false);
removeDeployment(kernelServices, "Test1");
checkNoDeployments(kernelServices);
op = createAddOperation(kernelServices, "Test1");
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op));
checkSingleDeployment(kernelServices, "Test1", false);
removeDeployment(kernelServices, "Test1");
checkNoDeployments(kernelServices);
}
@Test
public void testDeployManagedDeployment() throws Exception {
KernelServices kernelServices = createKernelServices();
ModelNode op = createAddOperation(kernelServices, "Test1");
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op));
checkSingleDeployment(kernelServices, "Test1", false);
op = Util.createOperation(DeploymentDeployHandler.OPERATION_NAME, getPathAddress("Test1"));
kernelServices.validateOperation(op);
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op));
op = Util.createOperation(DeploymentUndeployHandler.OPERATION_NAME, getPathAddress("Test1"));
kernelServices.validateOperation(op);
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op));
op = Util.createOperation(DeploymentDeployHandler.OPERATION_NAME, getPathAddress("Test1"));
kernelServices.validateOperation(op);
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op));
op = Util.createOperation(DeploymentRemoveHandler.OPERATION_NAME, getPathAddress("Test1"));
kernelServices.validateOperation(op);
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op));
checkNoDeployments(kernelServices);
}
@Test
public void testRedeploy() throws Exception {
KernelServices kernelServices = createKernelServices();
ModelNode op = createAddOperation(kernelServices, "Test1");
op.get(ENABLED).set(true);
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op, new ByteArrayInputStream(new byte[] {1, 2, 3, 4, 5})));
checkSingleDeployment(kernelServices, "Test1", true);
op = Util.createOperation(DeploymentRedeployHandler.OPERATION_NAME, getPathAddress("Test1"));
kernelServices.validateOperation(op);
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op));
checkSingleDeployment(kernelServices, "Test1", true);
op = Util.createOperation(DeploymentRemoveHandler.OPERATION_NAME, getPathAddress("Test1"));
kernelServices.validateOperation(op);
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op));
checkNoDeployments(kernelServices);
}
@Test
public void testCantWriteToAttributes() throws Exception {
KernelServices kernelServices = createKernelServices();
ModelNode op = createAddOperation(kernelServices, "Test1");
ModelTestUtils.checkOutcome(kernelServices.executeOperation(op, new ByteArrayInputStream(new byte[] {1, 2, 3, 4, 5})));
checkSingleDeployment(kernelServices, "Test1", false);
op = createWriteAttributeOperation(kernelServices, "Test1", NAME, new ModelNode("Whatever"));
kernelServices.executeForFailure(op);
op = createWriteAttributeOperation(kernelServices, "Test1", RUNTIME_NAME, new ModelNode("Whatever"));
kernelServices.executeForFailure(op);
op = createWriteAttributeOperation(kernelServices, "Test1", ENABLED, new ModelNode(true));
kernelServices.executeForFailure(op);
}
private ModelNode createAddOperation(KernelServices kernelServices, String name) throws Exception {
return createAddOperation(kernelServices, name, null, null);
}
private ModelNode createAddOperation(KernelServices kernelServices, String name, String runtimeName, Boolean enabled) throws Exception {
ModelNode operation = Util.createOperation(DeploymentAddHandler.OPERATION_NAME, getPathAddress(name));
if (runtimeName != null) {
operation.get(RUNTIME_NAME).set(runtimeName);
}
if (enabled != null) {
operation.get(ENABLED).set(enabled);
}
operation.get(CONTENT);
kernelServices.validateOperation(operation);
return operation;
}
private ModelNode createWriteAttributeOperation(KernelServices kernelServices, String name, String attrName, ModelNode attrValue) {
ModelNode operation = Util.createOperation(WRITE_ATTRIBUTE_OPERATION, getPathAddress(name));
operation.get(NAME).set(attrName);
operation.get(VALUE).set(attrValue);
kernelServices.validateOperation(operation);
return operation;
}
private void checkSingleDeployment(KernelServices kernelServices, String name, boolean deployed) throws Exception {
ModelNode deployments = getDeploymentParentResource(kernelServices);
Assert.assertEquals(1, deployments.keys().size());
Assert.assertEquals(deployed, deployments.get(name, ENABLED).asBoolean());
Assert.assertEquals(name, deployments.get(name, NAME).asString());
Assert.assertFalse(deployments.get(name, PERSISTENT).isDefined());
Assert.assertEquals(name, deployments.get(name, RUNTIME_NAME).asString());
Assert.assertFalse(deployments.get(name, SUBDEPLOYMENT).isDefined());
Assert.assertFalse(deployments.get(name, CONTENT).isDefined());
}
private ModelNode getByteContent(int...bytes) {
ModelNode model = new ModelNode();
model.get(BYTES).set(convertToByteArray(bytes));
return model;
}
private byte[] convertToByteArray(int...bytes) {
byte[] bytez = new byte[bytes.length];
for (int i =0 ; i < bytes.length ; i++) {
bytez[i] = (byte)bytes[i];
}
return bytez;
}
private KernelServices createKernelServices() throws Exception {
ModelNode addDeployment1 = Util.createOperation(DeploymentAddHandler.OPERATION_NAME, PathAddress.pathAddress(PathElement.pathElement(DEPLOYMENT, "Test1")));
addDeployment1.get(CONTENT).add(getByteContent(1, 2, 3, 4, 5));
ModelNode addDeployment2 = Util.createOperation(DeploymentAddHandler.OPERATION_NAME, PathAddress.pathAddress(PathElement.pathElement(DEPLOYMENT, "Test2")));
addDeployment2.get(CONTENT).add(getByteContent(1, 2, 3, 4, 5));
List<ModelNode> deployments = new ArrayList<ModelNode>();
deployments.add(addDeployment1);
deployments.add(addDeployment2);
KernelServices kernelServices = createKernelServicesBuilder()
.setBootOperations(deployments)
.setModelInitializer(new ModelInitializer() {
@Override
public void populateModel(Resource rootResource) {
Resource serverGroupRes = Resource.Factory.create();
ModelNode model = serverGroupRes.getModel();
model.get(PROFILE).set("Test");
model.get(SOCKET_BINDING_GROUP).set("Test");
rootResource.registerChild(PathElement.pathElement(SERVER_GROUP, "Test"), serverGroupRes);
}
}, new ModelWriteSanitizer() {
@Override
public ModelNode sanitize(ModelNode model) {
ModelNode node = model.clone();
node.remove(SERVER_GROUP);
return node;
}
})
.build();
Assert.assertTrue(kernelServices.isSuccessfulBoot());
return kernelServices;
}
private void removeDeployment(KernelServices kernelServices, String name) {
ModelNode remove = Util.createOperation(DeploymentRemoveHandler.OPERATION_NAME, getPathAddress(name));
ModelTestUtils.checkOutcome(kernelServices.executeOperation(remove));
}
private void checkNoDeployments(KernelServices kernelServices) throws Exception {
Assert.assertFalse(getDeploymentParentResource(kernelServices).isDefined());
}
protected KernelServicesBuilder createKernelServicesBuilder() {
return createKernelServicesBuilder(TestModelType.DOMAIN);
}
protected PathAddress getPathAddress(String name) {
return PathAddress.pathAddress(PathElement.pathElement(SERVER_GROUP, "Test"), PathElement.pathElement(DEPLOYMENT, name));
}
protected ModelNode getDeploymentParentResource(KernelServices kernelServices) throws Exception {
return kernelServices.readWholeModel().get(SERVER_GROUP, "Test", DEPLOYMENT);
}
}