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; + } +}
