You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2015/09/17 12:30:58 UTC

[1/5] incubator-brooklyn git commit: Fix Cassandra node in private network

Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master b3ce25696 -> b118c1194


Fix Cassandra node in private network

- Improve how service-up is set.
- Ensure that mapped ip:port is used (so goes through NAT etc,
  where necessary).

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

Branch: refs/heads/master
Commit: bc5c9e4e1fbbfc25d4836e72c6d87e1cb444069d
Parents: 7ca2781
Author: Aled Sage <al...@gmail.com>
Authored: Tue Sep 15 09:13:23 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Sep 15 09:13:23 2015 +0100

----------------------------------------------------------------------
 .../nosql/cassandra/CassandraNodeImpl.java      | 72 +++++++++++++-------
 1 file changed, 47 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/bc5c9e4e/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
index b753df6..578fa6b 100644
--- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
+++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
@@ -40,9 +40,11 @@ import org.apache.brooklyn.core.effector.EffectorBody;
 import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.location.Machines;
+import org.apache.brooklyn.core.location.access.BrooklynAccessUtils;
 import org.apache.brooklyn.core.location.cloud.CloudLocationConfig;
 import org.apache.brooklyn.core.sensor.DependentConfiguration;
 import org.apache.brooklyn.core.sensor.Sensors;
+import org.apache.brooklyn.enricher.stock.Enrichers;
 import org.apache.brooklyn.entity.java.JavaAppUtils;
 import org.apache.brooklyn.entity.software.base.SoftwareProcessImpl;
 import org.apache.brooklyn.feed.function.FunctionFeed;
@@ -59,6 +61,7 @@ import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.text.TemplateProcessor;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.guava.Functionals;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
@@ -76,6 +79,7 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
+import com.google.common.net.HostAndPort;
 
 /**
  * Implementation of {@link CassandraNode}.
@@ -527,34 +531,14 @@ public class CassandraNodeImpl extends SoftwareProcessImpl implements CassandraN
                 .entity(this)
                 .period(3000, TimeUnit.MILLISECONDS)
                 .poll(new FunctionPollConfig<Long, Long>(THRIFT_PORT_LATENCY)
-                        .onException(Functions.constant((Long)null))
-                        .callable(new Callable<Long>() {
-                            public Long call() {
-                                try {
-                                    long start = System.currentTimeMillis();
-                                    Socket s = new Socket(getAttribute(Attributes.HOSTNAME), getThriftPort());
-                                    s.close();
-                                    long latency = System.currentTimeMillis() - start;
-                                    computeServiceUp();
-                                    return latency;
-                                } catch (Exception e) {
-                                    if (log.isDebugEnabled())
-                                        log.debug("Cassandra thrift port poll failure: "+e);
-                                    setAttribute(SERVICE_UP, false);
-                                    return null;
-                                }
-                            }
-                            public void computeServiceUp() {
-                                // this will wait an additional poll period after thrift port is up,
-                                // as the caller will not have set yet, but that will help ensure it is really healthy!
-                                setAttribute(SERVICE_UP,
-                                        getAttribute(THRIFT_PORT_LATENCY)!=null && getAttribute(THRIFT_PORT_LATENCY)>=0 && 
-                                        Boolean.TRUE.equals(getAttribute(SERVICE_UP_JMX)));
-                            }})
+                        .onException(Functions.constant(-1L))
+                        .callable(new ThriftLatencyChecker(CassandraNodeImpl.this))
                         .enabled(retrieveUsageMetrics))
                 .build();
         
         jmxMxBeanFeed = JavaAppUtils.connectMXBeanSensors(this);
+        
+        connectServiceUpIsRunning();
     }
     
     protected void connectEnrichers() {
@@ -575,12 +559,24 @@ public class CassandraNodeImpl extends SoftwareProcessImpl implements CassandraN
             addEnricher(new RollingTimeWindowMeanEnricher<Double>(this, WRITES_PER_SECOND_LAST, 
                     WRITES_PER_SECOND_IN_WINDOW, windowPeriod));
         }
+        
+        // service-up checks
+        addEnricher(Enrichers.builder().updatingMap(Attributes.SERVICE_NOT_UP_INDICATORS)
+                .from(THRIFT_PORT_LATENCY)
+                .computing(Functionals.ifEquals(-1L).value("Thrift latency polling failed") )
+                .build());
+        
+        addEnricher(Enrichers.builder().updatingMap(Attributes.SERVICE_NOT_UP_INDICATORS)
+                .from(SERVICE_UP_JMX)
+                .computing(Functionals.ifEquals(false).value("JMX reports not up") )
+                .build());
     }
     
     @Override
     public void disconnectSensors() {
         super.disconnectSensors();
-
+        
+        disconnectServiceUpIsRunning();
         if (jmxFeed != null) jmxFeed.stop();
         if (jmxMxBeanFeed != null) jmxMxBeanFeed.stop();
         if (jmxHelper != null) jmxHelper.terminate();
@@ -603,4 +599,30 @@ public class CassandraNodeImpl extends SoftwareProcessImpl implements CassandraN
         return getDriver().executeScriptAsync(commands).block().getStdout();
     }
     
+    private static class ThriftLatencyChecker implements Callable<Long> {
+        private final CassandraNode entity;
+        
+        public ThriftLatencyChecker(CassandraNode entity) {
+            this.entity = entity;
+        }
+        public Long call() {
+            Integer privatePort = entity.getThriftPort();
+            if (privatePort == null) return -1L;
+            
+            HostAndPort hp = BrooklynAccessUtils.getBrooklynAccessibleAddress(entity, privatePort);
+
+            try {
+                long start = System.currentTimeMillis();
+                Socket s = new Socket(hp.getHostText(), hp.getPort());
+                s.close();
+                long latency = System.currentTimeMillis() - start;
+                return latency;
+            } catch (Exception e) {
+                Exceptions.propagateIfFatal(e);
+                if (log.isDebugEnabled())
+                    log.debug("Cassandra thrift port poll failure: "+e);
+                return -1L;
+            }
+        }
+    }
 }


[2/5] incubator-brooklyn git commit: Cassandra: effector impl not anonymous inner class

Posted by al...@apache.org.
Cassandra: effector impl not anonymous inner class

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

Branch: refs/heads/master
Commit: a5c4b166ca6638ad8035e52d2d41e12ba9a205cd
Parents: bc5c9e4
Author: Aled Sage <al...@gmail.com>
Authored: Tue Sep 15 09:20:33 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Sep 15 09:20:33 2015 +0100

----------------------------------------------------------------------
 .../nosql/cassandra/CassandraNodeImpl.java      | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a5c4b166/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
index 578fa6b..dddc1cd 100644
--- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
+++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
@@ -97,12 +97,15 @@ public class CassandraNodeImpl extends SoftwareProcessImpl implements CassandraN
     public void init() {
         super.init();
         
-        getMutableEntityType().addEffector(EXECUTE_SCRIPT, new EffectorBody<String>() {
+        // TODO PERSISTENCE WORKAROUND kept anonymous class in case referenced in persisted state
+        new EffectorBody<String>() {
             @Override
             public String call(ConfigBag parameters) {
                 return executeScript((String)parameters.getStringKey("commands"));
             }
-        });
+        };
+        
+        getMutableEntityType().addEffector(EXECUTE_SCRIPT, new ExecuteScriptEffectorBody(this));
         
         Entities.checkRequiredUrl(this, getCassandraConfigTemplateUrl());
         Entities.getRequiredUrlConfig(this, CASSANDRA_RACKDC_CONFIG_TEMPLATE_URL);
@@ -110,6 +113,18 @@ public class CassandraNodeImpl extends SoftwareProcessImpl implements CassandraN
         connectEnrichers();
     }
     
+    private static class ExecuteScriptEffectorBody extends EffectorBody<String> {
+        private final CassandraNode entity;
+        
+        public ExecuteScriptEffectorBody(CassandraNode entity) {
+            this.entity = entity;
+        }
+        @Override
+        public String call(ConfigBag parameters) {
+            return entity.executeScript((String)parameters.getStringKey("commands"));
+        }
+    }
+    
     /**
      * Some clouds (e.g. Rackspace) give us VMs that have two nics: one for private and one for public.
      * If the private IP is used then it doesn't work, even for a cluster purely internal to Rackspace!
@@ -246,6 +261,7 @@ public class CassandraNodeImpl extends SoftwareProcessImpl implements CassandraN
         String subnetAddress = getAttribute(CassandraNode.SUBNET_ADDRESS);
         return Strings.isNonBlank(subnetAddress) ? subnetAddress : getAttribute(CassandraNode.ADDRESS);
     }
+    
     @Override public String getBroadcastAddress() {
         String sensorName = getConfig(BROADCAST_ADDRESS_SENSOR);
         if (Strings.isNonBlank(sensorName))


[4/5] incubator-brooklyn git commit: Delete deprecated CassandraNode.TOCKEN

Posted by al...@apache.org.
Delete deprecated CassandraNode.TOCKEN


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

Branch: refs/heads/master
Commit: 623ee83ec125f2bfbbd82cafe7f88d2124008a5c
Parents: 5385f34
Author: Aled Sage <al...@gmail.com>
Authored: Tue Sep 15 10:22:47 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Sep 15 11:21:54 2015 +0100

----------------------------------------------------------------------
 .../cassandra/CassandraDatacenterImpl.java      | 13 +++--
 .../entity/nosql/cassandra/CassandraNode.java   | 26 ++--------
 .../nosql/cassandra/CassandraNodeImpl.java      | 51 +-------------------
 .../CassandraDatacenterIntegrationTest.java     |  4 +-
 .../cassandra/CassandraDatacenterLiveTest.java  | 15 +++---
 ...assandraDatacenterRebindIntegrationTest.java |  7 +--
 .../cassandra/CassandraDatacenterTest.java      | 20 +++-----
 .../cassandra/CassandraNodeIntegrationTest.java |  1 -
 8 files changed, 37 insertions(+), 100 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/623ee83e/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterImpl.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterImpl.java
index 3678bb2..e17d530 100644
--- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterImpl.java
+++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterImpl.java
@@ -303,16 +303,21 @@ public class CassandraDatacenterImpl extends DynamicClusterImpl implements Cassa
         return super.grow(delta);
     }
     
-    @SuppressWarnings("deprecation")
     @Override
     protected Entity createNode(@Nullable Location loc, Map<?,?> flags) {
         Map<Object, Object> allflags = MutableMap.copyOf(flags);
-        
-        if ((flags.containsKey(CassandraNode.TOKEN) || flags.containsKey("token")) || (flags.containsKey(CassandraNode.TOKENS) || flags.containsKey("tokens"))) {
+
+        if (flags.containsKey("token") || flags.containsKey("cassandra.token")) {
+            // TODO Delete in future version; was deprecated in 0.7.0; deleted config key in 0.9.0
+            log.warn("Cassandra token no longer supported - use 'tokens' in "+CassandraDatacenterImpl.this);
+        }
+        if (flags.containsKey(CassandraNode.TOKENS) || flags.containsKey("tokens") || flags.containsKey("cassandra.tokens")) {
             // leave token config as-is
         } else if (!useVnodes()) {
             BigInteger token = getTokenGenerator().newToken();
-            allflags.put(CassandraNode.TOKEN, token);
+            if (token != null) {
+                allflags.put(CassandraNode.TOKENS, ImmutableSet.of(token));
+            }
         }
 
         if ((flags.containsKey(CassandraNode.NUM_TOKENS_PER_NODE) || flags.containsKey("numTokensPerNode"))) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/623ee83e/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java
index aaf1886..0f42be5 100644
--- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java
+++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java
@@ -136,14 +136,6 @@ public interface CassandraNode extends DatastoreMixins.DatastoreCommon, Software
             "Number of tokens per node; if using vnodes, should set this to a value like 256",
             1);
     
-    /**
-     * @deprecated since 0.7; use {@link #TOKENS}
-     */
-    @SetFromFlag("token")
-    @Deprecated
-    BasicAttributeSensorAndConfigKey<BigInteger> TOKEN = new BasicAttributeSensorAndConfigKey<BigInteger>(
-            BigInteger.class, "cassandra.token", "Cassandra Token");
-
     @SetFromFlag("tokens")
     @SuppressWarnings("serial")
     BasicAttributeSensorAndConfigKey<Set<BigInteger>> TOKENS = new BasicAttributeSensorAndConfigKey<Set<BigInteger>>(
@@ -200,24 +192,14 @@ public interface CassandraNode extends DatastoreMixins.DatastoreCommon, Software
     String getPrivateIp();
     String getPublicIp();
     
-    /**
-     * In range 0 to (2^127)-1; or null if not yet set or known.
-     * Returns the first token if more than one token.
-     * @deprecated since 0.7; see {@link #getTokens()}
-     */
-    @Deprecated
-    BigInteger getToken();
-
     int getNumTokensPerNode();
 
-    Set<BigInteger> getTokens();
-
     /**
-     * string value of token (with no commas, which freemarker introduces!) or blank if none
-     * @deprecated since 0.7; use {@link #getTokensAsString()}
+     * Returns the set of tokens.
+     * Each is in the range 0 to (2^127)-1.
+     * Returns null if there are no tokens.
      */
-    @Deprecated
-    String getTokenAsString();
+    Set<BigInteger> getTokens();
 
     /** string value of comma-separated tokens; or blank if none */
     String getTokensAsString();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/623ee83e/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
index 22d73ec..1c6742b 100644
--- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
+++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
@@ -53,8 +53,6 @@ import org.apache.brooklyn.feed.jmx.JmxAttributePollConfig;
 import org.apache.brooklyn.feed.jmx.JmxFeed;
 import org.apache.brooklyn.feed.jmx.JmxHelper;
 import org.apache.brooklyn.feed.jmx.JmxOperationPollConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.policy.enricher.RollingTimeWindowMeanEnricher;
 import org.apache.brooklyn.policy.enricher.TimeWeightedDeltaEnricher;
 import org.apache.brooklyn.util.collections.MutableSet;
@@ -65,6 +63,8 @@ import org.apache.brooklyn.util.guava.Functionals;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Function;
 import com.google.common.base.Functions;
@@ -75,8 +75,6 @@ import com.google.common.base.Splitter;
 import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.common.net.HostAndPort;
@@ -207,44 +205,16 @@ public class CassandraNodeImpl extends SoftwareProcessImpl implements CassandraN
         return getConfig(CassandraNode.NUM_TOKENS_PER_NODE);
     }
 
-    @Deprecated
-    @Override public BigInteger getToken() {
-        BigInteger token = getAttribute(CassandraNode.TOKEN);
-        if (token == null) {
-            token = getConfig(CassandraNode.TOKEN);
-        }
-        return token;
-    }
-    
     @Override public Set<BigInteger> getTokens() {
         // Prefer an already-set attribute over the config.
         // Prefer TOKENS over TOKEN.
         Set<BigInteger> tokens = getAttribute(CassandraNode.TOKENS);
         if (tokens == null) {
-            BigInteger token = getAttribute(CassandraNode.TOKEN);
-            if (token != null) {
-                tokens = ImmutableSet.of(token);
-            }
-        }
-        if (tokens == null) {
             tokens = getConfig(CassandraNode.TOKENS);
         }
-        if (tokens == null) {
-            BigInteger token = getConfig(CassandraNode.TOKEN);
-            if (token != null) {
-                tokens = ImmutableSet.of(token);
-            }
-        }
         return tokens;
     }
     
-    @Deprecated
-    @Override public String getTokenAsString() {
-        BigInteger token = getToken();
-        if (token==null) return "";
-        return ""+token;
-    }
-
     @Override public String getTokensAsString() {
         // TODO check what is required when replacing failed node.
         // with vnodes in Cassandra 2.x, don't bother supplying token
@@ -456,23 +426,6 @@ public class CassandraNodeImpl extends SoftwareProcessImpl implements CassandraN
                             }})
                         .onException(Functions.<Set<BigInteger>>constant(null))
                         .suppressDuplicates(true))
-                .pollAttribute(new JmxAttributePollConfig<BigInteger>(TOKEN)
-                        .objectName(storageServiceMBean)
-                        .attributeName("TokenToEndpointMap")
-                        .onSuccess(new Function<Object, BigInteger>() {
-                            @Override
-                            public BigInteger apply(@Nullable Object arg) {
-                                Map input = (Map)arg;
-                                // TODO remove duplication from setting TOKENS
-                                if (input == null || input.isEmpty()) return null;
-                                // FIXME does not work on aws-ec2, uses RFC1918 address
-                                Predicate<String> self = Predicates.in(ImmutableList.of(getAttribute(HOSTNAME), getAttribute(ADDRESS), getAttribute(SUBNET_ADDRESS), getAttribute(SUBNET_HOSTNAME)));
-                                Set<String> tokens = Maps.filterValues(input, self).keySet();
-                                String token = Iterables.getFirst(tokens, null);
-                                return (token != null) ? new BigInteger(token) : null;
-                            }})
-                        .onException(Functions.<BigInteger>constant(null))
-                        .suppressDuplicates(true))
                 .pollOperation(new JmxOperationPollConfig<String>(DATACENTER_NAME)
                         .period(60, TimeUnit.SECONDS)
                         .objectName(snitchMBean)

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/623ee83e/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterIntegrationTest.java b/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterIntegrationTest.java
index 4192f91..eddbbef 100644
--- a/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterIntegrationTest.java
+++ b/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterIntegrationTest.java
@@ -40,6 +40,7 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 
 /**
@@ -55,6 +56,7 @@ import com.google.common.collect.Iterables;
  */
 public class CassandraDatacenterIntegrationTest extends BrooklynAppLiveTestSupport {
 
+    @SuppressWarnings("unused")
     private static final Logger log = LoggerFactory.getLogger(CassandraDatacenterIntegrationTest.class);
 
     protected Location testLocation;
@@ -119,7 +121,7 @@ public class CassandraDatacenterIntegrationTest extends BrooklynAppLiveTestSuppo
         if (assertToken) {
             PosNeg63TokenGenerator tg = new PosNeg63TokenGenerator();
             tg.growingCluster(1);
-            EntityTestUtils.assertAttributeEqualsEventually(node, CassandraNode.TOKEN, tg.newToken().add(BigInteger.valueOf(42)));
+            EntityTestUtils.assertAttributeEqualsEventually(node, CassandraNode.TOKENS, ImmutableSet.of(tg.newToken().add(BigInteger.valueOf(42))));
         }
 
         // may take some time to be consistent (with new thrift_latency checks on the node,

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/623ee83e/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterLiveTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterLiveTest.java b/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterLiveTest.java
index aedd5a7..7279f92 100644
--- a/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterLiveTest.java
+++ b/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterLiveTest.java
@@ -19,6 +19,7 @@
 package org.apache.brooklyn.entity.nosql.cassandra;
 
 import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
@@ -51,7 +52,6 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -114,6 +114,10 @@ public class CassandraDatacenterLiveTest extends BrooklynAppLiveTestSupport {
      * didn't seem to be enough. I also had to set JAVA_HOME:
      *     .configure("shell.env", MutableMap.of("JAVA_HOME", "/etc/alternatives/java_sdk_1.7.0"))
      * However, that would break other deployments such as on Ubuntu where JAVA_HOME would be different.
+     * 
+     * TODO In AWS eu-west-1, with the default image choice (ami-ad2404da, ubuntu-trusty-14.04-amd64-server-20150908),
+     * `apt-get install openjdk-8-jdk` failed with the error "Unable to locate package openjdk-8-jdk".
+     * This meant Cassandra failed to start, because no Java was installed.
      */
     @Test(groups = "Live")
     public void testDatacenterWithVnodesVersion2() throws Exception {
@@ -204,12 +208,11 @@ public class CassandraDatacenterLiveTest extends BrooklynAppLiveTestSupport {
                     EntityTestUtils.assertAttributeEquals(node, Startable.SERVICE_UP, true);
                     EntityTestUtils.assertConfigEquals(node, CassandraNode.NUM_TOKENS_PER_NODE, 1);
                     EntityTestUtils.assertAttributeEquals(node, CassandraNode.PEERS, numNodes);
-                    BigInteger token = node.getAttribute(CassandraNode.TOKEN);
                     Set<BigInteger> tokens = node.getAttribute(CassandraNode.TOKENS);
-                    assertNotNull(token);
-                    assertEquals(tokens, ImmutableSet.of(token));
+                    assertNotNull(tokens);
                     alltokens.addAll(tokens);
                 }
+                assertFalse(alltokens.contains(null), "tokens="+alltokens);
                 assertEquals(alltokens.size(), numNodes);
             }});
     }
@@ -225,12 +228,12 @@ public class CassandraDatacenterLiveTest extends BrooklynAppLiveTestSupport {
                     EntityTestUtils.assertAttributeEquals(node, Startable.SERVICE_UP, true);
                     EntityTestUtils.assertAttributeEquals(node, CassandraNode.PEERS, tokensPerNode*numNodes);
                     EntityTestUtils.assertConfigEquals(node, CassandraNode.NUM_TOKENS_PER_NODE, 256);
-                    BigInteger token = node.getAttribute(CassandraNode.TOKEN);
                     Set<BigInteger> tokens = node.getAttribute(CassandraNode.TOKENS);
-                    assertNotNull(token);
+                    assertNotNull(tokens);
                     assertEquals(tokens.size(), tokensPerNode, "tokens="+tokens);
                     alltokens.addAll(tokens);
                 }
+                assertFalse(alltokens.contains(null));
                 assertEquals(alltokens.size(), tokensPerNode*numNodes);
             }});
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/623ee83e/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterRebindIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterRebindIntegrationTest.java b/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterRebindIntegrationTest.java
index 1ad77d0..89b03da 100644
--- a/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterRebindIntegrationTest.java
+++ b/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterRebindIntegrationTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.brooklyn.entity.nosql.cassandra;
 
+import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 
 import java.math.BigInteger;
@@ -44,6 +45,7 @@ import com.google.common.collect.Iterables;
  * Test the operation of the {@link NginxController} class.
  */
 public class CassandraDatacenterRebindIntegrationTest extends RebindTestFixtureWithApp {
+    @SuppressWarnings("unused")
     private static final Logger LOG = LoggerFactory.getLogger(CassandraDatacenterRebindIntegrationTest.class);
 
     private LocalhostMachineProvisioningLocation localhostProvisioningLocation;
@@ -77,9 +79,9 @@ public class CassandraDatacenterRebindIntegrationTest extends RebindTestFixtureW
         CassandraDatacenterLiveTest.assertNodesConsistent(ImmutableList.of(origNode));
         CassandraDatacenterLiveTest.assertSingleTokenConsistent(ImmutableList.of(origNode));
         CassandraDatacenterLiveTest.checkConnectionRepeatedly(2, 5, ImmutableList.of(origNode));
-        BigInteger origToken = origNode.getAttribute(CassandraNode.TOKEN);
         Set<BigInteger> origTokens = origNode.getAttribute(CassandraNode.TOKENS);
-        assertNotNull(origToken);
+        assertNotNull(origTokens);
+        assertFalse(origTokens.contains(null), "tokens="+origTokens);
         
         newApp = rebind(RebindOptions.create().terminateOrigManagementContext(true));
         final CassandraDatacenter newDatacenter = (CassandraDatacenter) Iterables.find(newApp.getChildren(), Predicates.instanceOf(CassandraDatacenter.class));
@@ -87,7 +89,6 @@ public class CassandraDatacenterRebindIntegrationTest extends RebindTestFixtureW
         
         EntityTestUtils.assertAttributeEqualsEventually(newDatacenter, CassandraDatacenter.GROUP_SIZE, 1);
         EntityTestUtils.assertAttributeEqualsEventually(newNode, Startable.SERVICE_UP, true);
-        EntityTestUtils.assertAttributeEqualsEventually(newNode, CassandraNode.TOKEN, origToken);
         EntityTestUtils.assertAttributeEqualsEventually(newNode, CassandraNode.TOKENS, origTokens);
         CassandraDatacenterLiveTest.assertNodesConsistent(ImmutableList.of(newNode));
         CassandraDatacenterLiveTest.assertSingleTokenConsistent(ImmutableList.of(newNode));

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/623ee83e/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterTest.java b/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterTest.java
index 2267fb1..2c978b2 100644
--- a/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterTest.java
+++ b/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterTest.java
@@ -28,10 +28,10 @@ import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.core.entity.Attributes;
-import org.apache.brooklyn.core.entity.EntityInternal;
 import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.entity.software.base.EmptySoftwareProcess;
 import org.apache.brooklyn.entity.software.base.EmptySoftwareProcessSshDriver;
+import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation;
 import org.apache.brooklyn.test.EntityTestUtils;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.core.text.TemplateProcessor;
@@ -42,7 +42,6 @@ import org.slf4j.LoggerFactory;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
-import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -99,10 +98,11 @@ public class CassandraDatacenterTest extends BrooklynAppUnitTestSupport {
         
         // calling the driver stop for this entity will cause SERVICE_UP to become false, and stay false
         // (and that's all it does, incidentally); if we just set the attribute it will become true on serviceUp sensor feed
+        log.info("Simulating failure of cassandra node "+e1);
         ((EmptySoftwareProcess)e1).getDriver().stop();
         // not necessary, but speeds things up:
         if (fast)
-            ((EntityInternal)e1).setAttribute(Attributes.SERVICE_UP, false);
+            e1.sensors().set(Attributes.SERVICE_UP, false);
         
         EntityTestUtils.assertAttributeEqualsEventually(cluster, CassandraDatacenter.CURRENT_SEEDS, ImmutableSet.<Entity>of(e2));
 
@@ -120,7 +120,7 @@ public class CassandraDatacenterTest extends BrooklynAppUnitTestSupport {
             // (not that important, and waits for 1s, so only done as part of integration)
             ((EmptySoftwareProcessSshDriver)(((EmptySoftwareProcess)e1).getDriver())).launch();
             if (fast)
-                ((EntityInternal)e1).setAttribute(Attributes.SERVICE_UP, true);
+                e1.sensors().set(Attributes.SERVICE_UP, true);
             EntityTestUtils.assertAttributeEqualsEventually(e1, CassandraNode.SERVICE_UP, true);
             EntityTestUtils.assertAttributeEqualsContinually(cluster, CassandraDatacenter.CURRENT_SEEDS, ImmutableSet.<Entity>of(e2, e3));
         }
@@ -137,15 +137,11 @@ public class CassandraDatacenterTest extends BrooklynAppUnitTestSupport {
         app.start(ImmutableList.of(loc));
 
         Set<BigInteger> tokens = Sets.newLinkedHashSet();
-        Set<BigInteger> tokens2 = Sets.newLinkedHashSet();
         for (Entity member : cluster.getMembers()) {
-            BigInteger memberToken = member.getConfig(CassandraNode.TOKEN);
             Set<BigInteger > memberTokens = member.getConfig(CassandraNode.TOKENS);
-            if (memberToken != null) tokens.add(memberToken);
-            if (memberTokens != null) tokens2.addAll(memberTokens);
+            if (memberTokens != null) tokens.addAll(memberTokens);
         }
         assertEquals(tokens, ImmutableSet.of(new BigInteger("-9223372036854775808"), BigInteger.ZERO));
-        assertEquals(tokens2, ImmutableSet.of());
     }
     
     @Test
@@ -159,15 +155,11 @@ public class CassandraDatacenterTest extends BrooklynAppUnitTestSupport {
         app.start(ImmutableList.of(loc));
 
         Set<BigInteger> tokens = Sets.newLinkedHashSet();
-        Set<BigInteger> tokens2 = Sets.newLinkedHashSet();
         for (Entity member : cluster.getMembers()) {
-            BigInteger memberToken = member.getConfig(CassandraNode.TOKEN);
             Set<BigInteger > memberTokens = member.getConfig(CassandraNode.TOKENS);
-            if (memberToken != null) tokens.add(memberToken);
-            if (memberTokens != null) tokens2.addAll(memberTokens);
+            if (memberTokens != null) tokens.addAll(memberTokens);
         }
         assertEquals(tokens, ImmutableSet.of());
-        assertEquals(tokens2, ImmutableSet.of());
     }
     
     public static class MockInputForTemplate {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/623ee83e/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeIntegrationTest.java b/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeIntegrationTest.java
index 831b9a7..12edbe6 100644
--- a/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeIntegrationTest.java
+++ b/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeIntegrationTest.java
@@ -155,7 +155,6 @@ public class CassandraNodeIntegrationTest extends AbstractCassandraNodeTest {
         
         Asserts.succeedsEventually(new Runnable() {
             @Override public void run() {
-                assertNotNull(cassandra.getAttribute(CassandraNode.TOKEN));
                 assertNotNull(cassandra.getAttribute(CassandraNode.TOKENS));
                 assertEquals(cassandra.getAttribute(CassandraNode.TOKENS).size(), 256, "tokens="+cassandra.getAttribute(CassandraNode.TOKENS));
                 


[5/5] incubator-brooklyn git commit: This closes #897

Posted by al...@apache.org.
This closes #897


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

Branch: refs/heads/master
Commit: b118c1194e446efd00633e2e96b0250d78ac7623
Parents: b3ce256 623ee83
Author: Aled Sage <al...@gmail.com>
Authored: Thu Sep 17 11:30:30 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Sep 17 11:30:30 2015 +0100

----------------------------------------------------------------------
 .../cassandra/CassandraDatacenterImpl.java      |  39 +++--
 .../nosql/cassandra/CassandraFabricImpl.java    |  26 +--
 .../entity/nosql/cassandra/CassandraNode.java   |  27 +---
 .../nosql/cassandra/CassandraNodeImpl.java      | 157 +++++++++----------
 .../nosql/cassandra/CassandraNodeSshDriver.java |  10 +-
 .../CassandraDatacenterIntegrationTest.java     |   4 +-
 .../cassandra/CassandraDatacenterLiveTest.java  |  15 +-
 ...assandraDatacenterRebindIntegrationTest.java |   7 +-
 .../cassandra/CassandraDatacenterTest.java      |  20 +--
 .../nosql/cassandra/CassandraFabricTest.java    |   8 +-
 .../cassandra/CassandraNodeIntegrationTest.java |   1 -
 11 files changed, 145 insertions(+), 169 deletions(-)
----------------------------------------------------------------------



[3/5] incubator-brooklyn git commit: Cassandra: change deprecated setConfig/setAttrib

Posted by al...@apache.org.
Cassandra: change deprecated setConfig/setAttrib


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

Branch: refs/heads/master
Commit: 5385f347b5040f81343d3de57a6d9ac5b2acdb9d
Parents: a5c4b16
Author: Aled Sage <al...@gmail.com>
Authored: Tue Sep 15 09:25:10 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Sep 15 11:06:58 2015 +0100

----------------------------------------------------------------------
 .../cassandra/CassandraDatacenterImpl.java      | 26 ++++++++++----------
 .../nosql/cassandra/CassandraFabricImpl.java    | 26 ++++++++++----------
 .../entity/nosql/cassandra/CassandraNode.java   |  1 +
 .../nosql/cassandra/CassandraNodeImpl.java      | 14 +++++------
 .../nosql/cassandra/CassandraNodeSshDriver.java | 10 ++++----
 .../nosql/cassandra/CassandraFabricTest.java    |  8 +++---
 6 files changed, 43 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5385f347/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterImpl.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterImpl.java
index 27f83aa..3678bb2 100644
--- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterImpl.java
+++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraDatacenterImpl.java
@@ -197,8 +197,8 @@ public class CassandraDatacenterImpl extends DynamicClusterImpl implements Cassa
                     if (!(oldDcName.isPresent() && dcName.equals(oldDcName.get()))) {
                         mutableDatacenterUsage.values().remove(member);
                         mutableDatacenterUsage.put(dcName, member);
-                        setAttribute(DATACENTER_USAGE, mutableDatacenterUsage);
-                        setAttribute(DATACENTERS, Sets.newLinkedHashSet(mutableDatacenterUsage.keySet()));
+                        sensors().set(DATACENTER_USAGE, mutableDatacenterUsage);
+                        sensors().set(DATACENTERS, Sets.newLinkedHashSet(mutableDatacenterUsage.keySet()));
                     }
                 }
             }
@@ -218,8 +218,8 @@ public class CassandraDatacenterImpl extends DynamicClusterImpl implements Cassa
                 if (datacenterUsage != null && datacenterUsage.containsValue(entity)) {
                     Multimap<String, Entity> mutableDatacenterUsage = LinkedHashMultimap.create(datacenterUsage);
                     mutableDatacenterUsage.values().remove(entity);
-                    setAttribute(DATACENTER_USAGE, mutableDatacenterUsage);
-                    setAttribute(DATACENTERS, Sets.newLinkedHashSet(mutableDatacenterUsage.keySet()));
+                    sensors().set(DATACENTER_USAGE, mutableDatacenterUsage);
+                    sensors().set(DATACENTERS, Sets.newLinkedHashSet(mutableDatacenterUsage.keySet()));
                 }
             }
         });
@@ -340,7 +340,7 @@ public class CassandraDatacenterImpl extends DynamicClusterImpl implements Cassa
                 "due to assumptions Cassandra makes about the use of the same port numbers used across the cluster.");
 
         // force this to be set - even if it is using the default
-        setAttribute(CLUSTER_NAME, getConfig(CLUSTER_NAME));
+        sensors().set(CLUSTER_NAME, getConfig(CLUSTER_NAME));
         
         super.start(locations);
 
@@ -457,8 +457,8 @@ public class CassandraDatacenterImpl extends DynamicClusterImpl implements Cassa
             Optional<Entity> upNode = Iterables.tryFind(getMembers(), EntityPredicates.attributeEqualTo(SERVICE_UP, Boolean.TRUE));
 
             if (upNode.isPresent()) {
-                setAttribute(HOSTNAME, upNode.get().getAttribute(Attributes.HOSTNAME));
-                setAttribute(THRIFT_PORT, upNode.get().getAttribute(CassandraNode.THRIFT_PORT));
+                sensors().set(HOSTNAME, upNode.get().getAttribute(Attributes.HOSTNAME));
+                sensors().set(THRIFT_PORT, upNode.get().getAttribute(CassandraNode.THRIFT_PORT));
 
                 List<String> currentNodes = getAttribute(CASSANDRA_CLUSTER_NODES);
                 Set<String> oldNodes = (currentNodes != null) ? ImmutableSet.copyOf(currentNodes) : ImmutableSet.<String>of();
@@ -473,12 +473,12 @@ public class CassandraDatacenterImpl extends DynamicClusterImpl implements Cassa
                     }
                 }
                 if (Sets.symmetricDifference(oldNodes, newNodes).size() > 0) {
-                    setAttribute(CASSANDRA_CLUSTER_NODES, MutableList.copyOf(newNodes));
+                    sensors().set(CASSANDRA_CLUSTER_NODES, MutableList.copyOf(newNodes));
                 }
             } else {
-                setAttribute(HOSTNAME, null);
-                setAttribute(THRIFT_PORT, null);
-                setAttribute(CASSANDRA_CLUSTER_NODES, Collections.<String>emptyList());
+                sensors().set(HOSTNAME, null);
+                sensors().set(THRIFT_PORT, null);
+                sensors().set(CASSANDRA_CLUSTER_NODES, Collections.<String>emptyList());
             }
 
             ServiceNotUpLogic.updateNotUpIndicatorRequiringNonEmptyList(this, CASSANDRA_CLUSTER_NODES);
@@ -563,9 +563,9 @@ public class CassandraDatacenterImpl extends DynamicClusterImpl implements Cassa
                 if (log.isTraceEnabled()) log.debug("Seed refresh no-op for cluster {}: still={}", new Object[] {CassandraDatacenterImpl.this, oldseeds});
             } else {
                 if (log.isDebugEnabled()) log.debug("Refreshing seeds of cluster {}: now={}; old={}", new Object[] {this, newseeds, oldseeds});
-                setAttribute(CURRENT_SEEDS, newseeds);
+                sensors().set(CURRENT_SEEDS, newseeds);
                 if (newseeds != null && newseeds.size() > 0) {
-                    setAttribute(HAS_PUBLISHED_SEEDS, true);
+                    sensors().set(HAS_PUBLISHED_SEEDS, true);
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5385f347/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraFabricImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraFabricImpl.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraFabricImpl.java
index b42b162..682d352 100644
--- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraFabricImpl.java
+++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraFabricImpl.java
@@ -133,10 +133,10 @@ public class CassandraFabricImpl extends DynamicFabricImpl implements CassandraF
                 }
                 
                 if (!Objects.equal(seeds, newseeds)) {
-                    setAttribute(CURRENT_SEEDS, newseeds);
+                    sensors().set(CURRENT_SEEDS, newseeds);
                     
                     if (newseeds != null && newseeds.size() > 0) {
-                        setAttribute(HAS_PUBLISHED_SEEDS, true);
+                        sensors().set(HAS_PUBLISHED_SEEDS, true);
                         
                         // Need to tell every datacenter that seeds are ready.
                         // Otherwise a datacenter might get no more changes (e.g. to nodes' hostnames etc), 
@@ -204,8 +204,8 @@ public class CassandraFabricImpl extends DynamicFabricImpl implements CassandraF
     public void init() {
         super.init();
 
-        if (!getConfigRaw(CassandraDatacenter.SEED_SUPPLIER, true).isPresentAndNonNull())
-            setConfig(CassandraDatacenter.SEED_SUPPLIER, getSeedSupplier());
+        if (!config().getRaw(CassandraDatacenter.SEED_SUPPLIER).isPresentAndNonNull())
+            config().set(CassandraDatacenter.SEED_SUPPLIER, getSeedSupplier());
         
         // track members
         addPolicy(PolicySpec.create(MemberTrackingPolicy.class)
@@ -219,9 +219,9 @@ public class CassandraFabricImpl extends DynamicFabricImpl implements CassandraF
                 Long oldval = getAttribute(CassandraDatacenter.FIRST_NODE_STARTED_TIME_UTC);
                 Long newval = event.getValue();
                 if (oldval == null && newval != null) {
-                    setAttribute(CassandraDatacenter.FIRST_NODE_STARTED_TIME_UTC, newval);
+                    sensors().set(CassandraDatacenter.FIRST_NODE_STARTED_TIME_UTC, newval);
                     for (CassandraDatacenter member : Iterables.filter(getMembers(), CassandraDatacenter.class)) {
-                        ((EntityInternal)member).setAttribute(CassandraDatacenter.FIRST_NODE_STARTED_TIME_UTC, newval);
+                        ((EntityInternal)member).sensors().set(CassandraDatacenter.FIRST_NODE_STARTED_TIME_UTC, newval);
                     }
                 }
             }
@@ -232,15 +232,15 @@ public class CassandraFabricImpl extends DynamicFabricImpl implements CassandraF
             @Override
             public void onEvent(SensorEvent<Multimap<String,Entity>> event) {
                 Multimap<String, Entity> usage = calculateDatacenterUsage();
-                setAttribute(DATACENTER_USAGE, usage);
-                setAttribute(DATACENTERS, usage.keySet());
+                sensors().set(DATACENTER_USAGE, usage);
+                sensors().set(DATACENTERS, usage.keySet());
             }
         });
         subscribe(this, DynamicGroup.MEMBER_REMOVED, new SensorEventListener<Entity>() {
             @Override public void onEvent(SensorEvent<Entity> event) {
                 Multimap<String, Entity> usage = calculateDatacenterUsage();
-                setAttribute(DATACENTER_USAGE, usage);
-                setAttribute(DATACENTERS, usage.keySet());
+                sensors().set(DATACENTER_USAGE, usage);
+                sensors().set(DATACENTERS, usage.keySet());
             }
         });
     }
@@ -344,7 +344,7 @@ public class CassandraFabricImpl extends DynamicFabricImpl implements CassandraF
 
         subscribeToMembers(this, SERVICE_UP, new SensorEventListener<Boolean>() {
             @Override public void onEvent(SensorEvent<Boolean> event) {
-                setAttribute(SERVICE_UP, calculateServiceUp());
+                sensors().set(SERVICE_UP, calculateServiceUp());
             }
         });
     }
@@ -386,8 +386,8 @@ public class CassandraFabricImpl extends DynamicFabricImpl implements CassandraF
             Optional<Entity> upNode = Iterables.tryFind(getMembers(), EntityPredicates.attributeEqualTo(SERVICE_UP, Boolean.TRUE));
 
             if (upNode.isPresent()) {
-                setAttribute(HOSTNAME, upNode.get().getAttribute(Attributes.HOSTNAME));
-                setAttribute(THRIFT_PORT, upNode.get().getAttribute(CassandraNode.THRIFT_PORT));
+                sensors().set(HOSTNAME, upNode.get().getAttribute(Attributes.HOSTNAME));
+                sensors().set(THRIFT_PORT, upNode.get().getAttribute(CassandraNode.THRIFT_PORT));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5385f347/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java
index 683c16d..aaf1886 100644
--- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java
+++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java
@@ -145,6 +145,7 @@ public interface CassandraNode extends DatastoreMixins.DatastoreCommon, Software
             BigInteger.class, "cassandra.token", "Cassandra Token");
 
     @SetFromFlag("tokens")
+    @SuppressWarnings("serial")
     BasicAttributeSensorAndConfigKey<Set<BigInteger>> TOKENS = new BasicAttributeSensorAndConfigKey<Set<BigInteger>>(
             new TypeToken<Set<BigInteger>>() {}, "cassandra.tokens", "Cassandra Tokens");
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5385f347/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
index dddc1cd..22d73ec 100644
--- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
+++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeImpl.java
@@ -155,17 +155,17 @@ public class CassandraNodeImpl extends SoftwareProcessImpl implements CassandraN
                              * (TODO internal access could be configured to improve performance / lower cost, 
                              * if we know all nodes are visible to each other) */
                             if (getConfig(LISTEN_ADDRESS_SENSOR)==null)
-                                setConfig(LISTEN_ADDRESS_SENSOR, CassandraNode.ADDRESS.getName());
+                                config().set(LISTEN_ADDRESS_SENSOR, CassandraNode.ADDRESS.getName());
                             if (getConfig(BROADCAST_ADDRESS_SENSOR)==null)
-                                setConfig(BROADCAST_ADDRESS_SENSOR, CassandraNode.ADDRESS.getName());
+                                config().set(BROADCAST_ADDRESS_SENSOR, CassandraNode.ADDRESS.getName());
                             result = "public IP for both listen and broadcast";
                         } else if (provider.contains("google-compute")) {
                             /* Google nodes cannot reach themselves/each-other on the public IP,
                              * and there is no hostname, so use private IP here */
                             if (getConfig(LISTEN_ADDRESS_SENSOR)==null)
-                                setConfig(LISTEN_ADDRESS_SENSOR, CassandraNode.SUBNET_HOSTNAME.getName());
+                                config().set(LISTEN_ADDRESS_SENSOR, CassandraNode.SUBNET_HOSTNAME.getName());
                             if (getConfig(BROADCAST_ADDRESS_SENSOR)==null)
-                                setConfig(BROADCAST_ADDRESS_SENSOR, CassandraNode.SUBNET_HOSTNAME.getName());
+                                config().set(BROADCAST_ADDRESS_SENSOR, CassandraNode.SUBNET_HOSTNAME.getName());
                             result = "private IP for both listen and broadcast";
                         }
                     }
@@ -372,7 +372,7 @@ public class CassandraNodeImpl extends SoftwareProcessImpl implements CassandraN
             if (name == null) {
                 name = "UNKNOWN_DATACENTER";
             }
-            setAttribute((AttributeSensor<String>)DATACENTER_NAME, name);
+            sensors().set((AttributeSensor<String>)DATACENTER_NAME, name);
         }
         return name;
     }
@@ -391,7 +391,7 @@ public class CassandraNodeImpl extends SoftwareProcessImpl implements CassandraN
             if (name == null) {
                 name = "UNKNOWN_RACK";
             }
-            setAttribute((AttributeSensor<String>)RACK_NAME, name);
+            sensors().set((AttributeSensor<String>)RACK_NAME, name);
         }
         return name;
     }
@@ -420,7 +420,7 @@ public class CassandraNodeImpl extends SoftwareProcessImpl implements CassandraN
     @Override
     protected void connectSensors() {
         // "cassandra" isn't really a protocol, but okay for now
-        setAttribute(DATASTORE_URL, "cassandra://"+getAttribute(HOSTNAME)+":"+getAttribute(THRIFT_PORT));
+        sensors().set(DATASTORE_URL, "cassandra://"+getAttribute(HOSTNAME)+":"+getAttribute(THRIFT_PORT));
         
         super.connectSensors();
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5385f347/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java
index 193b49f..d3230f9 100644
--- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java
+++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java
@@ -224,10 +224,10 @@ public class CassandraNodeSshDriver extends JavaSoftwareProcessSshDriver impleme
     protected void customizeInitialSeeds() {
         if (entity.getConfig(CassandraNode.INITIAL_SEEDS)==null) {
             if (isClustered()) {
-                entity.setConfig(CassandraNode.INITIAL_SEEDS,
+                entity.config().set(CassandraNode.INITIAL_SEEDS,
                     DependentConfiguration.attributeWhenReady(entity.getParent(), CassandraDatacenter.CURRENT_SEEDS));
             } else {
-                entity.setConfig(CassandraNode.INITIAL_SEEDS, MutableSet.<Entity>of(entity));
+                entity.config().set(CassandraNode.INITIAL_SEEDS, MutableSet.<Entity>of(entity));
             }
         }
     }
@@ -273,10 +273,10 @@ public class CassandraNodeSshDriver extends JavaSoftwareProcessSshDriver impleme
                 queuedStart = root.getAttribute(CassandraDatacenter.QUEUED_START_NODES);
                 if (queuedStart==null) {
                     queuedStart = new ArrayList<Entity>();
-                    ((EntityLocal)root).setAttribute(CassandraDatacenter.QUEUED_START_NODES, queuedStart);
+                    ((EntityLocal)root).sensors().set(CassandraDatacenter.QUEUED_START_NODES, queuedStart);
                 }
                 queuedStart.add(getEntity());
-                ((EntityLocal)root).setAttribute(CassandraDatacenter.QUEUED_START_NODES, queuedStart);
+                ((EntityLocal)root).sensors().set(CassandraDatacenter.QUEUED_START_NODES, queuedStart);
             }
             do {
                 // get it again in case it is backed by something external
@@ -316,7 +316,7 @@ public class CassandraNodeSshDriver extends JavaSoftwareProcessSshDriver impleme
             }
             if (isClustered() && isFirst) {
                 for (Entity ancestor: getCassandraAncestors()) {
-                    ((EntityLocal)ancestor).setAttribute(CassandraDatacenter.FIRST_NODE_STARTED_TIME_UTC, System.currentTimeMillis());
+                    ((EntityLocal)ancestor).sensors().set(CassandraDatacenter.FIRST_NODE_STARTED_TIME_UTC, System.currentTimeMillis());
                 }
             }
         } finally {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5385f347/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraFabricTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraFabricTest.java b/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraFabricTest.java
index d6df2ea..f28ddc1 100644
--- a/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraFabricTest.java
+++ b/software/nosql/src/test/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraFabricTest.java
@@ -131,12 +131,12 @@ public class CassandraFabricTest extends BrooklynAppUnitTestSupport {
             final DummyCassandraNode d2a = (DummyCassandraNode) Iterables.get(d2.getMembers(), 0);
             final DummyCassandraNode d2b = (DummyCassandraNode) Iterables.get(d2.getMembers(), 1);
 
-            d1a.setAttribute(Attributes.HOSTNAME, "d1a");
-            d1b.setAttribute(Attributes.HOSTNAME, "d1b");
+            d1a.sensors().set(Attributes.HOSTNAME, "d1a");
+            d1b.sensors().set(Attributes.HOSTNAME, "d1b");
             
             Thread.sleep(1000);
-            d2a.setAttribute(Attributes.HOSTNAME, "d2a");
-            d2b.setAttribute(Attributes.HOSTNAME, "d2b");
+            d2a.sensors().set(Attributes.HOSTNAME, "d2a");
+            d2b.sensors().set(Attributes.HOSTNAME, "d2b");
             
             Predicate<Set<Entity>> predicate = new Predicate<Set<Entity>>() {
                 @Override public boolean apply(Set<Entity> input) {