Using jboss-as-embedded for integration testing of OpenShift Express

This commit is contained in:
Andrew Phillips 2012-02-17 22:29:36 +01:00
parent fdc9bd4691
commit ccc86123ca
7 changed files with 529 additions and 53 deletions

View File

@ -32,8 +32,9 @@
<description>jclouds TweetStore for RedHat's OpenShift Express using Guice for Dependency Injection</description>
<properties>
<test.rhcloud.address>localhost</test.rhcloud.address>
<test.rhcloud.port>8088</test.rhcloud.port>
<rhcloud.jboss.version>7.0.2.Final</rhcloud.jboss.version>
<rhcloud.jboss.address>localhost</rhcloud.jboss.address>
<rhcloud.jboss.port>8088</rhcloud.jboss.port>
<jclouds.tweetstore.container>jclouds-rhcloud-tweetstore</jclouds.tweetstore.container>
</properties>
@ -45,28 +46,22 @@
</dependency>
<!-- OpenShift Express uses JBoss AS 7 -->
<!--dependency>
<groupId>org.jboss.embedded</groupId>
<artifactId>jboss-embedded</artifactId>
<version>beta3.SP12</version>
<dependency>
<groupId>org.jboss.as</groupId>
<artifactId>jboss-as-embedded</artifactId>
<version>${rhcloud.jboss.version}</version>
<scope>test</scope>
</dependency-->
<exclusions>
<!-- loading the LogManager here leads to ClassCastExceptions because
the server uses a different classloader -->
<exclusion>
<artifactId>jboss-logmanager</artifactId>
<groupId>org.jboss.logmanager</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!--repositories>
<!- - net.stax:stax-appserver is not in central - ->
<repository>
<id>bees-snapshots</id>
<url>http://repository-cloudbees.forge.cloudbees.com/public-snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories-->
<profiles>
<profile>
<id>live</id>
@ -97,12 +92,19 @@
<test.cloudonestorage.credential>${test.cloudonestorage.credential}</test.cloudonestorage.credential>
<test.ninefold-storage.identity>${test.ninefold-storage.identity}</test.ninefold-storage.identity>
<test.ninefold-storage.credential>${test.ninefold-storage.credential}</test.ninefold-storage.credential>
<rhcloud.address>${test.rhcloud.address}</rhcloud.address>
<rhcloud.port>${test.rhcloud.port}</rhcloud.port>
<rhcloud.jboss.home>${rhcloud.jboss.home}</rhcloud.jboss.home>
<rhcloud.jboss.address>${rhcloud.jboss.address}</rhcloud.jboss.address>
<rhcloud.jboss.port>${rhcloud.jboss.port}</rhcloud.jboss.port>
<jclouds.tweetstore.blobstores>${jclouds.tweetstore.blobstores}</jclouds.tweetstore.blobstores>
<jclouds.tweetstore.container>test.${jclouds.tweetstore.container}</jclouds.tweetstore.container>
<warfile>${project.build.directory}/${project.artifactId}</warfile>
<jboss.embedded.root>${project.build.directory}/rhcloud-jboss</jboss.embedded.root>
<jboss.server.config.dir>${project.basedir}/src/test/resources/jbossas7/configuration</jboss.server.config.dir>
<warfile>${project.build.directory}/${project.build.finalName}</warfile>
</systemPropertyVariables>
<environmentVariables>
<OPENSHIFT_INTERNAL_IP>${rhcloud.jboss.address}</OPENSHIFT_INTERNAL_IP>
<OPENSHIFT_INTERNAL_PORT>${rhcloud.jboss.port}</OPENSHIFT_INTERNAL_PORT>
</environmentVariables>
</configuration>
</execution>
</executions>

View File

@ -0,0 +1,96 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.embedded;
import java.io.File;
import java.util.Map;
import java.util.Properties;
import java.util.logging.LogManager;
import org.jboss.modules.Module;
import org.jboss.modules.ModuleClassLoader;
import org.jboss.modules.ModuleIdentifier;
import org.jboss.modules.ModuleLoadException;
import org.jboss.modules.ModuleLoader;
import org.jboss.modules.log.JDKModuleLogger;
import org.jclouds.demo.tweetstore.integration.util.ObjectFields;
/**
* A variant of {@link EmbeddedServerFactory} that resets JDK logging for JBoss,
* which requires its own settings in this area.
*
* Needs to be in the org.jboss.as.embedded package to be able to use
* {@code InitialModuleLoaderFactory}.
*
* @author Andrew Phillips
* @see EmbeddedServerFactory
*/
public class EmbeddedServerFactory2 {
// mainly copied from EmbeddedServerFactory
public static StandaloneServer create(final File jbossHomeDir, final Properties systemProps, final Map<String, String> systemEnv, String...systemPackages) {
if (jbossHomeDir == null || jbossHomeDir.isDirectory() == false)
throw new IllegalStateException("Invalid jboss.home.dir: " + jbossHomeDir);
if (systemProps.getProperty(ServerEnvironment.HOME_DIR) == null)
systemProps.setProperty(ServerEnvironment.HOME_DIR, jbossHomeDir.getAbsolutePath());
File modulesDir = new File(jbossHomeDir + "/modules");
final ModuleLoader moduleLoader = InitialModuleLoaderFactory.getModuleLoader(modulesDir, systemPackages);
try {
Module.registerURLStreamHandlerFactoryModule(moduleLoader.loadModule(ModuleIdentifier.create("org.jboss.vfs")));
// Initialize the Logging system
ModuleIdentifier logModuleId = ModuleIdentifier.create("org.jboss.logmanager");
ModuleClassLoader logModuleClassLoader = moduleLoader.loadModule(logModuleId).getClassLoader();
try {
/*
* The original code simply sets the thread context classloader and lets LogManager
* load the class. This causes problems in tests because any other component that
* also happens to use JDK logging will have potentially loaded a *different*
* LogManager.
* If you force the JBoss LogManager to be loaded (by setting the 'java.util.logging.manager'
* system property) earlier in the test run, it will not be loaded by the correct
* classloader and cause ClassCastExceptions.
*/
LogManager jbossLogManager = (LogManager) logModuleClassLoader.loadClass("org.jboss.logmanager.LogManager").newInstance();
ObjectFields.set("manager", null, jbossLogManager, LogManager.class);
ObjectFields.set("readPrimordialConfiguration", jbossLogManager, false, LogManager.class);
if (LogManager.getLogManager().getClass() == LogManager.class) {
System.err.println("WARNING: Failed to load the specified logmodule " + logModuleId);
} else {
Module.setModuleLogger(new JDKModuleLogger());
}
} catch (Exception exception) {
// copied from LogManager
System.err.println("Could not load Logmanager \"org.jboss.logmanager.LogManager\"");
exception.printStackTrace();
}
__redirected.__JAXPRedirected.changeAll(ModuleIdentifier.fromString("javax.xml.jaxp-provider"), moduleLoader);
return EmbeddedServerFactory.create(moduleLoader, jbossHomeDir, systemProps, systemEnv);
}
catch (ModuleLoadException e) {
throw new RuntimeException(e);
}
}
}

View File

@ -18,38 +18,92 @@
*/
package org.jclouds.demo.tweetstore.integration;
import static com.google.common.collect.Iterables.find;
import static com.google.common.io.Closeables.closeQuietly;
import static java.lang.String.format;
import static org.jclouds.demo.tweetstore.integration.util.Zips.zipFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
import org.jboss.as.controller.client.helpers.standalone.DeploymentAction;
import org.jboss.as.controller.client.helpers.standalone.DeploymentPlan;
import org.jboss.as.controller.client.helpers.standalone.ServerDeploymentActionResult;
import org.jboss.as.controller.client.helpers.standalone.ServerDeploymentManager;
import org.jboss.as.controller.client.helpers.standalone.ServerDeploymentPlanResult;
import org.jboss.as.embedded.EmbeddedServerFactory2;
import org.jboss.as.embedded.ServerStartException;
import org.jboss.as.embedded.StandaloneServer;
import com.google.common.base.Predicate;
import com.google.common.io.Files;
/**
* Basic functionality to start a local JBoss 7 AS (as used by OpenShift Express) instance.
*
* Basic functionality to start a local JBoss AS 7 instance.
*
* @author Andrew Phillips
*/
public class RhcloudServer {
//protected StaxSdkAppServer2 server;
private static final byte[] CONTEXT_ROOT_XML_BYTES =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><jboss-web><context-root>/</context-root></jboss-web>".getBytes();
protected StandaloneServer server;
protected ServerDeploymentManager manager;
public void writePropertiesAndStartServer(final String address, final String port,
final String warfile, final String environments,
final String serverBaseDirectory, Properties props) throws IOException, InterruptedException, ServletException {
String filename = String.format(
"%1$s/WEB-INF/jclouds.properties", warfile);
System.err.println("file: " + filename);
props.store(new FileOutputStream(filename), "test");
assert new File(filename).exists();
// server = StaxSdkAppServer2.createServer(new String[] { "-web", warfile, "-port", port, "-env", environments,
// "-dir", serverBaseDirectory }, new String[0], Thread.currentThread().getContextClassLoader());
// server.start();
public void writePropertiesAndStartServer(String warfile,
String serverHome, Properties props) throws IOException,
ServerStartException, InterruptedException, ExecutionException {
String propsfile = String.format("%1$s/WEB-INF/jclouds.properties", warfile);
System.err.println("file: " + propsfile);
storeProperties(propsfile, props);
assert new File(propsfile).exists();
// in OpenShift, TweetStore runs at the server root
String ctxrootfile = String.format("%1$s/WEB-INF/jboss-web.xml", warfile);
System.err.println("file: " + ctxrootfile);
Files.write(CONTEXT_ROOT_XML_BYTES, new File(ctxrootfile));
assert new File(ctxrootfile).exists();
server = EmbeddedServerFactory2.create(new File(serverHome), System.getProperties(), System.getenv());
server.start();
TimeUnit.SECONDS.sleep(30);
manager = ServerDeploymentManager.Factory.create(server.getModelControllerClient());
ServerDeploymentActionResult deploymentResult = deploy(warfile);
System.err.println("deployment result: " + deploymentResult.getResult());
}
private static void storeProperties(String filename, Properties props)
throws IOException {
FileOutputStream targetFile = new FileOutputStream(filename);
try {
props.store(targetFile, "test");
} finally {
closeQuietly(targetFile);
}
}
protected ServerDeploymentActionResult deploy(String explodedWar)
throws IOException, InterruptedException, ExecutionException {
File war = zipFile(explodedWar, format("%s-rhcloud.war", explodedWar), true);
final String deploymentName = war.getName();
DeploymentPlan plan =
manager.newDeploymentPlan().add(deploymentName, war).andDeploy().build();
ServerDeploymentPlanResult deploymentResult = manager.execute(plan).get();
return deploymentResult.getDeploymentActionResult(find(
plan.getDeploymentActions(), new Predicate<DeploymentAction>() {
@Override
public boolean apply(DeploymentAction input) {
return input.getDeploymentUnitUniqueName().equals(deploymentName);
}
}).getId());
}
public void stop() throws Exception {
// server.stop();
server.stop();
}
}

View File

@ -62,10 +62,10 @@ import com.google.common.collect.Maps;
import com.google.inject.Module;
/**
* Starts up the Google App Engine for Java Development environment and deploys an application which
* tests accesses twitter and blobstores.
* Starts up a JBoss AS 7 server (simulating OpenShift Express) and deploys
* an application which tests accesses twitter and blobstores.
*
* @author Adrian Cole
* @author Andrew Phillips
*/
@Test(groups = "live", singleThreaded = true)
public class TweetStoreLiveTest {
@ -170,28 +170,28 @@ public class TweetStoreLiveTest {
}
@BeforeTest(dependsOnMethods = "clearAndCreateContainers")
@Parameters({ "warfile", "rhcloud.address", "rhcloud.port" })
public void startDevAppServer(final String warfile, final String address, final String port) throws Exception {
@Parameters({ "warfile", "rhcloud.jboss.address", "rhcloud.jboss.port", "rhcloud.jboss.home" })
public void startDevAppServer(final String warfile, final String address, final String port,
String serverHome) throws Exception {
url = new URL(String.format("http://%s:%s", address, port));
server = new RhcloudServer();
// server.writePropertiesAndStartServer(address, port, warfile, "itest",
// serverBaseDirectory, props);
server.writePropertiesAndStartServer(warfile, serverHome, props);
}
@Test(enabled = false)
@Test
public void shouldPass() throws InterruptedException, IOException {
InputStream i = url.openStream();
String string = Strings2.toStringAndClose(i);
assert string.indexOf("Welcome") >= 0 : string;
}
@Test(dependsOnMethods = "shouldPass", expectedExceptions = IOException.class, enabled = false)
@Test(dependsOnMethods = "shouldPass", expectedExceptions = IOException.class)
public void shouldFail() throws InterruptedException, IOException {
new URL(url, "/store/do").openStream();
}
@Test(dependsOnMethods = "shouldFail", enabled = false)
@Test(dependsOnMethods = "shouldFail")
public void testPrimeContainers() throws IOException, InterruptedException {
URL gurl = new URL(url, "/store/do");
@ -213,7 +213,7 @@ public class TweetStoreLiveTest {
}
}
@Test(invocationCount = 5, dependsOnMethods = "testPrimeContainers", enabled = false)
@Test(invocationCount = 5, dependsOnMethods = "testPrimeContainers")
public void testSerial() throws InterruptedException, IOException {
URL gurl = new URL(url, "/tweets/get");
InputStream i = gurl.openStream();
@ -221,7 +221,7 @@ public class TweetStoreLiveTest {
assert string.indexOf("Tweets in Clouds") >= 0 : string;
}
@Test(invocationCount = 10, dependsOnMethods = "testPrimeContainers", threadPoolSize = 3, enabled = false)
@Test(invocationCount = 10, dependsOnMethods = "testPrimeContainers", threadPoolSize = 3)
public void testParallel() throws InterruptedException, IOException {
URL gurl = new URL(url, "/tweets/get");
InputStream i = gurl.openStream();

View File

@ -0,0 +1,43 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.jclouds.demo.tweetstore.integration.util;
import java.lang.reflect.Field;
public class ObjectFields {
private static Field getAccessibleField(String name, Class<?> declaringClass) throws SecurityException, NoSuchFieldException {
Field field = declaringClass.getDeclaredField(name);
field.setAccessible(true);
return field;
}
public static void set(String fieldName, Object target, Object value) {
set(fieldName, target, value, target.getClass());
}
public static void set(String fieldName, Object target, Object value,
Class<?> fieldDeclaringClass) {
try {
getAccessibleField(fieldName, fieldDeclaringClass).set(target, value);
} catch (Exception exception) {
throw new IllegalArgumentException(exception);
}
}
}

View File

@ -0,0 +1,73 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.jclouds.demo.tweetstore.integration.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class Zips {
private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
public static File zipFile(String fileToZip, String zipFile,
boolean excludeToplevelFolder) throws IOException {
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
try {
File srcFile = new File(fileToZip);
if (excludeToplevelFolder && srcFile.isDirectory()) {
for (String fileName : srcFile.list()) {
addToZip("", fileToZip + "/" + fileName, zipOut);
}
} else {
addToZip("", fileToZip, zipOut);
}
zipOut.flush();
} finally {
zipOut.close();
}
return new File(zipFile);
}
private static void addToZip(String path, String srcFile,
ZipOutputStream zipOut) throws IOException {
File file = new File(srcFile);
String filePath = ("".equals(path) ? file.getName()
: path + "/" + file.getName());
if (file.isDirectory()) {
for (String fileName : file.list()) {
addToZip(filePath, srcFile + "/" + fileName, zipOut);
}
} else {
zipOut.putNextEntry(new ZipEntry(filePath));
FileInputStream in = new FileInputStream(srcFile);
try {
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int len;
while ((len = in.read(buffer)) != -1) {
zipOut.write(buffer, 0, len);
}
} finally {
in.close();
}
}
}
}

View File

@ -0,0 +1,208 @@
<?xml version='1.0' encoding='UTF-8'?>
<!--
Licensed to jclouds, Inc. (jclouds) under one or more
contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. jclouds licenses this file
to you 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.
-->
<server xmlns="urn:jboss:domain:1.0">
<extensions>
<extension module="org.jboss.as.clustering.infinispan"/>
<extension module="org.jboss.as.connector"/>
<extension module="org.jboss.as.deployment-scanner"/>
<extension module="org.jboss.as.ee"/>
<extension module="org.jboss.as.ejb3"/>
<extension module="org.jboss.as.jaxrs"/>
<extension module="org.jboss.as.jmx"/>
<extension module="org.jboss.as.jpa"/>
<extension module="org.jboss.as.logging"/>
<extension module="org.jboss.as.naming"/>
<extension module="org.jboss.as.sar"/>
<extension module="org.jboss.as.security"/>
<extension module="org.jboss.as.threads"/>
<extension module="org.jboss.as.transactions"/>
<extension module="org.jboss.as.web" />
<extension module="org.jboss.as.weld" />
</extensions>
<profile>
<subsystem xmlns="urn:jboss:domain:logging:1.0">
<console-handler name="CONSOLE">
<level name="INFO"/>
<formatter>
<pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
</formatter>
</console-handler>
<periodic-rotating-file-handler name="FILE">
<level name="INFO"/>
<formatter>
<pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<suffix value=".yyyy-MM-dd"/>
</periodic-rotating-file-handler>
<logger category="com.arjuna">
<level name="WARN"/>
</logger>
<logger category="org.apache.tomcat.util.modeler">
<level name="WARN"/>
</logger>
<logger category="sun.rmi">
<level name="WARN"/>
</logger>
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
</subsystem>
<subsystem xmlns="urn:jboss:domain:datasources:1.0">
<datasources>
<datasource jndi-name="java:jboss/datasources/ExampleDS" enabled="true" use-java-context="true" pool-name="H2DS">
<connection-url>jdbc:h2:${jboss.server.data.dir}/test;DB_CLOSE_DELAY=-1</connection-url>
<driver>h2</driver>
<pool></pool>
<security>
<user-name>sa</user-name>
<password>sa</password>
</security>
<validation></validation>
<timeout></timeout>
<statement></statement>
</datasource>
<datasource jndi-name="java:jboss/datasources/MysqlDS" enabled="${mysql.enabled}" use-java-context="true" pool-name="MysqlDS">
<connection-url>jdbc:mysql://${OPENSHIFT_DB_HOST}:${OPENSHIFT_DB_PORT}/${OPENSHIFT_APP_NAME}</connection-url>
<driver>mysql</driver>
<security>
<user-name>${OPENSHIFT_DB_USERNAME}</user-name>
<password>${OPENSHIFT_DB_PASSWORD}</password>
</security>
</datasource>
<drivers>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
</driver>
<driver name="mysql" module="com.mysql.jdbc">
<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
</driver>
</drivers>
</datasources>
</subsystem>
<subsystem xmlns="urn:jboss:domain:deployment-scanner:1.0">
<deployment-scanner scan-interval="5000" relative-to="jboss.server.base.dir" path="deployments" />
</subsystem>
<subsystem xmlns="urn:jboss:domain:ee:1.0" />
<subsystem xmlns="urn:jboss:domain:ejb3:1.0" />
<subsystem xmlns="urn:jboss:domain:infinispan:1.0" default-cache-container="hibernate">
<cache-container name="hibernate" default-cache="local-query">
<local-cache name="entity">
<eviction strategy="LRU" max-entries="10000"/>
<expiration max-idle="100000"/>
</local-cache>
<local-cache name="local-query">
<eviction strategy="LRU" max-entries="10000"/>
<expiration max-idle="100000"/>
</local-cache>
<local-cache name="timestamps">
<eviction strategy="NONE"/>
</local-cache>
</cache-container>
</subsystem>
<subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/>
<subsystem xmlns="urn:jboss:domain:jca:1.0">
<archive-validation enabled="false" />
<bean-validation enabled="false" />
<default-workmanager>
<short-running-threads blocking="true">
<core-threads count="5" per-cpu="10"/>
<queue-length count="5" per-cpu="10"/>
<max-threads count="5" per-cpu="10"/>
<keepalive-time time="10" unit="seconds"/>
</short-running-threads>
<long-running-threads blocking="true">
<core-threads count="5" per-cpu="10"/>
<queue-length count="5" per-cpu="10"/>
<max-threads count="5" per-cpu="10"/>
<keepalive-time time="10" unit="seconds"/>
</long-running-threads>
</default-workmanager>
</subsystem>
<subsystem xmlns="urn:jboss:domain:jpa:1.0">
<jpa default-datasource=""/>
</subsystem>
<subsystem xmlns="urn:jboss:domain:naming:1.0" />
<subsystem xmlns="urn:jboss:domain:resource-adapters:1.0" />
<subsystem xmlns="urn:jboss:domain:sar:1.0"/>
<subsystem xmlns="urn:jboss:domain:security:1.0">
<security-domains>
<security-domain name="other" cache-type="default">
<authentication>
<login-module code="UsersRoles" flag="required"/>
</authentication>
</security-domain>
</security-domains>
</subsystem>
<subsystem xmlns="urn:jboss:domain:threads:1.0"/>
<subsystem xmlns="urn:jboss:domain:transactions:1.0">
<recovery-environment socket-binding="txn-recovery-environment" status-socket-binding="txn-status-manager"/>
<core-environment>
<process-id>
<uuid />
</process-id>
</core-environment>
<coordinator-environment default-timeout="300"/>
</subsystem>
<subsystem xmlns="urn:jboss:domain:web:1.0" default-virtual-server="default-host">
<connector name="http" scheme="http" protocol="HTTP/1.1" socket-binding="http"/>
<virtual-server name="default-host">
<alias name="localhost" />
</virtual-server>
</subsystem>
<subsystem xmlns="urn:jboss:domain:weld:1.0" />
</profile>
<interfaces>
<interface name="management">
<!-- the "original" (i.e. as provided by OpenShift) uses loopback-address -->
<inet-address value="${rhcloud.jboss.address:127.0.0.1}"/>
</interface>
<interface name="public">
<!-- the "original" uses loopback-address -->
<inet-address value="${rhcloud.jboss.address:127.0.0.1}"/>
</interface>
</interfaces>
<socket-binding-group name="standard-sockets" default-interface="public">
<socket-binding name="http" port="${rhcloud.jboss.port:8080}"/>
<socket-binding name="https" port="8443"/>
<socket-binding name="jmx-connector-registry" port="1090"/>
<socket-binding name="jmx-connector-server" port="1091"/>
<socket-binding name="jndi" port="1099"/>
<socket-binding name="osgi-http" port="8090"/>
<socket-binding name="remoting" port="4447"/>
<socket-binding name="txn-recovery-environment" port="4712"/>
<socket-binding name="txn-status-manager" port="4713"/>
</socket-binding-group>
</server>