/*
* 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.management.cli;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.HOST;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.INCLUDE_RUNTIME;
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.READ_RESOURCE_OPERATION;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SERVER;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SOCKET_BINDING;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SOCKET_BINDING_GROUP;
import static org.jboss.as.test.integration.domain.management.util.DomainTestSupport.validateResponse;
import static org.junit.Assert.assertEquals;
import java.io.File;
import java.net.InetAddress;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import org.jboss.as.cli.CommandContext;
import org.jboss.as.controller.client.helpers.domain.DomainClient;
import org.jboss.as.network.NetworkUtils;
import org.jboss.as.test.integration.common.HttpRequest;
import org.jboss.as.test.integration.domain.management.util.DomainTestSupport;
import org.jboss.as.test.integration.domain.suites.CLITestSuite;
import org.jboss.as.test.integration.management.util.CLITestUtil;
import org.jboss.as.test.integration.management.util.SimpleServlet;
import org.jboss.dmr.ModelNode;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.shrinkwrap.impl.base.exporter.zip.ZipExporterImpl;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* @author Alexey Loubyansky
*/
public class DomainDeploymentOverlayTestCase {
private static final String SOCKET_BINDING_GROUP_NAME = "standard-sockets";
private static File war1;
private static File war2;
private static File war3;
private static File webXml;
private static File overrideXml;
private static DomainTestSupport testSupport;
private CommandContext ctx;
private DomainClient client;
@BeforeClass
public static void before() throws Exception {
String tempDir = System.getProperty("java.io.tmpdir");
WebArchive war;
// deployment1
war = ShrinkWrap.create(WebArchive.class, "deployment0.war");
war.addClass(SimpleServlet.class);
war.addAsWebInfResource("cli/deployment-overlay/web.xml", "web.xml");
war1 = new File(tempDir + File.separator + war.getName());
new ZipExporterImpl(war).exportTo(war1, true);
war = ShrinkWrap.create(WebArchive.class, "deployment1.war");
war.addClass(SimpleServlet.class);
war.addAsWebInfResource("cli/deployment-overlay/web.xml", "web.xml");
war2 = new File(tempDir + File.separator + war.getName());
new ZipExporterImpl(war).exportTo(war2, true);
war = ShrinkWrap.create(WebArchive.class, "another.war");
war.addClass(SimpleServlet.class);
war.addAsWebInfResource("cli/deployment-overlay/web.xml", "web.xml");
war3 = new File(tempDir + File.separator + war.getName());
new ZipExporterImpl(war).exportTo(war3, true);
final URL overrideXmlUrl = DomainDeploymentOverlayTestCase.class.getClassLoader().getResource("cli/deployment-overlay/override.xml");
if(overrideXmlUrl == null) {
Assert.fail("Failed to locate cli/deployment-overlay/override.xml");
}
overrideXml = new File(overrideXmlUrl.toURI());
if(!overrideXml.exists()) {
Assert.fail("Failed to locate cli/deployment-overlay/override.xml");
}
final URL webXmlUrl = DomainDeploymentOverlayTestCase.class.getClassLoader().getResource("cli/deployment-overlay/web.xml");
if(webXmlUrl == null) {
Assert.fail("Failed to locate cli/deployment-overlay/web.xml");
}
webXml = new File(webXmlUrl.toURI());
if(!webXml.exists()) {
Assert.fail("Failed to locate cli/deployment-overlay/web.xml");
}
// Launch the domain
testSupport = CLITestSuite.createSupport(DomainDeploymentOverlayTestCase.class.getSimpleName());
}
@AfterClass
public static void after() throws Exception {
try {
CLITestSuite.stopSupport();
testSupport = null;
} finally {
war1.delete();
war2.delete();
war3.delete();
}
}
@Before
public void setUp() throws Exception {
client = testSupport.getDomainMasterLifecycleUtil().createDomainClient();
ctx = CLITestUtil.getCommandContext(testSupport);
ctx.connectController();
}
@After
public void tearDown() throws Exception {
if(ctx != null) {
ctx.handleSafe("undeploy --all-relevant-server-groups " + war1.getName());
ctx.handleSafe("undeploy --all-relevant-server-groups " + war2.getName());
ctx.handleSafe("undeploy --all-relevant-server-groups " + war3.getName());
ctx.handleSafe("deployment-overlay remove --name=overlay-test");
ctx.terminateSession();
ctx = null;
}
client.close();
client = null;
}
@Test
public void testSimpleOverride() throws Exception {
ctx.handle("deploy --server-groups=main-server-group,other-server-group " + war1.getAbsolutePath());
ctx.handle("deploy --server-groups=main-server-group,other-server-group " + war2.getAbsolutePath());
ctx.handle("deployment-overlay add --name=overlay-test --content=WEB-INF/web.xml=" + overrideXml.getAbsolutePath()
+ " --deployments=" + war1.getName() + " --server-groups=main-server-group,other-server-group");
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
// assertEquals("NON OVERRIDDEN", performHttpCall("master", "other-one", "deployment0"));
// assertEquals("NON OVERRIDDEN", performHttpCall("master", "other-one", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
// assertEquals("NON OVERRIDDEN", performHttpCall("slave", "other-two", "deployment0"));
// assertEquals("NON OVERRIDDEN", performHttpCall("slave", "other-two", "deployment1"));
ctx.handle("deployment-overlay redeploy-affected --name=overlay-test");
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
// assertEquals("OVERRIDDEN", performHttpCall("master", "other-one", "deployment0"));
// assertEquals("NON OVERRIDDEN", performHttpCall("master", "other-one", "deployment1"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
// assertEquals("OVERRIDDEN", performHttpCall("slave", "other-two", "deployment0"));
// assertEquals("NON OVERRIDDEN", performHttpCall("slave", "other-two", "deployment1"));
}
@Test
public void testSimpleOverrideWithRedeployAffected() throws Exception {
ctx.handle("deploy --server-groups=main-server-group " + war1.getAbsolutePath());
ctx.handle("deploy --server-groups=main-server-group " + war2.getAbsolutePath());
ctx.handle("deployment-overlay add --name=overlay-test --content=WEB-INF/web.xml=" + overrideXml.getAbsolutePath()
+ " --deployments=" + war1.getName() + " --server-groups=main-server-group --redeploy-affected");
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
}
@Test
public void testWildcardOverride() throws Exception {
ctx.handle("deployment-overlay add --name=overlay-test --content=WEB-INF/web.xml=" + overrideXml.getAbsolutePath()
+ " --deployments=deployment*.war --server-groups=main-server-group --redeploy-affected");
ctx.handle("deploy --server-groups=main-server-group " + war1.getAbsolutePath());
ctx.handle("deploy --server-groups=main-server-group " + war2.getAbsolutePath());
ctx.handle("deploy --server-groups=main-server-group " + war3.getAbsolutePath());
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "another"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "another"));
}
@Test
public void testWildcardOverrideWithRedeployAffected() throws Exception {
ctx.handle("deploy --server-groups=main-server-group " + war1.getAbsolutePath());
ctx.handle("deploy --server-groups=main-server-group " + war2.getAbsolutePath());
ctx.handle("deploy --server-groups=main-server-group " + war3.getAbsolutePath());
ctx.handle("deployment-overlay add --name=overlay-test --content=WEB-INF/web.xml=" + overrideXml.getAbsolutePath()
+ " --deployments=deployment*.war --server-groups=main-server-group --redeploy-affected");
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "another"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "another"));
}
@Test
public void testMultipleLinks() throws Exception {
ctx.handle("deployment-overlay add --name=overlay-test --content=WEB-INF/web.xml=" + overrideXml.getAbsolutePath()
+ " --deployments=" + war1.getName() + " --server-groups=main-server-group");
ctx.handle("deploy --server-groups=main-server-group " + war1.getAbsolutePath());
ctx.handle("deploy --server-groups=main-server-group " + war2.getAbsolutePath());
ctx.handle("deploy --server-groups=main-server-group " + war3.getAbsolutePath());
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "another"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "another"));
ctx.handle("deployment-overlay link --name=overlay-test --deployments=a*.war --server-groups=main-server-group");
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "another"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "another"));
ctx.handle("/server-group=main-server-group/deployment=" + war1.getName() + ":redeploy");
ctx.handle("/server-group=main-server-group/deployment=" + war2.getName() + ":redeploy");
ctx.handle("/server-group=main-server-group/deployment=" + war3.getName() + ":redeploy");
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "another"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "another"));
ctx.handle("deployment-overlay link --name=overlay-test --deployments=" + war2.getName() + " --redeploy-affected --server-groups=main-server-group");
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "another"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "another"));
ctx.handle("deployment-overlay remove --name=overlay-test --deployments=" + war2.getName() + " --redeploy-affected --server-groups=main-server-group");
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "another"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "another"));
ctx.handle("deployment-overlay remove --name=overlay-test --deployments=a*.war --server-groups=main-server-group");
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "another"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "another"));
ctx.handle("/server-group=main-server-group/deployment=" + war1.getName() + ":redeploy");
ctx.handle("/server-group=main-server-group/deployment=" + war2.getName() + ":redeploy");
ctx.handle("/server-group=main-server-group/deployment=" + war3.getName() + ":redeploy");
ctx.handle("deployment-overlay remove --name=overlay-test --content=WEB-INF/web.xml --redeploy-affected");
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "another"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "another"));
ctx.handle("deployment-overlay upload --name=overlay-test --content=WEB-INF/web.xml=" + overrideXml.getAbsolutePath() + " --redeploy-affected");
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "another"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "another"));
}
@Test
public void testRedeployAffected() throws Exception {
ctx.handle("deploy --server-groups=main-server-group " + war1.getAbsolutePath());
ctx.handle("deploy --server-groups=main-server-group " + war2.getAbsolutePath());
ctx.handle("deploy --server-groups=main-server-group " + war3.getAbsolutePath());
ctx.handle("deployment-overlay add --name=overlay-test --content=WEB-INF/web.xml=" + overrideXml.getAbsolutePath());
ctx.handle("deployment-overlay link --name=overlay-test --deployments=deployment0.war,a*.war --server-groups=main-server-group");
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "another"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "another"));
ctx.handle("deployment-overlay redeploy-affected --name=overlay-test");
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("master", "main-one", "deployment1"));
assertEquals("OVERRIDDEN", performHttpCall("master", "main-one", "another"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "deployment0"));
assertEquals("NON OVERRIDDEN", performHttpCall("slave", "main-three", "deployment1"));
assertEquals("OVERRIDDEN", performHttpCall("slave", "main-three", "another"));
}
private String performHttpCall(String host, String server, String deployment) throws Exception {
ModelNode op = new ModelNode();
op.get(OP).set(READ_RESOURCE_OPERATION);
op.get(OP_ADDR).add(HOST, host).add(SERVER, server).add(SOCKET_BINDING_GROUP, SOCKET_BINDING_GROUP_NAME).add(SOCKET_BINDING, "http");
op.get(INCLUDE_RUNTIME).set(true);
ModelNode socketBinding = validateResponse(client.execute(op));
URL url = new URL("http",
NetworkUtils.formatAddress(InetAddress.getByName(socketBinding.get("bound-address").asString())),
socketBinding.get("bound-port").asInt(),
"/" + deployment + "/SimpleServlet?env-entry=overlay-test");
return HttpRequest.get(url.toExternalForm(), 10, TimeUnit.SECONDS).trim();
}
}