Repository: incubator-brooklyn Updated Branches: refs/heads/master fc42b17ff -> 7154cc9ec
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/070b5ca7/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastNodeImpl.java ---------------------------------------------------------------------- diff --git a/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastNodeImpl.java b/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastNodeImpl.java new file mode 100644 index 0000000..fadfe46 --- /dev/null +++ b/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastNodeImpl.java @@ -0,0 +1,148 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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.apache.brooklyn.entity.nosql.hazelcast; + +import java.net.URI; +import java.util.concurrent.TimeUnit; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import brooklyn.entity.basic.Attributes; +import brooklyn.entity.basic.SoftwareProcessImpl; +import brooklyn.event.feed.http.HttpFeed; +import brooklyn.event.feed.http.HttpPollConfig; +import brooklyn.event.feed.http.HttpValueFunctions; +import brooklyn.location.access.BrooklynAccessUtils; +import brooklyn.util.text.Strings; + +import com.google.common.base.Functions; +import com.google.common.net.HostAndPort; + +public class HazelcastNodeImpl extends SoftwareProcessImpl implements HazelcastNode { + + private static final Logger LOG = LoggerFactory.getLogger(HazelcastNodeImpl.class); + + HttpFeed httpFeed; + + @Override + public Class<HazelcastNodeDriver> getDriverInterface() { + return HazelcastNodeDriver.class; + } + + @Override + protected void connectSensors() { + super.connectSensors(); + + if (LOG.isDebugEnabled()) { + LOG.debug("Connecting sensors for node: {} ", getAttribute(Attributes.HOSTNAME)); + } + + HostAndPort hp = BrooklynAccessUtils.getBrooklynAccessibleAddress(this, getNodePort()); + + String nodeUri = String.format("http://%s:%d/hazelcast/rest/cluster", hp.getHostText(), hp.getPort()); + setAttribute(Attributes.MAIN_URI, URI.create(nodeUri)); + + if (LOG.isDebugEnabled()) { + LOG.debug("Node {} is using {} as a main URI", this, nodeUri); + } + + httpFeed = HttpFeed.builder() + .entity(this) + .period(3000, TimeUnit.MILLISECONDS) + .baseUri(nodeUri) + .poll(new HttpPollConfig<Boolean>(SERVICE_UP) + .onSuccess(HttpValueFunctions.responseCodeEquals(200)) + .onFailureOrException(Functions.constant(false))) + .build(); + } + + @Override + protected void disconnectSensors() { + if (httpFeed != null) { + httpFeed.stop(); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("Disconnecting sensors for node: {} ", getAttribute(Attributes.HOSTNAME)); + } + + super.disconnectSensors(); + disconnectServiceUpIsRunning(); + } + + + @Override + public String getGroupName() { + return getConfig(HazelcastNode.GROUP_NAME); + } + + @Override + public String getGroupPassword() { + return getConfig(HazelcastNode.GROUP_PASSWORD); + } + + @Override + public String getNodeName() { + return getAttribute(HazelcastNode.NODE_NAME); + } + + @Override + public Integer getNodePort() { + return getAttribute(HazelcastNode.NODE_PORT); + } + + @Override + public String getHostname() { + return getAttribute(HOSTNAME); + } + + @Override + public String getHostAddress() { + return getAttribute(ADDRESS); + } + + @Override + public String getPrivateIpAddress() { + return getAttribute(SUBNET_ADDRESS); + } + + @Override + public String getListenAddress() { + String listenAddress = getPrivateIpAddress(); + + if (Strings.isBlank(listenAddress)) { + listenAddress = getAttribute(ADDRESS); + } + + if (LOG.isInfoEnabled()) { + LOG.info("Node {} is listening on {}", this, listenAddress); + } + + + return listenAddress; + } + + + @Override + public String getHeapMemorySize() { + return getConfig(HazelcastNode.NODE_HEAP_MEMORY_SIZE); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/070b5ca7/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastNodeSshDriver.java ---------------------------------------------------------------------- diff --git a/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastNodeSshDriver.java b/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastNodeSshDriver.java new file mode 100644 index 0000000..1dea440 --- /dev/null +++ b/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastNodeSshDriver.java @@ -0,0 +1,159 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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.apache.brooklyn.entity.nosql.hazelcast; + +import static java.lang.String.format; + +import java.util.List; +import java.util.concurrent.ExecutionException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import brooklyn.entity.Entity; +import brooklyn.entity.basic.Entities; +import brooklyn.entity.basic.EntityLocal; +import brooklyn.entity.java.JavaSoftwareProcessSshDriver; +import brooklyn.location.basic.SshMachineLocation; +import brooklyn.util.collections.MutableMap; +import brooklyn.util.os.Os; +import brooklyn.util.ssh.BashCommands; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; + +public class HazelcastNodeSshDriver extends JavaSoftwareProcessSshDriver implements HazelcastNodeDriver { + + private static final Logger LOG = LoggerFactory.getLogger(HazelcastNodeSshDriver.class); + + public HazelcastNodeSshDriver(EntityLocal entity, SshMachineLocation machine) { + super(entity, machine); + } + + @Override + public void preInstall() { + resolver = Entities.newDownloader(this); + } + + @Override + public void install() { + List<String> urls = resolver.getTargets(); + String saveAs = resolver.getFilename(); + + List<String> commands = ImmutableList.<String>builder() + .add(BashCommands.installJavaLatestOrWarn()) + .addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs)) + .build(); + + newScript(INSTALLING).body.append(commands).execute(); + } + + @Override + public void customize() { + if (LOG.isInfoEnabled()) { + LOG.info("Customizing {}", entity.getAttribute(HazelcastNode.NODE_NAME)); + } + + ImmutableList.Builder<String> commands = new ImmutableList.Builder<String>() + .add("mkdir -p lib conf log") + .add(String.format("cp %s/%s %s/lib/", getInstallDir(), resolver.getFilename(), getRunDir())); + + newScript(CUSTOMIZING) + .body.append(commands.build()) + .failOnNonZeroResultCode() + .execute(); + + copyTemplate(entity.getConfig(HazelcastNode.CONFIG_TEMPLATE_URL), Os.mergePathsUnix(getRunDir(), "conf", getConfigFileName())); + + } + + @Override + public void launch() { + + entity.setAttribute(HazelcastNode.PID_FILE, Os.mergePathsUnix(getRunDir(), PID_FILENAME)); + + String maxHeapMemorySize = getHeapMemorySize(); + + if (LOG.isInfoEnabled()) { + LOG.info("Launching {} with heap memory of {}", entity, maxHeapMemorySize); + } + + // Setting initial heap size (Xms) size to match max heap size (Xms) at first + String initialHeapMemorySize = maxHeapMemorySize; + + StringBuilder commandBuilder = new StringBuilder() + .append(format("nohup java -cp ./lib/%s", resolver.getFilename())) + .append(format(" -Xmx%s -Xms%s", maxHeapMemorySize, initialHeapMemorySize)) + .append(format(" -Dhazelcast.config=./conf/%s", getConfigFileName())) + .append(format(" com.hazelcast.core.server.StartServer >> %s 2>&1 </dev/null &", getLogFileLocation())); + + newScript(MutableMap.of(USE_PID_FILE, true), LAUNCHING) + .updateTaskAndFailOnNonZeroResultCode() + .body.append(commandBuilder.toString()) + .execute(); + } + + public String getConfigFileName() { + return entity.getConfig(HazelcastNode.CONFIG_FILE_NAME); + } + + public String getHeapMemorySize() { + return entity.getConfig(HazelcastNode.NODE_HEAP_MEMORY_SIZE); + } + + @Override + public boolean isRunning() { + return newScript(MutableMap.of(USE_PID_FILE, true), CHECK_RUNNING).execute() == 0; + } + + @Override + public void stop() { + newScript(MutableMap.of(USE_PID_FILE, true), STOPPING).execute(); + } + + @Override + public void kill() { + newScript(MutableMap.of(USE_PID_FILE, true), KILLING).execute(); + } + + public List<String> getHazelcastNodesList() throws ExecutionException, InterruptedException { + HazelcastCluster cluster = (HazelcastCluster) entity.getParent(); + List<String> result = Lists.newArrayList(); + + for (Entity member : cluster.getMembers()) { + String address = Entities.attributeSupplierWhenReady(member, HazelcastNode.SUBNET_ADDRESS).get(); + Integer port = Entities.attributeSupplierWhenReady(member, HazelcastNode.NODE_PORT).get(); + + String addressAndPort = String.format("%s:%d", address, port); + + if (LOG.isInfoEnabled()) { + LOG.info("Adding {} to the members' list of {}", addressAndPort, entity.getAttribute(HazelcastNode.NODE_NAME)); + } + result.add(addressAndPort); + } + + return result; + } + + @Override + protected String getLogFileLocation() { + return Os.mergePathsUnix(getRunDir(),"/log/out.log"); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/070b5ca7/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5Driver.java ---------------------------------------------------------------------- diff --git a/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5Driver.java b/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5Driver.java new file mode 100644 index 0000000..810450e --- /dev/null +++ b/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5Driver.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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.apache.brooklyn.entity.nosql.infinispan; + +public interface Infinispan5Driver { + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/070b5ca7/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5Server.java ---------------------------------------------------------------------- diff --git a/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5Server.java b/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5Server.java new file mode 100644 index 0000000..cb1043b --- /dev/null +++ b/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5Server.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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.apache.brooklyn.entity.nosql.infinispan; + +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import brooklyn.config.ConfigKey; +import brooklyn.entity.Entity; +import brooklyn.entity.basic.ConfigKeys; +import brooklyn.entity.basic.SoftwareProcess; +import brooklyn.entity.basic.SoftwareProcessImpl; +import brooklyn.entity.java.UsesJmx; +import brooklyn.event.basic.BasicAttributeSensorAndConfigKey; +import brooklyn.event.basic.PortAttributeSensorAndConfigKey; +import brooklyn.util.collections.MutableMap; +import brooklyn.util.flags.SetFromFlag; + +/** + * An {@link brooklyn.entity.Entity} that represents an Infinispan service + */ +public class Infinispan5Server extends SoftwareProcessImpl implements UsesJmx { + private static final Logger log = LoggerFactory.getLogger(Infinispan5Server.class); + + public static final BasicAttributeSensorAndConfigKey<String> PROTOCOL = new BasicAttributeSensorAndConfigKey<String>( + String.class, "infinispan.server.protocol", + "Infinispan protocol (e.g. memcached, hotrod, or websocket)", "memcached"); + + public static final PortAttributeSensorAndConfigKey PORT = new PortAttributeSensorAndConfigKey( + "infinispan.server.port", "TCP port number to listen on"); + + @SetFromFlag("version") + public static final ConfigKey<String> SUGGESTED_VERSION = + ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "5.0.0.CR8"); + + // Default filename is "infinispan-${version}-all.zip" + @SetFromFlag("downloadUrl") + public static final BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new BasicAttributeSensorAndConfigKey<String>( + SoftwareProcess.DOWNLOAD_URL, "http://sourceforge.net/projects/infinispan/files/infinispan/${version}/infinispan-${version}-all.zip/download"); + + public Infinispan5Server() { + this(MutableMap.of(), null); + } + public Infinispan5Server(Map properties) { + this(properties, null); + } + public Infinispan5Server(Entity parent) { + this(MutableMap.of(), parent); + } + public Infinispan5Server(Map properties, Entity parent) { + super(properties, parent); + } + + @Override + public Class getDriverInterface() { + return Infinispan5Driver.class; + } + + @Override + protected void connectSensors() { + super.connectSensors(); + super.connectServiceUpIsRunning(); + } + + @Override + protected void disconnectSensors() { + super.disconnectServiceUpIsRunning(); + super.disconnectSensors(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/070b5ca7/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5SshDriver.java ---------------------------------------------------------------------- diff --git a/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5SshDriver.java b/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5SshDriver.java new file mode 100644 index 0000000..1c2d33b --- /dev/null +++ b/sandbox/nosql/src/main/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5SshDriver.java @@ -0,0 +1,124 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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.apache.brooklyn.entity.nosql.infinispan; + +import static java.lang.String.format; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import brooklyn.entity.java.JavaSoftwareProcessSshDriver; +import brooklyn.location.Location; +import brooklyn.location.basic.SshMachineLocation; +import brooklyn.util.collections.MutableMap; +import brooklyn.util.net.Networking; +import brooklyn.util.ssh.BashCommands; + +import com.google.common.collect.ImmutableList; + +/** + * Start a {@link TomcatServer} in a {@link Location} accessible over ssh. + */ +public class Infinispan5SshDriver extends JavaSoftwareProcessSshDriver implements Infinispan5Driver { + + public Infinispan5SshDriver(Infinispan5Server entity, SshMachineLocation machine) { + super(entity, machine); + } + + @Override + protected String getLogFileLocation() { + throw new UnsupportedOperationException("Work in progress"); + } + + protected String getProtocol() { + return entity.getAttribute(Infinispan5Server.PROTOCOL); + } + + protected Integer getPort() { + return entity.getAttribute(Infinispan5Server.PORT); + } + + @Override + public void install() { + List<String> urls = resolver.getTargets(); + String saveAs = resolver.getFilename(); + + List<String> commands = ImmutableList.<String>builder() + .addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs)) + .add(BashCommands.INSTALL_ZIP) + .add("unzip " + saveAs) + .build(); + + newScript(INSTALLING). + failOnNonZeroResultCode(). + body.append(commands).execute(); + } + + @Override + public void customize() { + // TODO create and reference a conf.xml? And start with --cache_config <path> + Map ports = MutableMap.of("port", getPort(), "jmxPort", getJmxPort()); + Networking.checkPortsValid(ports); + + newScript(CUSTOMIZING) + .body.append() + .execute(); + } + + @Override + public void launch() { + // FIXME Do we want to redirect stdout/stderr: >> %s/console 2>&1 </dev/null &", getRunDir()) + newScript(MutableMap.of("usePidFile", true), LAUNCHING). + body.append( + format("%s/bin/startServer.sh --protocol %s " + +(getPort() != null ? " --port %s" : "")+" &", + getExpandedInstallDir(), getProtocol(), getPort())) + .execute(); + } + + + @Override + public boolean isRunning() { + Map flags = MutableMap.of("usePidFile", true); + return newScript(flags, CHECK_RUNNING).execute() == 0; + } + + @Override + public void stop() { + Map flags = MutableMap.of("usePidFile", true); + newScript(flags, STOPPING).execute(); + } + + @Override + public void kill() { + Map flags = MutableMap.of("usePidFile", true); + newScript(flags, KILLING).execute(); + } + + @Override + protected List<String> getCustomJavaConfigOptions() { + List<String> options = new LinkedList<String>(); + options.addAll(super.getCustomJavaConfigOptions()); + options.add("-Xms200m"); + options.add("-Xmx800m"); + options.add("-XX:MaxPermSize=400m"); + return options; + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/070b5ca7/sandbox/nosql/src/main/resources/brooklyn/entity/nosql/hazelcast/hazelcast-brooklyn.xml ---------------------------------------------------------------------- diff --git a/sandbox/nosql/src/main/resources/brooklyn/entity/nosql/hazelcast/hazelcast-brooklyn.xml b/sandbox/nosql/src/main/resources/brooklyn/entity/nosql/hazelcast/hazelcast-brooklyn.xml deleted file mode 100644 index 459be4e..0000000 --- a/sandbox/nosql/src/main/resources/brooklyn/entity/nosql/hazelcast/hazelcast-brooklyn.xml +++ /dev/null @@ -1,65 +0,0 @@ -[#ftl] -<?xml version="1.0" encoding="UTF-8"?> - -<hazelcast xsi:schemaLocation="http://www.hazelcast.com/schema/config hazelcast-config-3.4.xsd" - xmlns="http://www.hazelcast.com/schema/config" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <group> - <name>${entity.groupName}</name> - <password>${entity.groupPassword}</password> - </group> - <management-center enabled="false">http://localhost:8080/mancenter</management-center> - <network> - <port auto-increment="true" port-count="100">${entity.nodePort?c}</port> - <outbound-ports> - <!-- - Allowed port range when connecting to other nodes. - 0 or * means use system provided port. - --> - <ports>0</ports> - </outbound-ports> - - <interfaces enabled="true"> - <interface>${entity.listenAddress}</interface> - </interfaces> - - <join> - <multicast enabled="false" /> - - <tcp-ip enabled="true"> - [#list driver.hazelcastNodesList as member] - <member>${member}</member> - [/#list] - </tcp-ip> - - <aws enabled="false" /> - - </join> - - <ssl enabled="false"/> - <socket-interceptor enabled="false"/> - <symmetric-encryption enabled="false"/> - - </network> - <partition-group enabled="false"/> - - <map name="default"> - <in-memory-format>BINARY</in-memory-format> - <backup-count>1</backup-count> - <async-backup-count>0</async-backup-count> - <time-to-live-seconds>0</time-to-live-seconds> - <max-idle-seconds>0</max-idle-seconds> - <eviction-policy>NONE</eviction-policy> - <max-size policy="PER_NODE">0</max-size> - <eviction-percentage>25</eviction-percentage> - <min-eviction-check-millis>100</min-eviction-check-millis> - <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy> - </map> - - <serialization> - <portable-version>0</portable-version> - </serialization> - - <services enable-defaults="true"/> - -</hazelcast> http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/070b5ca7/sandbox/nosql/src/main/resources/org/apache/brooklyn/entity/nosql/hazelcast/hazelcast-brooklyn.xml ---------------------------------------------------------------------- diff --git a/sandbox/nosql/src/main/resources/org/apache/brooklyn/entity/nosql/hazelcast/hazelcast-brooklyn.xml b/sandbox/nosql/src/main/resources/org/apache/brooklyn/entity/nosql/hazelcast/hazelcast-brooklyn.xml new file mode 100644 index 0000000..459be4e --- /dev/null +++ b/sandbox/nosql/src/main/resources/org/apache/brooklyn/entity/nosql/hazelcast/hazelcast-brooklyn.xml @@ -0,0 +1,65 @@ +[#ftl] +<?xml version="1.0" encoding="UTF-8"?> + +<hazelcast xsi:schemaLocation="http://www.hazelcast.com/schema/config hazelcast-config-3.4.xsd" + xmlns="http://www.hazelcast.com/schema/config" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <group> + <name>${entity.groupName}</name> + <password>${entity.groupPassword}</password> + </group> + <management-center enabled="false">http://localhost:8080/mancenter</management-center> + <network> + <port auto-increment="true" port-count="100">${entity.nodePort?c}</port> + <outbound-ports> + <!-- + Allowed port range when connecting to other nodes. + 0 or * means use system provided port. + --> + <ports>0</ports> + </outbound-ports> + + <interfaces enabled="true"> + <interface>${entity.listenAddress}</interface> + </interfaces> + + <join> + <multicast enabled="false" /> + + <tcp-ip enabled="true"> + [#list driver.hazelcastNodesList as member] + <member>${member}</member> + [/#list] + </tcp-ip> + + <aws enabled="false" /> + + </join> + + <ssl enabled="false"/> + <socket-interceptor enabled="false"/> + <symmetric-encryption enabled="false"/> + + </network> + <partition-group enabled="false"/> + + <map name="default"> + <in-memory-format>BINARY</in-memory-format> + <backup-count>1</backup-count> + <async-backup-count>0</async-backup-count> + <time-to-live-seconds>0</time-to-live-seconds> + <max-idle-seconds>0</max-idle-seconds> + <eviction-policy>NONE</eviction-policy> + <max-size policy="PER_NODE">0</max-size> + <eviction-percentage>25</eviction-percentage> + <min-eviction-check-millis>100</min-eviction-check-millis> + <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy> + </map> + + <serialization> + <portable-version>0</portable-version> + </serialization> + + <services enable-defaults="true"/> + +</hazelcast> http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/070b5ca7/sandbox/nosql/src/test/java/brooklyn/entity/nosql/hazelcast/HazelcastClusterEc2LiveTest.java ---------------------------------------------------------------------- diff --git a/sandbox/nosql/src/test/java/brooklyn/entity/nosql/hazelcast/HazelcastClusterEc2LiveTest.java b/sandbox/nosql/src/test/java/brooklyn/entity/nosql/hazelcast/HazelcastClusterEc2LiveTest.java deleted file mode 100644 index bce319c..0000000 --- a/sandbox/nosql/src/test/java/brooklyn/entity/nosql/hazelcast/HazelcastClusterEc2LiveTest.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF 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 brooklyn.entity.nosql.hazelcast; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.annotations.Test; - -import brooklyn.entity.AbstractEc2LiveTest; -import brooklyn.entity.basic.Attributes; -import brooklyn.entity.proxying.EntitySpec; -import brooklyn.location.Location; -import brooklyn.test.EntityTestUtils; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; - -public class HazelcastClusterEc2LiveTest extends AbstractEc2LiveTest { - @SuppressWarnings("unused") - private static final Logger LOG = LoggerFactory.getLogger(HazelcastClusterEc2LiveTest.class); - - @Override - protected void doTest(Location loc) throws Exception { - HazelcastCluster cluster = app.createAndManageChild(EntitySpec.create(HazelcastCluster.class) - .configure(HazelcastCluster.INITIAL_SIZE, 3) - .configure(HazelcastCluster.MEMBER_SPEC, EntitySpec.create(HazelcastNode.class))); - app.start(ImmutableList.of(loc)); - - EntityTestUtils.assertAttributeEqualsEventually(cluster, HazelcastNode.SERVICE_UP, true); - - HazelcastNode first = (HazelcastNode) Iterables.get(cluster.getMembers(), 0); - HazelcastNode second = (HazelcastNode) Iterables.get(cluster.getMembers(), 1); - - assertNodesUpAndInCluster(first, second); - - EntityTestUtils.assertAttributeEqualsEventually(cluster, Attributes.SERVICE_UP, true); - } - - private void assertNodesUpAndInCluster(final HazelcastNode... nodes) { - for (final HazelcastNode node : nodes) { - EntityTestUtils.assertAttributeEqualsEventually(node, HazelcastNode.SERVICE_UP, true); - } - } - - @Test(enabled = false) - public void testDummy() { - } // Convince TestNG IDE integration that this really does have test methods - - - @Test(groups = {"Live", "Live-sanity"}) - @Override - public void test_CentOS_6_3() throws Exception { - super.test_CentOS_6_3(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/070b5ca7/sandbox/nosql/src/test/java/brooklyn/entity/nosql/hazelcast/HazelcastClusterSoftlayerLiveTest.java ---------------------------------------------------------------------- diff --git a/sandbox/nosql/src/test/java/brooklyn/entity/nosql/hazelcast/HazelcastClusterSoftlayerLiveTest.java b/sandbox/nosql/src/test/java/brooklyn/entity/nosql/hazelcast/HazelcastClusterSoftlayerLiveTest.java deleted file mode 100644 index 4ff4ab9..0000000 --- a/sandbox/nosql/src/test/java/brooklyn/entity/nosql/hazelcast/HazelcastClusterSoftlayerLiveTest.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF 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 brooklyn.entity.nosql.hazelcast; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.annotations.Test; - -import brooklyn.entity.AbstractSoftlayerLiveTest; -import brooklyn.entity.basic.Attributes; -import brooklyn.entity.proxying.EntitySpec; -import brooklyn.location.Location; -import brooklyn.test.EntityTestUtils; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; - -public class HazelcastClusterSoftlayerLiveTest extends AbstractSoftlayerLiveTest { - @SuppressWarnings("unused") - private static final Logger LOG = LoggerFactory.getLogger(HazelcastClusterSoftlayerLiveTest.class); - - @Override - protected void doTest(Location loc) throws Exception { - HazelcastCluster cluster = app.createAndManageChild(EntitySpec.create(HazelcastCluster.class) - .configure(HazelcastCluster.INITIAL_SIZE, 3) - .configure(HazelcastCluster.MEMBER_SPEC, EntitySpec.create(HazelcastNode.class))); - app.start(ImmutableList.of(loc)); - - EntityTestUtils.assertAttributeEqualsEventually(cluster, HazelcastNode.SERVICE_UP, true); - - HazelcastNode first = (HazelcastNode) Iterables.get(cluster.getMembers(), 0); - HazelcastNode second = (HazelcastNode) Iterables.get(cluster.getMembers(), 1); - - assertNodesUpAndInCluster(first, second); - - EntityTestUtils.assertAttributeEqualsEventually(cluster, Attributes.SERVICE_UP, true); - } - - private void assertNodesUpAndInCluster(final HazelcastNode... nodes) { - for (final HazelcastNode node : nodes) { - EntityTestUtils.assertAttributeEqualsEventually(node, HazelcastNode.SERVICE_UP, true); - } - } - - @Test(enabled = false) - public void testDummy() { - } // Convince TestNG IDE integration that this really does have test methods - - - @Test(groups = {"Live", "Live-sanity"}) - @Override - public void test_Ubuntu_12_0_4() throws Exception { - super.test_Ubuntu_12_0_4(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/070b5ca7/sandbox/nosql/src/test/java/brooklyn/entity/nosql/infinispan/Infinispan5ServerIntegrationTest.groovy ---------------------------------------------------------------------- diff --git a/sandbox/nosql/src/test/java/brooklyn/entity/nosql/infinispan/Infinispan5ServerIntegrationTest.groovy b/sandbox/nosql/src/test/java/brooklyn/entity/nosql/infinispan/Infinispan5ServerIntegrationTest.groovy deleted file mode 100644 index 40eb546..0000000 --- a/sandbox/nosql/src/test/java/brooklyn/entity/nosql/infinispan/Infinispan5ServerIntegrationTest.groovy +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF 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 brooklyn.entity.nosql.infinispan - -import static brooklyn.test.TestUtils.* -import static java.util.concurrent.TimeUnit.* -import static org.testng.Assert.* - -import java.util.concurrent.TimeUnit - -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import org.testng.annotations.AfterMethod -import org.testng.annotations.BeforeMethod -import org.testng.annotations.Test - -import brooklyn.entity.Application -import brooklyn.entity.basic.Entities -import brooklyn.location.basic.LocalhostMachineProvisioningLocation -import brooklyn.test.entity.TestApplicationImpl -import brooklyn.util.internal.TimeExtras -import brooklyn.util.net.Networking -import brooklyn.util.repeat.Repeater - -class Infinispan5ServerIntegrationTest { - private static final Logger logger = LoggerFactory.getLogger(Infinispan5ServerIntegrationTest.class) - - static String DEFAULT_PROTOCOL = "memcached" - static int DEFAULT_PORT = 11219 - - static boolean portLeftOpen = false; - - static { TimeExtras.init() } - - @BeforeMethod(groups = [ "Integration" ]) - public void failIfPortInUse() { - if (isPortInUse(DEFAULT_PORT, 5000L)) { - portLeftOpen = true; - fail "someone is already listening on port $DEFAULT_PORT; tests assume that port $DEFAULT_PORT is free on localhost" - } - } - - @AfterMethod(groups = [ "Integration" ]) - public void ensureIsShutDown() { - Socket shutdownSocket = null; - SocketException gotException = null; - - boolean socketClosed = new Repeater("Checking Infinispan has shut down") - .repeat { - if (shutdownSocket) shutdownSocket.close(); - try { shutdownSocket = new Socket(Networking.localHost, DEFAULT_PORT); } - catch (SocketException e) { gotException = e; return; } - gotException = null - } - .every(100 * MILLISECONDS) - .until { gotException } - .limitIterationsTo(25) - .run(); - - if (socketClosed == false) { - logger.error "Infinispan did not shut down"; - throw new Exception("Infinispan did not shut down") - } - } - - public void ensureIsUp() { - Socket socket = new Socket(Networking.localHost, DEFAULT_PORT); - socket.close(); - } - - @Test(groups = [ "Integration", "WIP" ]) - public void testInfinispanStartsAndStops() { - Application app = new TestApplicationImpl(); - try { - final Infinispan5Server infini = new Infinispan5Server(parent:app) - infini.setConfig(Infinispan5Server.PORT.getConfigKey(), DEFAULT_PORT) - infini.start([ new LocalhostMachineProvisioningLocation(name:'london') ]) - - executeUntilSucceeds { - assertTrue infini.getAttribute(Infinispan5Server.SERVICE_UP) - } - } finally { - Entities.destroy(app); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/070b5ca7/sandbox/nosql/src/test/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastClusterEc2LiveTest.java ---------------------------------------------------------------------- diff --git a/sandbox/nosql/src/test/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastClusterEc2LiveTest.java b/sandbox/nosql/src/test/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastClusterEc2LiveTest.java new file mode 100644 index 0000000..552ad02 --- /dev/null +++ b/sandbox/nosql/src/test/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastClusterEc2LiveTest.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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.apache.brooklyn.entity.nosql.hazelcast; + +import org.apache.brooklyn.entity.nosql.hazelcast.HazelcastCluster; +import org.apache.brooklyn.entity.nosql.hazelcast.HazelcastNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.annotations.Test; + +import brooklyn.entity.AbstractEc2LiveTest; +import brooklyn.entity.basic.Attributes; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.Location; +import brooklyn.test.EntityTestUtils; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; + +public class HazelcastClusterEc2LiveTest extends AbstractEc2LiveTest { + @SuppressWarnings("unused") + private static final Logger LOG = LoggerFactory.getLogger(HazelcastClusterEc2LiveTest.class); + + @Override + protected void doTest(Location loc) throws Exception { + HazelcastCluster cluster = app.createAndManageChild(EntitySpec.create(HazelcastCluster.class) + .configure(HazelcastCluster.INITIAL_SIZE, 3) + .configure(HazelcastCluster.MEMBER_SPEC, EntitySpec.create(HazelcastNode.class))); + app.start(ImmutableList.of(loc)); + + EntityTestUtils.assertAttributeEqualsEventually(cluster, HazelcastNode.SERVICE_UP, true); + + HazelcastNode first = (HazelcastNode) Iterables.get(cluster.getMembers(), 0); + HazelcastNode second = (HazelcastNode) Iterables.get(cluster.getMembers(), 1); + + assertNodesUpAndInCluster(first, second); + + EntityTestUtils.assertAttributeEqualsEventually(cluster, Attributes.SERVICE_UP, true); + } + + private void assertNodesUpAndInCluster(final HazelcastNode... nodes) { + for (final HazelcastNode node : nodes) { + EntityTestUtils.assertAttributeEqualsEventually(node, HazelcastNode.SERVICE_UP, true); + } + } + + @Test(enabled = false) + public void testDummy() { + } // Convince TestNG IDE integration that this really does have test methods + + + @Test(groups = {"Live", "Live-sanity"}) + @Override + public void test_CentOS_6_3() throws Exception { + super.test_CentOS_6_3(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/070b5ca7/sandbox/nosql/src/test/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastClusterSoftlayerLiveTest.java ---------------------------------------------------------------------- diff --git a/sandbox/nosql/src/test/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastClusterSoftlayerLiveTest.java b/sandbox/nosql/src/test/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastClusterSoftlayerLiveTest.java new file mode 100644 index 0000000..03d95af --- /dev/null +++ b/sandbox/nosql/src/test/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastClusterSoftlayerLiveTest.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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.apache.brooklyn.entity.nosql.hazelcast; + +import org.apache.brooklyn.entity.nosql.hazelcast.HazelcastCluster; +import org.apache.brooklyn.entity.nosql.hazelcast.HazelcastNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.annotations.Test; + +import brooklyn.entity.AbstractSoftlayerLiveTest; +import brooklyn.entity.basic.Attributes; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.Location; +import brooklyn.test.EntityTestUtils; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; + +public class HazelcastClusterSoftlayerLiveTest extends AbstractSoftlayerLiveTest { + @SuppressWarnings("unused") + private static final Logger LOG = LoggerFactory.getLogger(HazelcastClusterSoftlayerLiveTest.class); + + @Override + protected void doTest(Location loc) throws Exception { + HazelcastCluster cluster = app.createAndManageChild(EntitySpec.create(HazelcastCluster.class) + .configure(HazelcastCluster.INITIAL_SIZE, 3) + .configure(HazelcastCluster.MEMBER_SPEC, EntitySpec.create(HazelcastNode.class))); + app.start(ImmutableList.of(loc)); + + EntityTestUtils.assertAttributeEqualsEventually(cluster, HazelcastNode.SERVICE_UP, true); + + HazelcastNode first = (HazelcastNode) Iterables.get(cluster.getMembers(), 0); + HazelcastNode second = (HazelcastNode) Iterables.get(cluster.getMembers(), 1); + + assertNodesUpAndInCluster(first, second); + + EntityTestUtils.assertAttributeEqualsEventually(cluster, Attributes.SERVICE_UP, true); + } + + private void assertNodesUpAndInCluster(final HazelcastNode... nodes) { + for (final HazelcastNode node : nodes) { + EntityTestUtils.assertAttributeEqualsEventually(node, HazelcastNode.SERVICE_UP, true); + } + } + + @Test(enabled = false) + public void testDummy() { + } // Convince TestNG IDE integration that this really does have test methods + + + @Test(groups = {"Live", "Live-sanity"}) + @Override + public void test_Ubuntu_12_0_4() throws Exception { + super.test_Ubuntu_12_0_4(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/070b5ca7/sandbox/nosql/src/test/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5ServerIntegrationTest.groovy ---------------------------------------------------------------------- diff --git a/sandbox/nosql/src/test/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5ServerIntegrationTest.groovy b/sandbox/nosql/src/test/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5ServerIntegrationTest.groovy new file mode 100644 index 0000000..b7d8d1a --- /dev/null +++ b/sandbox/nosql/src/test/java/org/apache/brooklyn/entity/nosql/infinispan/Infinispan5ServerIntegrationTest.groovy @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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.apache.brooklyn.entity.nosql.infinispan + +import static brooklyn.test.TestUtils.* +import static java.util.concurrent.TimeUnit.* +import static org.testng.Assert.* + +import java.util.concurrent.TimeUnit + +import org.apache.brooklyn.entity.nosql.infinispan.Infinispan5Server; +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.testng.annotations.AfterMethod +import org.testng.annotations.BeforeMethod +import org.testng.annotations.Test + +import brooklyn.entity.Application +import brooklyn.entity.basic.Entities +import brooklyn.location.basic.LocalhostMachineProvisioningLocation +import brooklyn.test.entity.TestApplicationImpl +import brooklyn.util.internal.TimeExtras +import brooklyn.util.net.Networking +import brooklyn.util.repeat.Repeater + +class Infinispan5ServerIntegrationTest { + private static final Logger logger = LoggerFactory.getLogger(Infinispan5ServerIntegrationTest.class) + + static String DEFAULT_PROTOCOL = "memcached" + static int DEFAULT_PORT = 11219 + + static boolean portLeftOpen = false; + + static { TimeExtras.init() } + + @BeforeMethod(groups = [ "Integration" ]) + public void failIfPortInUse() { + if (isPortInUse(DEFAULT_PORT, 5000L)) { + portLeftOpen = true; + fail "someone is already listening on port $DEFAULT_PORT; tests assume that port $DEFAULT_PORT is free on localhost" + } + } + + @AfterMethod(groups = [ "Integration" ]) + public void ensureIsShutDown() { + Socket shutdownSocket = null; + SocketException gotException = null; + + boolean socketClosed = new Repeater("Checking Infinispan has shut down") + .repeat { + if (shutdownSocket) shutdownSocket.close(); + try { shutdownSocket = new Socket(Networking.localHost, DEFAULT_PORT); } + catch (SocketException e) { gotException = e; return; } + gotException = null + } + .every(100 * MILLISECONDS) + .until { gotException } + .limitIterationsTo(25) + .run(); + + if (socketClosed == false) { + logger.error "Infinispan did not shut down"; + throw new Exception("Infinispan did not shut down") + } + } + + public void ensureIsUp() { + Socket socket = new Socket(Networking.localHost, DEFAULT_PORT); + socket.close(); + } + + @Test(groups = [ "Integration", "WIP" ]) + public void testInfinispanStartsAndStops() { + Application app = new TestApplicationImpl(); + try { + final Infinispan5Server infini = new Infinispan5Server(parent:app) + infini.setConfig(Infinispan5Server.PORT.getConfigKey(), DEFAULT_PORT) + infini.start([ new LocalhostMachineProvisioningLocation(name:'london') ]) + + executeUntilSucceeds { + assertTrue infini.getAttribute(Infinispan5Server.SERVICE_UP) + } + } finally { + Entities.destroy(app); + } + } +}
