This closes #94
Add entity/config test via REST using redis as an example
diff --git a/qa/pom.xml b/qa/pom.xml
index cbef5e6..f79e530 100644
--- a/qa/pom.xml
+++ b/qa/pom.xml
@@ -55,6 +55,19 @@
<version>${project.version}</version>
</dependency>
<dependency>
+ <groupId>org.apache.brooklyn</groupId>
+ <artifactId>brooklyn-rest-server</artifactId>
+ <version>${project.version}</version>
+ <classifier>tests</classifier>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.brooklyn</groupId>
+ <artifactId>brooklyn-software-nosql</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>net.sf.jopt-simple</groupId>
<artifactId>jopt-simple</artifactId>
</dependency>
diff --git a/qa/src/test/java/org/apache/brooklyn/qa/nosql/RedisClusterViaRestIntegrationTest.java b/qa/src/test/java/org/apache/brooklyn/qa/nosql/RedisClusterViaRestIntegrationTest.java
new file mode 100644
index 0000000..6b75bde
--- /dev/null
+++ b/qa/src/test/java/org/apache/brooklyn/qa/nosql/RedisClusterViaRestIntegrationTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.qa.nosql;
+
+import static org.apache.brooklyn.test.Asserts.assertTrue;
+import static org.testng.Assert.assertNotNull;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
+
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.mgmt.Task;
+import org.apache.brooklyn.core.entity.Attributes;
+import org.apache.brooklyn.core.entity.Entities;
+import org.apache.brooklyn.core.entity.EntityAsserts;
+import org.apache.brooklyn.entity.brooklynnode.BrooklynNode;
+import org.apache.brooklyn.entity.nosql.redis.RedisCluster;
+import org.apache.brooklyn.entity.nosql.redis.RedisStore;
+import org.apache.brooklyn.entity.software.base.SoftwareProcess;
+import org.apache.brooklyn.rest.BrooklynRestApiLauncherTestFixture;
+import org.apache.brooklyn.util.http.HttpAsserts;
+import org.apache.brooklyn.util.http.HttpToolResponse;
+import org.apache.brooklyn.util.text.Strings;
+import org.apache.brooklyn.util.time.Duration;
+import org.apache.brooklyn.util.yaml.Yamls;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+public class RedisClusterViaRestIntegrationTest extends BrooklynRestApiLauncherTestFixture {
+
+ @BeforeMethod(alwaysRun=true)
+ public void setUp() throws Exception {
+ useServerForTest(newServer());
+ }
+
+ /** REST seems to show up a different behaviour in context entity used when adding children entities,
+ * causing different config to be set, so we test that, using Redis as a comparatively simple example. */
+ @Test(groups = "Integration")
+ public void testDeployRedisCluster() throws InterruptedException, ExecutionException, TimeoutException {
+ final URI webConsoleUri = URI.create(getBaseUriRest());
+
+ // Test setup
+ final EntitySpec<BrooklynNode> spec = EntitySpec.create(BrooklynNode.class);
+ final ManagementContext mgmt = getManagementContextFromJettyServerAttributes(server);
+ final BrooklynNode node = mgmt.getEntityManager().createEntity(spec);
+ node.sensors().set(BrooklynNode.WEB_CONSOLE_URI, webConsoleUri);
+
+ // Deploy it.
+ final String blueprint = "location: localhost\n" +
+ "services:\n" +
+ "- type: org.apache.brooklyn.entity.nosql.redis.RedisCluster";
+ HttpToolResponse response = node.http().post(
+ "/applications",
+ ImmutableMap.of("Content-Type", "text/yaml"),
+ blueprint.getBytes());
+ HttpAsserts.assertHealthyStatusCode(response.getResponseCode());
+
+ // Assert application is eventually running and not on fire.
+ final Entity entity = mgmt.getApplications().iterator().next().getChildren().iterator().next();
+ assertTrue(entity instanceof RedisCluster,
+ "expected " + RedisCluster.class.getName() + ", found: " + entity);
+ RedisCluster cluster = RedisCluster.class.cast(entity);
+ Entities.dumpInfo(cluster);
+ assertDownloadUrl(cluster.getMaster());
+ for (Entity slave : cluster.getSlaves().getMembers()) {
+ assertDownloadUrl(slave);
+ }
+
+ @SuppressWarnings("unchecked")
+ String taskId = Strings.toString( ((Map<String,Object>) Yamls.parseAll(response.getContentAsString()).iterator().next()).get("id") );
+ Task<?> task = mgmt.getExecutionManager().getTask(taskId);
+ Assert.assertNotNull(task);
+
+ task.get(Duration.minutes(20));
+
+ Entities.dumpInfo(cluster);
+
+ EntityAsserts.assertAttributeEquals(entity, SoftwareProcess.SERVICE_UP, true);
+ }
+
+ private void assertDownloadUrl(Entity entity) {
+ assertNotNull(entity.config().get(RedisStore.DOWNLOAD_URL), "RedisStore.DOWNLOAD_URL");
+ assertNotNull(entity.config().get(SoftwareProcess.DOWNLOAD_URL), "SoftwareProcess.DOWNLOAD_URL");
+ assertNotNull(entity.config().get(Attributes.DOWNLOAD_URL), "Attributes.DOWNLOAD_URL");
+ }
+
+}
\ No newline at end of file