Tidying up Redis entity code
- Convert RedisIntegrationTest to Java
- Update RedisStore to use FreeMarker template
- Use RedisSupport class to encapsulate API testing
- Use SshFeed to poll for uptime


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/e9cb1572
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/e9cb1572
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/e9cb1572

Branch: refs/heads/0.5.0
Commit: e9cb1572990ac3e678b3f953c1c26ad219af28b8
Parents: e4098ab
Author: Andrew Kennedy <[email protected]>
Authored: Mon Apr 22 14:40:19 2013 +0100
Committer: Andrew Kennedy <[email protected]>
Committed: Wed Apr 24 13:25:44 2013 +0100

----------------------------------------------------------------------
 .../entity/nosql/redis/RedisCluster.java        |   2 +-
 .../entity/nosql/redis/RedisClusterImpl.java    |  15 +--
 .../brooklyn/entity/nosql/redis/RedisSlave.java |  16 +++-
 .../entity/nosql/redis/RedisSlaveImpl.java      |  14 +--
 .../brooklyn/entity/nosql/redis/RedisStore.java |  25 ++---
 .../entity/nosql/redis/RedisStoreImpl.java      |  86 ++++++++---------
 .../entity/nosql/redis/RedisStoreSshDriver.java |   6 +-
 .../brooklyn/entity/nosql/redis/redis.conf      |  13 +++
 .../brooklyn/entity/nosql/redis/slave.conf      |  13 +++
 .../nosql/src/main/resources/redis-logo.png     | Bin 0 -> 34333 bytes
 .../entity/nosql/redis/RedisEc2LiveTest.java    |  22 ++---
 .../nosql/redis/RedisIntegrationTest.groovy     |  93 -------------------
 .../nosql/redis/RedisIntegrationTest.java       |  77 +++++++++++++++
 .../entity/nosql/redis/RedisSupport.java        |  41 ++++++++
 14 files changed, 227 insertions(+), 196 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java 
b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java
index 57b3682..0393926 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java
@@ -13,7 +13,7 @@ import brooklyn.entity.trait.Startable;
  *
  * TODO add sensors with aggregated Redis statistics from cluster
  */
-@Catalog(name="Redis Cluster", description="Redis is an open-source, 
networked, in-memory, key-value data store with optional durability", 
iconUrl="classpath:///redis-logo.jpeg")
+@Catalog(name="Redis Cluster", description="Redis is an open-source, 
networked, in-memory, key-value data store with optional durability", 
iconUrl="classpath:///redis-logo.png")
 @ImplementedBy(RedisClusterImpl.class)
 public interface RedisCluster extends Entity, Startable {
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
index 08d114a..6a5e6ff 100644
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
+++ 
b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
@@ -16,7 +16,7 @@ import brooklyn.util.MutableMap;
 import com.google.common.collect.Maps;
 
 public class RedisClusterImpl extends AbstractEntity implements RedisCluster {
-    Map redisProperties = Maps.newLinkedHashMap();
+
     RedisStore master;
     DynamicCluster slaves;
 
@@ -31,23 +31,18 @@ public class RedisClusterImpl extends AbstractEntity 
implements RedisCluster {
     }
     public RedisClusterImpl(Map properties, Entity parent) {
         super(properties, parent);
-
-        redisProperties.putAll(properties);
     }
 
     @Override
     public void start(Collection<? extends Location> locations) {
-        master = addChild(EntitySpecs.spec(RedisStore.class)
-                .configure(redisProperties));
+        master = addChild(EntitySpecs.spec(RedisStore.class));
         Entities.manage(master);
         master.start(locations);
-        redisProperties.put("master", master);
-        
+
         slaves = addChild(EntitySpecs.spec(DynamicCluster.class)
-                .configure(redisProperties)
-                .configure(DynamicCluster.FACTORY, new 
BasicConfigurableEntityFactory(RedisSlave.class)));
+                .configure(DynamicCluster.MEMBER_SPEC, 
EntitySpecs.spec(RedisSlave.class).configure(RedisSlave.MASTER, master)));
         slaves.start(locations);
-        
+
         setAttribute(Startable.SERVICE_UP, true);
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java 
b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java
index d433688..6b07c2b 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java
@@ -1,12 +1,24 @@
 package brooklyn.entity.nosql.redis;
 
+import brooklyn.config.ConfigKey;
 import brooklyn.entity.proxying.ImplementedBy;
+import brooklyn.event.basic.BasicConfigKey;
+import brooklyn.util.flags.SetFromFlag;
 
 /**
  * A {@link RedisStore} configured as a slave.
- *
- * The {@code master} property must be set to the master Redis store entity.
  */
 @ImplementedBy(RedisSlaveImpl.class)
 public interface RedisSlave extends RedisStore {
+
+    @SetFromFlag("master")
+    ConfigKey<RedisStore> MASTER = new 
BasicConfigKey<RedisStore>(RedisStore.class, "redis.master", "Redis master");
+
+    @SetFromFlag("redisConfigTemplateUrl")
+    ConfigKey<String> REDIS_CONFIG_TEMPLATE_URL = new BasicConfigKey<String>(
+            String.class, "redis.config.templateUrl", "Template file (in 
freemarker format) for the redis.conf config file", 
+            "classpath://brooklyn/entity/nosql/redis/slave.conf");
+
+    RedisStore getMaster();
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java 
b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
index 2ea0783..c0718b9 100644
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
+++ 
b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
@@ -9,11 +9,8 @@ import com.google.common.base.Preconditions;
 
 /**
  * A {@link RedisStore} configured as a slave.
- *
- * The {@code master} property must be set to the master Redis store entity.
  */
 public class RedisSlaveImpl extends RedisStoreImpl implements RedisSlave {
-    RedisStore master;
 
     public RedisSlaveImpl() {
         this(MutableMap.of(), null);
@@ -26,17 +23,10 @@ public class RedisSlaveImpl extends RedisStoreImpl 
implements RedisSlave {
     }
     public RedisSlaveImpl(Map properties, Entity parent) {
         super(properties, parent);
-
-        // TODO Use config key for "master"
-        Preconditions.checkArgument(properties.containsKey("master"), "The 
Redis master entity must be specified");
-        master = (RedisStore) properties.get("master");
     }
 
     @Override
-    public String getConfigData(int port, boolean include) {
-        String masterAddress = master.getAddress();
-        int masterPort = getParent().getAttribute(REDIS_PORT);
-
-        return super.getConfigData(port, include) + "slaveof "+masterAddress+" 
"+masterPort;
+    public RedisStore getMaster() {
+        return getConfig(MASTER);
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java 
b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
index a6ce441..492da2d 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
@@ -22,22 +22,23 @@ import brooklyn.util.flags.SetFromFlag;
 public interface RedisStore extends SoftwareProcess, DataStore {
 
     @SetFromFlag("version")
-    public static final BasicConfigKey<String> SUGGESTED_VERSION =
+    BasicConfigKey<String> SUGGESTED_VERSION =
             new BasicConfigKey<String>(SoftwareProcess.SUGGESTED_VERSION, 
"2.6.7");
 
     @SetFromFlag("downloadUrl")
-    public static final BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL 
= new BasicAttributeSensorAndConfigKey<String>(
+    BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new 
BasicAttributeSensorAndConfigKey<String>(
             SoftwareProcess.DOWNLOAD_URL, 
"http://redis.googlecode.com/files/redis-${version}.tar.gz";);
 
     @SetFromFlag("redisPort")
-    public static final PortAttributeSensorAndConfigKey REDIS_PORT = new 
PortAttributeSensorAndConfigKey("redis.port", "Redis port number", 6379);
-    
-    @SetFromFlag("configFile")
-    public static final ConfigKey<String> REDIS_CONFIG_FILE = new 
BasicConfigKey<String>(String.class, "redis.config.file", "Redis user 
configuration file");
-    
-    public static final AttributeSensor<Integer> UPTIME = new 
BasicAttributeSensor<Integer>(Integer.class, "redis.uptime", "Redis uptime in 
seconds");
-
-    public String getAddress();
-    
-    public String getConfigData(int port, boolean include);
+    PortAttributeSensorAndConfigKey REDIS_PORT = new 
PortAttributeSensorAndConfigKey("redis.port", "Redis port number", 6379);
+
+    @SetFromFlag("redisConfigTemplateUrl")
+    ConfigKey<String> REDIS_CONFIG_TEMPLATE_URL = new BasicConfigKey<String>(
+            String.class, "redis.config.templateUrl", "Template file (in 
freemarker format) for the redis.conf config file", 
+            "classpath://brooklyn/entity/nosql/redis/redis.conf");
+
+    AttributeSensor<Integer> UPTIME = new 
BasicAttributeSensor<Integer>(Integer.class, "redis.uptime", "Redis uptime in 
seconds");
+
+    String getAddress();
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java 
b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
index 5c454cd..bf6c171 100644
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
+++ 
b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
@@ -4,15 +4,27 @@ import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.util.Map;
 
+import javax.annotation.Nullable;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.SoftwareProcessImpl;
+import brooklyn.event.feed.ssh.SshFeed;
+import brooklyn.event.feed.ssh.SshPollConfig;
+import brooklyn.event.feed.ssh.SshValueFunctions;
 import brooklyn.location.MachineLocation;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.MutableMap;
 
+import com.google.common.base.Function;
+import com.google.common.base.Functions;
+import com.google.common.base.Optional;
+import com.google.common.base.Predicates;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+
 /**
  * An entity that represents a Redis key-value store service.
  *
@@ -21,6 +33,8 @@ import brooklyn.util.MutableMap;
 public class RedisStoreImpl extends SoftwareProcessImpl implements RedisStore {
     protected static final Logger LOG = 
LoggerFactory.getLogger(RedisStore.class);
 
+    private transient SshFeed sshFeed;
+
     public RedisStoreImpl() {
         this(MutableMap.of(), null);
     }
@@ -39,25 +53,37 @@ public class RedisStoreImpl extends SoftwareProcessImpl 
implements RedisStore {
         super.connectSensors();
 
         connectServiceUpIsRunning();
-        
-        // TODO IF desired, port this for setting UPTIME (because legacy 
sshAdapter is deleted)
-//        String output = 
sshAdapter.newOutputValueProvider("${driver.runDir}/bin/redis-cli 
info").compute()
-//        for (String line : output.split("\n")) {
-//            if (line =~ /^uptime_in_seconds:/) {
-//                String data = line.trim()
-//                int colon = data.indexOf(":")
-//                return Integer.parseInt(data.substring(colon + 1))
-//            }
-//        }
+
+        sshFeed = SshFeed.builder()
+                .entity(this)
+                .poll(new SshPollConfig<Integer>(UPTIME)
+                        .command(getDriver().getRunDir() + "/bin/redis-cli 
info")
+                        .onError(Functions.constant(-1))
+                        .onSuccess(Functions.compose(new Function<String, 
Integer>(){
+                            @Override
+                            public Integer apply(@Nullable String input) {
+                                Optional<String> line = 
Iterables.tryFind(Splitter.on('\n').split(input), 
Predicates.containsPattern("uptime_in_seconds:"));
+                                if (line.isPresent()) {
+                                    String data = line.get().trim();
+                                    int colon = data.indexOf(":");
+                                    return 
Integer.parseInt(data.substring(colon + 1));
+                                } else {
+                                    throw new IllegalStateException();
+                                }
+                            }
+                        }, SshValueFunctions.stdout())))
+                .build();
     }
 
     @Override
     public void disconnectSensors() {
         super.disconnectSensors();
         disconnectServiceUpIsRunning();
+        if (sshFeed != null && sshFeed.isActivated()) sshFeed.stop();
     }
-    
-    public Class getDriverInterface() {
+
+    @Override
+    public Class<?> getDriverInterface() {
         return RedisStoreDriver.class;
     }
 
@@ -65,45 +91,11 @@ public class RedisStoreImpl extends SoftwareProcessImpl 
implements RedisStore {
     public RedisStoreDriver getDriver() {
         return (RedisStoreDriver) super.getDriver();
     }
-    
+
     @Override
     public String getAddress() {
         MachineLocation machine = getMachineOrNull();
         return (machine != null) ? machine.getAddress().getHostAddress() : 
null;
     }
-    
-    
-    // FIXME Don't want to hard-code this as SshMachineLocatoin; want generic 
way of doing machine.copyTo
-    @Override
-    protected SshMachineLocation getMachineOrNull() {
-        return (SshMachineLocation) super.getMachineOrNull();
-    }
-    
-    // FIXME This logic should all be in the driver
-    void doExtraConfigurationDuringStart() {
-           int port = getAttribute(REDIS_PORT);
-        boolean include = false;
-
-        String includeName = getConfig(REDIS_CONFIG_FILE);
-        if (includeName != null && includeName.length() > 0) {
-            File includeFile = new File(includeName);
-               include = includeFile.exists();
-        }
-
-               getMachineOrNull().copyTo(new 
ByteArrayInputStream(getConfigData(port, include).getBytes()), 
getDriver().getRunDir()+"/redis.conf");
-        if (include) getMachineOrNull().copyTo(new File(includeName), 
getDriver().getRunDir()+"/include.conf");
-        
-        super.configure();
-    }
 
-    @Override
-    public String getConfigData(int port, boolean include) {
-        String data = 
-                "daemonize yes"+"\n"+
-                "pidfile "+getDriver().getRunDir()+"/pid.txt"+"\n"+
-                "port "+port+"\n";
-
-        if (include) data += "include 
"+getDriver().getRunDir()+"/include.conf";
-        return data;
-    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
index 8b8e8ae..7cbe3c7 100644
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
+++ 
b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
@@ -68,10 +68,10 @@ public class RedisStoreSshDriver extends 
AbstractSoftwareProcessSshDriver implem
                         format("cd %s", getExpandedInstallDir()),
                         "make install PREFIX="+getRunDir())
                 .execute();
-        
-        getEntity().doExtraConfigurationDuringStart();
+
+        
copyTemplate(getEntity().getConfig(RedisStore.REDIS_CONFIG_TEMPLATE_URL), 
"redis.conf");
     }
-    
+
     @Override
     public void launch() {
         // TODO Should we redirect stdout/stderr: format(" >> %s/console 2>&1 
</dev/null &", getRunDir())

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/redis.conf
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/redis.conf 
b/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/redis.conf
new file mode 100644
index 0000000..b2dd5cb
--- /dev/null
+++ b/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/redis.conf
@@ -0,0 +1,13 @@
+# Redis configuration file
+
+# Start as daemon
+daemonize yes
+pidfile ${driver.runDir}/pid.txt
+
+# Set port and optional bind address
+port ${entity.port}
+# bind ${driver.machine.address}
+
+# Configure logging
+loglevel verbose
+logfile ${driver.runDir}/redis.log

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/slave.conf
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/slave.conf 
b/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/slave.conf
new file mode 100644
index 0000000..b2dd5cb
--- /dev/null
+++ b/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/slave.conf
@@ -0,0 +1,13 @@
+# Redis configuration file
+
+# Start as daemon
+daemonize yes
+pidfile ${driver.runDir}/pid.txt
+
+# Set port and optional bind address
+port ${entity.port}
+# bind ${driver.machine.address}
+
+# Configure logging
+loglevel verbose
+logfile ${driver.runDir}/redis.log

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/resources/redis-logo.png
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/resources/redis-logo.png 
b/software/nosql/src/main/resources/redis-logo.png
new file mode 100644
index 0000000..4ad2561
Binary files /dev/null and b/software/nosql/src/main/resources/redis-logo.png 
differ

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
 
b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
index d49fee5..eb49ac9 100644
--- 
a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
+++ 
b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
@@ -1,12 +1,9 @@
 package brooklyn.entity.nosql.redis;
 
-import static org.testng.Assert.assertTrue;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.annotations.Test;
 
-import redis.clients.jedis.Connection;
 import brooklyn.entity.AbstractEc2LiveTest;
 import brooklyn.entity.proxying.EntitySpecs;
 import brooklyn.location.Location;
@@ -28,25 +25,18 @@ public class RedisEc2LiveTest extends AbstractEc2LiveTest {
 
     @Override
     protected void doTest(Location loc) throws Exception {
-        // Start Redis
         RedisStore redis = 
app.createAndManageChild(EntitySpecs.spec(RedisStore.class));
         app.start(ImmutableList.of(loc));
         EntityTestUtils.assertAttributeEqualsEventually(redis, 
RedisStore.SERVICE_UP, true);
 
-        // Access Redis
-        Connection connection = getRedisConnection(redis);
-        assertTrue(connection.isConnected());
-        connection.disconnect();
+        RedisSupport support = new RedisSupport(redis);
+        try {
+            support.redisTest();
+        } finally {
+            redis.stop();
+        }
     }
 
-    private Connection getRedisConnection(RedisStore redis) {
-        String hostname = redis.getAttribute(RedisStore.HOSTNAME);
-        int port = redis.getAttribute(RedisStore.REDIS_PORT);
-        Connection connection = new Connection(hostname, port);
-        connection.connect();
-        return connection;
-    }
-    
     @Test(enabled=false)
     public void testDummy() {} // Convince testng IDE integration that this 
really does have test methods  
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.groovy
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.groovy
 
b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.groovy
deleted file mode 100644
index 44d9e0e..0000000
--- 
a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.groovy
+++ /dev/null
@@ -1,93 +0,0 @@
-package brooklyn.entity.nosql.redis;
-
-import static brooklyn.test.TestUtils.*
-import static org.testng.Assert.*
-
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-import org.testng.annotations.AfterMethod
-import org.testng.annotations.BeforeMethod
-import org.testng.annotations.Test
-
-import redis.clients.jedis.Connection
-import brooklyn.entity.basic.ApplicationBuilder
-import brooklyn.entity.basic.Entities
-import brooklyn.entity.proxying.EntitySpecs
-import brooklyn.entity.trait.Startable
-import brooklyn.location.Location
-import brooklyn.location.basic.LocalhostMachineProvisioningLocation
-import brooklyn.test.entity.TestApplication
-import brooklyn.util.internal.TimeExtras
-
-/**
- * Test the operation of the {@link RedisStore} class.
- *
- * TODO clarify test purpose
- */
-public class RedisIntegrationTest {
-    private static final Logger log = 
LoggerFactory.getLogger(RedisIntegrationTest.class)
-
-    static { TimeExtras.init() }
-
-    private TestApplication app
-    private Location testLocation
-    private RedisStore redis
-
-    @BeforeMethod(alwaysRun=true)
-    public void setup() {
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
-        testLocation = new LocalhostMachineProvisioningLocation(name:'london')
-    }
-
-    @AfterMethod(alwaysRun=true)
-    public void shutdown() {
-        if (app != null) Entities.destroyAll(app);
-    }
-
-    /**
-     * Test that the server starts up and sets SERVICE_UP correctly.
-     */
-    // FIXME Marked as WIP because failing in jenkins; environmental 
differences?
-    @Test(groups = ["Integration"])
-    public void canStartupAndShutdown() {
-        redis = app.createAndManageChild(EntitySpecs.spec(RedisStore.class));
-        app.start([ testLocation ])
-        executeUntilSucceeds() {
-            assertTrue redis.getAttribute(Startable.SERVICE_UP)
-        }
-        
-        redis.stop()
-        assertFalse redis.getAttribute(Startable.SERVICE_UP)
-    }
-
-    /**
-     * Test that a client can connect to the service.
-     */
-    // FIXME Marked as WIP because failing in jenkins; environmental 
differences?
-    @Test(groups = ["Integration"])
-    public void testRedisConnection() {
-        // Start Redis
-        redis = app.createAndManageChild(EntitySpecs.spec(RedisStore.class));
-        app.start([ testLocation ])
-        executeUntilSucceeds {
-            assertTrue redis.getAttribute(Startable.SERVICE_UP)
-        }
-
-        try {
-            // Access Redis
-            Connection connection = getRedisConnection(redis)
-            assertTrue connection.isConnected()
-            connection.disconnect()
-        } finally {
-            // Stop broker
-               redis.stop()
-        }
-    }
-
-    private Connection getRedisConnection(RedisStore redis) {
-        int port = redis.getAttribute(RedisStore.REDIS_PORT)
-        Connection connection = new Connection("localhost", port)
-        connection.connect()
-        return connection
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.java
 
b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.java
new file mode 100644
index 0000000..1ddfa92
--- /dev/null
+++ 
b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.java
@@ -0,0 +1,77 @@
+package brooklyn.entity.nosql.redis;
+
+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.basic.ApplicationBuilder;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.proxying.EntitySpecs;
+import brooklyn.entity.trait.Startable;
+import brooklyn.location.Location;
+import brooklyn.location.basic.LocalhostMachineProvisioningLocation;
+import brooklyn.test.EntityTestUtils;
+import brooklyn.test.entity.TestApplication;
+import brooklyn.util.MutableMap;
+import brooklyn.util.internal.TimeExtras;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Test the operation of the {@link RedisStore} class.
+ */
+public class RedisIntegrationTest {
+
+    static { TimeExtras.init(); }
+
+    private TestApplication app;
+    private Location testLocation;
+    private RedisStore redis;
+
+    @BeforeMethod(alwaysRun=true)
+    public void setup() {
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        testLocation = new 
LocalhostMachineProvisioningLocation(MutableMap.of("name", "london"));
+    }
+
+    @AfterMethod(alwaysRun=true)
+    public void shutdown() {
+        if (app != null) Entities.destroyAll(app);
+    }
+
+    /**
+     * Test that the server starts up and sets SERVICE_UP correctly.
+     */
+    @Test(groups = { "Integration" })
+    public void canStartupAndShutdown() throws Exception {
+        redis = app.createAndManageChild(EntitySpecs.spec(RedisStore.class));
+        app.start(ImmutableList.of(testLocation));
+
+        EntityTestUtils.assertAttributeEqualsEventually(redis, 
Startable.SERVICE_UP, true);
+
+        redis.stop();
+
+        EntityTestUtils.assertAttributeEqualsEventually(redis, 
Startable.SERVICE_UP, false);
+    }
+
+    /**
+     * Test that a client can connect to the service.
+     */
+    @Test(groups = { "Integration" })
+    public void testRedisConnection() throws Exception {
+        redis = app.createAndManageChild(EntitySpecs.spec(RedisStore.class));
+        app.start(ImmutableList.of(testLocation));
+
+        EntityTestUtils.assertAttributeEqualsEventually(redis, 
Startable.SERVICE_UP, true);
+
+        RedisSupport support = new RedisSupport(redis);
+        try {
+            support.redisTest();
+        } finally {
+            redis.stop();
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisSupport.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisSupport.java 
b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisSupport.java
new file mode 100644
index 0000000..f617922
--- /dev/null
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisSupport.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012-2013 by Cloudsoft Corp.
+ */
+package brooklyn.entity.nosql.redis;
+
+import static org.testng.Assert.assertTrue;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import redis.clients.jedis.Connection;
+
+/**
+ * {@link RedisStore} testing using Redis API.
+ */
+public class RedisSupport {
+    private static final Logger log = 
LoggerFactory.getLogger(RedisSupport.class);
+
+    private RedisStore redis;
+
+    public RedisSupport(RedisStore redis) {
+        this.redis = redis;
+    }
+
+    /**
+     * Exercise the {@link RedisStore} using the Redis API.
+     */
+    public void redisTest() throws Exception {
+        // Access Redis
+        Connection connection = getRedisConnection(redis);
+        assertTrue(connection.isConnected());
+        connection.disconnect();
+    }
+
+    private Connection getRedisConnection(RedisStore redis) {
+        int port = redis.getAttribute(RedisStore.REDIS_PORT);
+        Connection connection = new Connection("localhost", port);
+        connection.connect();
+        return connection;
+    }
+}

Reply via email to