http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientSupport.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientSupport.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientSupport.java
deleted file mode 100644
index 57a8dee..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientSupport.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb;
-
-import java.net.UnknownHostException;
-
-import org.bson.BSONObject;
-import org.bson.BasicBSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Optional;
-import com.google.common.net.HostAndPort;
-import com.mongodb.BasicDBObject;
-import com.mongodb.CommandResult;
-import com.mongodb.DB;
-import com.mongodb.DBObject;
-import com.mongodb.MongoClient;
-import com.mongodb.MongoClientOptions;
-import com.mongodb.MongoException;
-import com.mongodb.ServerAddress;
-
-import brooklyn.location.access.BrooklynAccessUtils;
-import brooklyn.util.BrooklynNetworkUtils;
-
-/**
- * Manages connections to standalone MongoDB servers.
- *
- * @see <a href="http://docs.mongodb.org/manual/reference/command/";>MongoDB 
database command documentation</a>
- */
-public class MongoDBClientSupport {
-
-    private static final Logger LOG = 
LoggerFactory.getLogger(MongoDBClientSupport.class);
-
-    private ServerAddress address;
-    
-    private MongoClient client() {
-        return new MongoClient(address, connectionOptions);
-    }
-
-    // Set client to automatically reconnect to servers.
-    private static final MongoClientOptions connectionOptions = 
MongoClientOptions.builder()
-            .autoConnectRetry(true)
-            .socketKeepAlive(true)
-            .build();
-
-    private static final BasicBSONObject EMPTY_RESPONSE = new 
BasicBSONObject();
-
-    public MongoDBClientSupport(ServerAddress standalone) {
-        // We could also use a MongoClient to access an entire replica set. 
See MongoClient(List<ServerAddress>).
-        address = standalone;
-    }
-
-    /**
-     * Creates a {@link MongoDBClientSupport} instance in standalone mode.
-     */
-    public static MongoDBClientSupport forServer(AbstractMongoDBServer 
standalone) throws UnknownHostException {
-        HostAndPort hostAndPort = 
BrooklynAccessUtils.getBrooklynAccessibleAddress(standalone, 
standalone.getAttribute(MongoDBServer.PORT));
-        ServerAddress address = new ServerAddress(hostAndPort.getHostText(), 
hostAndPort.getPort());
-        return new MongoDBClientSupport(address);
-    }
-
-    private ServerAddress getServerAddress() {
-        MongoClient client = client();
-        try {
-            return client.getServerAddressList().get(0);
-        } finally {
-            client.close();
-        }
-    }
-
-    private HostAndPort getServerHostAndPort() {
-        ServerAddress address = getServerAddress();
-        return HostAndPort.fromParts(address.getHost(), address.getPort());
-    }
-
-    public Optional<CommandResult> runDBCommand(String database, String 
command) {
-        return runDBCommand(database, new BasicDBObject(command, 
Boolean.TRUE));
-    }
-
-    private Optional<CommandResult> runDBCommand(String database, DBObject 
command) {
-        MongoClient client = client();
-        try {
-            DB db = client.getDB(database);
-            CommandResult status;
-            try {
-                status = db.command(command);
-            } catch (MongoException e) {
-                LOG.warn("Command " + command + " on " + getServerAddress() + 
" failed", e);
-                return Optional.absent();
-            }
-            if (!status.ok()) {
-                LOG.debug("Unexpected result of {} on {}: {}",
-                        new Object[] { command, getServerAddress(), 
status.getErrorMessage() });
-            }
-            return Optional.of(status);
-        } finally {
-            client.close();
-        }
-    }
-    
-    public long getShardCount() {
-        MongoClient client = client();
-        try {
-            return client.getDB("config").getCollection("shards").getCount();
-        } finally {
-            client.close();
-        }
-    }
-
-    public BasicBSONObject getServerStatus() {
-        Optional<CommandResult> result = runDBCommand("admin", "serverStatus");
-        if (result.isPresent() && result.get().ok()) {
-            return result.get();
-        } else {
-            return EMPTY_RESPONSE;
-        }
-    }
-    
-    public boolean ping() {
-        DBObject ping = new BasicDBObject("ping", "1");
-        try {
-            runDBCommand("admin", ping);
-        } catch (MongoException e) {
-            return false;
-        }
-        return true;
-    }
-
-    public boolean initializeReplicaSet(String replicaSetName, Integer id) {
-        HostAndPort primary = getServerHostAndPort();
-        BasicBSONObject config = ReplicaSetConfig.builder(replicaSetName)
-                .member(primary, id)
-                .build();
-
-        BasicDBObject dbObject = new BasicDBObject("replSetInitiate", config);
-        LOG.debug("Initiating replica set with: " + dbObject);
-
-        Optional<CommandResult> result = runDBCommand("admin", dbObject);
-        if (result.isPresent() && result.get().ok() && LOG.isDebugEnabled()) {
-            LOG.debug("Completed initiating MongoDB replica set {} on entity 
{}", replicaSetName, this);
-        }
-        return result.isPresent() && result.get().ok();
-    }
-
-    /**
-     * Java equivalent of calling rs.conf() in the console.
-     */
-    private BSONObject getReplicaSetConfig() {
-        MongoClient client = client();
-        try {
-            return 
client.getDB("local").getCollection("system.replset").findOne();
-        } catch (MongoException e) {
-            LOG.error("Failed to get replica set config on "+client, e);
-            return null;
-        } finally {
-            client.close();
-        }
-    }
-
-    /**
-     * Runs <code>replSetGetStatus</code> on the admin database.
-     *
-     * @return The result of <code>replSetGetStatus</code>, or
-     *         an empty {@link BasicBSONObject} if the command threw an 
exception (e.g. if
-     *         the connection was reset) or if the resultant {@link 
CommandResult#ok} was false.
-     *
-     * @see <a 
href="http://docs.mongodb.org/manual/reference/replica-status/";>Replica set 
status reference</a>
-     * @see <a 
href="http://docs.mongodb.org/manual/reference/command/replSetGetStatus/";>replSetGetStatus
 documentation</a>
-     */
-    public BasicBSONObject getReplicaSetStatus() {
-        Optional<CommandResult> result = runDBCommand("admin", 
"replSetGetStatus");
-        if (result.isPresent() && result.get().ok()) {
-            return result.get();
-        } else {
-            return EMPTY_RESPONSE;
-        }
-    }
-
-    /**
-     * Reconfigures the replica set that this client is the primary member of 
to include a new member.
-     * <p/>
-     * Note that this can cause long downtime (typically 10-20s, even up to a 
minute).
-     *
-     * @param secondary New member of the set.
-     * @param id The id for the new set member. Must be unique within the set.
-     * @return True if successful
-     */
-    public boolean addMemberToReplicaSet(MongoDBServer secondary, Integer id) {
-        // We need to:
-        // - get the existing configuration
-        // - update its version
-        // - add the new member to its list of members
-        // - run replSetReconfig with the new configuration.
-        BSONObject existingConfig = getReplicaSetConfig();
-        if (existingConfig == null) {
-            LOG.warn("Couldn't load existing config for replica set from {}. 
Server {} not added.",
-                    getServerAddress(), secondary);
-            return false;
-        }
-
-        BasicBSONObject newConfig = 
ReplicaSetConfig.fromExistingConfig(existingConfig)
-                .primary(getServerHostAndPort())
-                .member(secondary, id)
-                .build();
-        return reconfigureReplicaSet(newConfig);
-    }
-
-    /**
-     * Reconfigures the replica set that this client is the primary member of 
to
-     * remove the given server.
-     * @param server The server to remove
-     * @return True if successful
-     */
-    public boolean removeMemberFromReplicaSet(MongoDBServer server) {
-        BSONObject existingConfig = getReplicaSetConfig();
-        if (existingConfig == null) {
-            LOG.warn("Couldn't load existing config for replica set from {}. 
Server {} not removed.",
-                    getServerAddress(), server);
-            return false;
-        }
-        BasicBSONObject newConfig = 
ReplicaSetConfig.fromExistingConfig(existingConfig)
-                .primary(getServerHostAndPort())
-                .remove(server)
-                .build();
-        return reconfigureReplicaSet(newConfig);
-    }
-
-    /**
-     * Runs replSetReconfig with the given BasicBSONObject. Returns true if 
the result's
-     * status is ok.
-     */
-    private boolean reconfigureReplicaSet(BasicBSONObject newConfig) {
-        BasicDBObject command = new BasicDBObject("replSetReconfig", 
newConfig);
-        LOG.debug("Reconfiguring replica set to: " + command);
-        Optional<CommandResult> result = runDBCommand("admin", command);
-        return result.isPresent() && result.get().ok();
-    }
-
-    public boolean addShardToRouter(String hostAndPort) {
-        LOG.debug("Adding shard " + hostAndPort);
-        BasicDBObject command = new BasicDBObject("addShard", hostAndPort);
-        Optional<CommandResult> result = runDBCommand("admin", command);
-        return result.isPresent() && result.get().ok();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBDriver.java 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBDriver.java
deleted file mode 100644
index 3f484f2..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBDriver.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb;
-
-import brooklyn.entity.basic.SoftwareProcessDriver;
-
-public interface MongoDBDriver extends SoftwareProcessDriver {
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBReplicaSet.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBReplicaSet.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBReplicaSet.java
deleted file mode 100644
index d2448c0..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBReplicaSet.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb;
-
-import java.util.Collection;
-import java.util.List;
-
-import brooklyn.config.ConfigKey;
-import brooklyn.entity.basic.ConfigKeys;
-import brooklyn.entity.group.Cluster;
-import brooklyn.entity.group.DynamicCluster;
-import brooklyn.entity.proxying.ImplementedBy;
-import brooklyn.event.AttributeSensor;
-import brooklyn.event.basic.Sensors;
-import brooklyn.util.flags.SetFromFlag;
-
-import com.google.common.reflect.TypeToken;
-
-/**
- * A replica set of {@link MongoDBServer}s, based on {@link DynamicCluster} 
which can be resized by a policy
- * if required.
- *
- * <p/><b>Note</b>
- * An issue with <code>mongod</code> on Mac OS X can cause unpredictable 
failure of servers at start-up.
- * See <a 
href="https://groups.google.com/forum/#!topic/mongodb-user/QRQYdIXOR2U";>this 
mailing list post</a>
- * for more information.
- *
- * <p/>This replica set implementation has been tested on OS X 10.6 and Ubuntu 
12.04.
- *
- * @see <a 
href="http://docs.mongodb.org/manual/replication/";>http://docs.mongodb.org/manual/replication/</a>
- */
-@ImplementedBy(MongoDBReplicaSetImpl.class)
-public interface MongoDBReplicaSet extends DynamicCluster {
-
-    @SetFromFlag("replicaSetName")
-    ConfigKey<String> REPLICA_SET_NAME = ConfigKeys.newStringConfigKey(
-            "mongodb.replicaSet.name", "Name of the MongoDB replica set", 
"BrooklynCluster");
-
-    ConfigKey<Integer> INITIAL_SIZE = 
ConfigKeys.newConfigKeyWithDefault(Cluster.INITIAL_SIZE, 3);
-
-    AttributeSensor<MongoDBServer> PRIMARY_ENTITY = Sensors.newSensor(
-            MongoDBServer.class, "mongodb.replicaSet.primary.entity", "The 
entity acting as primary");
-
-    @SuppressWarnings("serial")
-    AttributeSensor<List<String>> REPLICA_SET_ENDPOINTS = 
Sensors.newSensor(new TypeToken<List<String>>() {}, 
-        "mongodb.replicaSet.endpoints", "Endpoints active for this replica 
set");
-
-    /**
-     * The name of the replica set.
-     */
-    String getName();
-
-    /**
-     * @return The primary MongoDB server in the replica set.
-     */
-    MongoDBServer getPrimary();
-
-    /**
-     * @return The secondary servers in the replica set.
-     */
-    Collection<MongoDBServer> getSecondaries();
-
-    /**
-     * @return All servers in the replica set.
-     */
-    Collection<MongoDBServer> getReplicas();
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBReplicaSetImpl.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBReplicaSetImpl.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBReplicaSetImpl.java
deleted file mode 100644
index a106ec1..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBReplicaSetImpl.java
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import javax.annotation.Nullable;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.enricher.Enrichers;
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.Lifecycle;
-import brooklyn.entity.basic.ServiceStateLogic;
-import brooklyn.entity.group.AbstractMembershipTrackingPolicy;
-import brooklyn.entity.group.DynamicClusterImpl;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.entity.trait.Startable;
-import brooklyn.event.AttributeSensor;
-import brooklyn.event.SensorEvent;
-import brooklyn.event.SensorEventListener;
-import brooklyn.location.Location;
-import brooklyn.policy.PolicySpec;
-import brooklyn.util.collections.MutableList;
-import brooklyn.util.collections.MutableSet;
-import brooklyn.util.text.Strings;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-
-/**
- * Implementation of {@link MongoDBReplicaSet}.
- *
- * Replica sets have a <i>minimum</i> of three members.
- *
- * Removal strategy is always {@link #NON_PRIMARY_REMOVAL_STRATEGY}.
- */
-public class MongoDBReplicaSetImpl extends DynamicClusterImpl implements 
MongoDBReplicaSet {
-
-    private static final Logger LOG = 
LoggerFactory.getLogger(MongoDBReplicaSetImpl.class);
-
-    // Provides IDs for replica set members. The first member will have ID 0.
-    private final AtomicInteger nextMemberId = new AtomicInteger(0);
-
-    private MemberTrackingPolicy policy;
-    private final AtomicBoolean mustInitialise = new AtomicBoolean(true);
-
-    @SuppressWarnings("unchecked")
-    protected static final List<AttributeSensor<Long>> SENSORS_TO_SUM = 
Arrays.asList(
-        MongoDBServer.OPCOUNTERS_INSERTS,
-        MongoDBServer.OPCOUNTERS_QUERIES,
-        MongoDBServer.OPCOUNTERS_UPDATES,
-        MongoDBServer.OPCOUNTERS_DELETES,
-        MongoDBServer.OPCOUNTERS_GETMORE,
-        MongoDBServer.OPCOUNTERS_COMMAND,
-        MongoDBServer.NETWORK_BYTES_IN,
-        MongoDBServer.NETWORK_BYTES_OUT,
-        MongoDBServer.NETWORK_NUM_REQUESTS);
-    
-    public MongoDBReplicaSetImpl() {
-    }
-
-    /**
-     * Manages member addition and removal.
-     *
-     * It's important that this is a single thread: the concurrent addition 
and removal
-     * of members from the set would almost certainly have unintended side 
effects,
-     * like reconfigurations using outdated ReplicaSetConfig instances.
-     */
-    private final ScheduledExecutorService executor = 
Executors.newSingleThreadScheduledExecutor();
-
-    /** true iff input is a non-null MongoDBServer with attribute 
REPLICA_SET_MEMBER_STATUS PRIMARY. */
-    static final Predicate<Entity> IS_PRIMARY = new Predicate<Entity>() {
-        // getPrimary relies on instanceof check
-        @Override public boolean apply(@Nullable Entity input) {
-            return input != null
-                    && input instanceof MongoDBServer
-                    && 
ReplicaSetMemberStatus.PRIMARY.equals(input.getAttribute(MongoDBServer.REPLICA_SET_MEMBER_STATUS));
-        }
-    };
-
-    /** true iff. input is a non-null MongoDBServer with attribute 
REPLICA_SET_MEMBER_STATUS SECONDARY. */
-    static final Predicate<Entity> IS_SECONDARY = new Predicate<Entity>() {
-        @Override public boolean apply(@Nullable Entity input) {
-            // getSecondaries relies on instanceof check
-            return input != null
-                    && input instanceof MongoDBServer
-                    && 
ReplicaSetMemberStatus.SECONDARY.equals(input.getAttribute(MongoDBServer.REPLICA_SET_MEMBER_STATUS));
-        }
-    };
-
-    /**
-     * {@link Function} for use as the cluster's removal strategy. Chooses any 
entity with
-     * {@link MongoDBServer#IS_PRIMARY_FOR_REPLICA_SET} true last of all.
-     */
-    private static final Function<Collection<Entity>, Entity> 
NON_PRIMARY_REMOVAL_STRATEGY = new Function<Collection<Entity>, Entity>() {
-        @Override
-        public Entity apply(@Nullable Collection<Entity> entities) {
-            checkArgument(entities != null && entities.size() > 0, "Expect 
list of MongoDBServers to have at least one entry");
-            return Iterables.tryFind(entities, 
Predicates.not(IS_PRIMARY)).or(Iterables.get(entities, 0));
-        }
-    };
-
-    /** @return {@link #NON_PRIMARY_REMOVAL_STRATEGY} */
-    @Override
-    public Function<Collection<Entity>, Entity> getRemovalStrategy() {
-        return NON_PRIMARY_REMOVAL_STRATEGY;
-    }
-
-    @Override
-    protected EntitySpec<?> getMemberSpec() {
-        return getConfig(MEMBER_SPEC, EntitySpec.create(MongoDBServer.class));
-    }
-
-    /**
-     * Sets {@link MongoDBServer#REPLICA_SET}.
-     */
-    @Override
-    protected Map<?,?> getCustomChildFlags() {
-        return ImmutableMap.builder()
-                .putAll(super.getCustomChildFlags())
-                .put(MongoDBServer.REPLICA_SET, getProxy())
-                .build();
-    }
-
-    @Override
-    public String getName() {
-        // FIXME: Names must be unique if the replica sets are used in a 
sharded cluster
-        return getConfig(REPLICA_SET_NAME) + this.getId();
-    }
-
-    @Override
-    public MongoDBServer getPrimary() {
-        return Iterables.tryFind(getReplicas(), IS_PRIMARY).orNull();
-    }
-
-    @Override
-    public Collection<MongoDBServer> getSecondaries() {
-        return FluentIterable.from(getReplicas())
-                .filter(IS_SECONDARY)
-                .toList();
-    }
-
-    @Override
-    public Collection<MongoDBServer> getReplicas() {
-        return FluentIterable.from(getMembers())
-                .transform(new Function<Entity, MongoDBServer>() {
-                    @Override public MongoDBServer apply(Entity input) {
-                        return MongoDBServer.class.cast(input);
-                    }
-                })
-                .toList();
-    }
-
-    /**
-     * Initialises the replica set with the given server as primary if {@link 
#mustInitialise} is true,
-     * otherwise schedules the addition of a new secondary.
-     */
-    private void serverAdded(MongoDBServer server) {
-        LOG.debug("Server added: {}. SERVICE_UP: {}", server, 
server.getAttribute(MongoDBServer.SERVICE_UP));
-
-        // Set the primary if the replica set hasn't been initialised.
-        if (mustInitialise.compareAndSet(true, false)) {
-            if (LOG.isInfoEnabled())
-                LOG.info("First server up in {} is: {}", getName(), server);
-            boolean replicaSetInitialised = 
server.initializeReplicaSet(getName(), nextMemberId.getAndIncrement());
-            if (replicaSetInitialised) {
-                setAttribute(PRIMARY_ENTITY, server);
-                setAttribute(Startable.SERVICE_UP, true);
-            } else {
-                ServiceStateLogic.setExpectedState(this, Lifecycle.ON_FIRE);
-            }
-        } else {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Scheduling addition of member to {}: {}", 
getName(), server);
-            addSecondaryWhenPrimaryIsNonNull(server);
-        }
-    }
-
-    /**
-     * Adds a server as a secondary in the replica set.
-     * <p/>
-     * If {@link #getPrimary} returns non-null submit the secondary to the 
primary's
-     * {@link MongoDBClientSupport}. Otherwise, reschedule the task to run 
again in three
-     * seconds time (in the hope that next time the primary will be available).
-     */
-    private void addSecondaryWhenPrimaryIsNonNull(final MongoDBServer 
secondary) {
-        // TODO Don't use executor, use ExecutionManager
-        executor.submit(new Runnable() {
-            @Override
-            public void run() {
-                // SERVICE_UP is not guaranteed when additional members are 
added to the set.
-                Boolean isAvailable = 
secondary.getAttribute(MongoDBServer.SERVICE_UP);
-                MongoDBServer primary = getPrimary();
-                boolean reschedule;
-                if (Boolean.TRUE.equals(isAvailable) && primary != null) {
-                    boolean added = primary.addMemberToReplicaSet(secondary, 
nextMemberId.incrementAndGet());
-                    if (added) {
-                        LOG.info("{} added to replica set {}", secondary, 
getName());
-                        reschedule = false;
-                    } else {
-                        if (LOG.isDebugEnabled()) {
-                            LOG.debug("{} could not be added to replica set 
via {}; rescheduling", secondary, getName());
-                        }
-                        reschedule = true;
-                    }
-                } else {
-                    if (LOG.isTraceEnabled()) {
-                        LOG.trace("Rescheduling addition of member {} to 
replica set {}: service_up={}, primary={}",
-                            new Object[] {secondary, getName(), isAvailable, 
primary});
-                    }
-                    reschedule = true;
-                }
-                
-                if (reschedule) {
-                    // TODO Could limit number of retries
-                    executor.schedule(this, 3, TimeUnit.SECONDS);
-                }
-            }
-        });
-    }
-
-    /**
-     * Removes a server from the replica set.
-     * <p/>
-     * Submits a task that waits for the member to be down and for the replica 
set to have a primary
-     * member, then reconfigures the set to remove the member, to {@link 
#executor}. If either of the
-     * two conditions are not met then the task reschedules itself.
-     *
-     * @param member The server to be removed from the replica set.
-     */
-    private void serverRemoved(final MongoDBServer member) {
-        if (LOG.isDebugEnabled())
-            LOG.debug("Scheduling removal of member from {}: {}", getName(), 
member);
-        // FIXME is there a chance of race here?
-        if (member.equals(getAttribute(PRIMARY_ENTITY)))
-            setAttribute(PRIMARY_ENTITY, null);
-        executor.submit(new Runnable() {
-            @Override
-            public void run() {
-                // Wait until the server has been stopped before reconfiguring 
the set. Quoth the MongoDB doc:
-                // for best results always shut down the mongod instance 
before removing it from a replica set.
-                Boolean isAvailable = 
member.getAttribute(MongoDBServer.SERVICE_UP);
-                // Wait for the replica set to elect a new primary if the set 
is reconfiguring itself.
-                MongoDBServer primary = getPrimary();
-                boolean reschedule;
-                
-                if (primary != null && !isAvailable) {
-                    boolean removed = 
primary.removeMemberFromReplicaSet(member);
-                    if (removed) {
-                        LOG.info("Removed {} from replica set {}", member, 
getName());
-                        reschedule = false;
-                    } else {
-                        if (LOG.isDebugEnabled()) {
-                            LOG.debug("{} could not be removed from replica 
set via {}; rescheduling", member, getName());
-                        }
-                        reschedule = true;
-                    }
-
-                } else {
-                    if (LOG.isTraceEnabled()) {
-                        LOG.trace("Rescheduling removal of member {} from 
replica set {}: service_up={}, primary={}",
-                            new Object[]{member, getName(), isAvailable, 
primary});
-                    }
-                    reschedule = true;
-                }
-                
-                if (reschedule) {
-                    // TODO Could limit number of retries
-                    executor.schedule(this, 3, TimeUnit.SECONDS);
-                }
-            }
-        });
-    }
-
-    @Override
-    public void start(Collection<? extends Location> locations) {
-        // Promises that all the cluster's members have SERVICE_UP true on 
returning.
-        super.start(locations);
-        policy = addPolicy(PolicySpec.create(MemberTrackingPolicy.class)
-                .displayName(getName() + " membership tracker")
-                .configure("group", this));
-
-        for (AttributeSensor<Long> sensor: SENSORS_TO_SUM)
-            addEnricher(Enrichers.builder()
-                    .aggregating(sensor)
-                    .publishing(sensor)
-                    .fromMembers()
-                    .computingSum()
-                    .valueToReportIfNoSensors(null)
-                    .defaultValueForUnreportedSensors(null)
-                    .build());
-        
-        // FIXME would it be simpler to have a *subscription* on four or five 
sensors on allMembers, including SERVICE_UP
-        // (which we currently don't check), rather than an enricher, and call 
to an "update" method?
-        addEnricher(Enrichers.builder()
-                .aggregating(MongoDBServer.REPLICA_SET_PRIMARY_ENDPOINT)
-                .publishing(MongoDBServer.REPLICA_SET_PRIMARY_ENDPOINT)
-                .fromMembers()
-                .valueToReportIfNoSensors(null)
-                .computing(new Function<Collection<String>, String>() {
-                        @Override
-                        public String apply(Collection<String> input) {
-                            if (input==null || input.isEmpty()) return null;
-                            Set<String> distinct = MutableSet.of();
-                            for (String endpoint: input)
-                                if (!Strings.isBlank(endpoint))
-                                    distinct.add(endpoint);
-                            if (distinct.size()>1)
-                                LOG.warn("Mongo replica set 
"+MongoDBReplicaSetImpl.this+" detetcted multiple masters (transitioning?): 
"+distinct);
-                            return input.iterator().next();
-                        }})
-                .build());
-
-        addEnricher(Enrichers.builder()
-                .aggregating(MongoDBServer.MONGO_SERVER_ENDPOINT)
-                .publishing(REPLICA_SET_ENDPOINTS)
-                .fromMembers()
-                .valueToReportIfNoSensors(null)
-                .computing(new Function<Collection<String>, List<String>>() {
-                        @Override
-                        public List<String> apply(Collection<String> input) {
-                            Set<String> endpoints = new TreeSet<String>();
-                            for (String endpoint: input) {
-                                if (!Strings.isBlank(endpoint)) {
-                                    endpoints.add(endpoint);
-                                }
-                            }
-                            return MutableList.copyOf(endpoints);
-                        }})
-                .build());
-
-        subscribeToMembers(this, MongoDBServer.IS_PRIMARY_FOR_REPLICA_SET, new 
SensorEventListener<Boolean>() {
-            @Override public void onEvent(SensorEvent<Boolean> event) {
-                if (Boolean.TRUE == event.getValue())
-                    setAttribute(PRIMARY_ENTITY, 
(MongoDBServer)event.getSource());
-            }
-        });
-
-    }
-
-    @Override
-    public void stop() {
-        // Do we want to remove the members from the replica set?
-        //  - if the set is being stopped forever it's irrelevant
-        //  - if the set might be restarted I think it just inconveniences us
-        // Terminate the executor immediately.
-        // TODO Note that after this the executor will not run if the set is 
restarted.
-        executor.shutdownNow();
-        super.stop();
-        setAttribute(Startable.SERVICE_UP, false);
-    }
-
-    @Override
-    public void onManagementStopped() {
-        super.onManagementStopped();
-        executor.shutdownNow();
-    }
-    
-    public static class MemberTrackingPolicy extends 
AbstractMembershipTrackingPolicy {
-        @Override protected void onEntityChange(Entity member) {
-            // Ignored
-        }
-        @Override protected void onEntityAdded(Entity member) {
-            ((MongoDBReplicaSetImpl)entity).serverAdded((MongoDBServer) 
member);
-        }
-        @Override protected void onEntityRemoved(Entity member) {
-            ((MongoDBReplicaSetImpl)entity).serverRemoved((MongoDBServer) 
member);
-        }
-    };
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBServer.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBServer.java 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBServer.java
deleted file mode 100644
index c829b3a..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBServer.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb;
-
-import org.bson.BasicBSONObject;
-
-import org.apache.brooklyn.catalog.Catalog;
-import brooklyn.config.ConfigKey;
-import brooklyn.entity.basic.ConfigKeys;
-import brooklyn.entity.proxying.ImplementedBy;
-import brooklyn.event.AttributeSensor;
-import brooklyn.event.AttributeSensor.SensorPersistenceMode;
-import brooklyn.event.basic.BasicConfigKey;
-import brooklyn.event.basic.PortAttributeSensorAndConfigKey;
-import brooklyn.event.basic.Sensors;
-import brooklyn.util.flags.SetFromFlag;
-
-@Catalog(name="MongoDB Server",
-    description="MongoDB (from \"humongous\") is a scalable, high-performance, 
open source NoSQL database",
-    iconUrl="classpath:///mongodb-logo.png")
-@ImplementedBy(MongoDBServerImpl.class)
-public interface MongoDBServer extends AbstractMongoDBServer {
-
-    @SetFromFlag("mongodbConfTemplateUrl")
-    ConfigKey<String> MONGODB_CONF_TEMPLATE_URL = 
ConfigKeys.newConfigKeyWithDefault(
-            AbstractMongoDBServer.MONGODB_CONF_TEMPLATE_URL,
-            "classpath://brooklyn/entity/nosql/mongodb/default-mongod.conf");
-
-    // See 
http://docs.mongodb.org/ecosystem/tools/http-interfaces/#http-console
-    // This is *always* 1000 more than port. We disable if it is not available.
-    PortAttributeSensorAndConfigKey HTTP_PORT =
-        new PortAttributeSensorAndConfigKey("mongodb.server.httpPort", "HTTP 
port for the server (estimated)", "28017+");
-
-    @SetFromFlag("enableRestInterface")
-    ConfigKey<Boolean> ENABLE_REST_INTERFACE = ConfigKeys.newBooleanConfigKey(
-            "mongodb.config.enable_rest", "Adds --rest to server startup flags 
when true", Boolean.FALSE);
-
-    AttributeSensor<String> HTTP_INTERFACE_URL = Sensors.newStringSensor(
-            "mongodb.server.http_interface", "URL of the server's HTTP 
console");
-
-    AttributeSensor<BasicBSONObject> STATUS_BSON = 
Sensors.builder(BasicBSONObject.class, "mongodb.server.status.bson")
-            .description("Server status (BSON/JSON map ojbect)")
-            .persistence(SensorPersistenceMode.NONE)
-            .build();
-    
-    AttributeSensor<Double> UPTIME_SECONDS = Sensors.newDoubleSensor(
-            "mongodb.server.uptime", "Server uptime in seconds");
-
-    AttributeSensor<Long> OPCOUNTERS_INSERTS = Sensors.newLongSensor(
-            "mongodb.server.opcounters.insert", "Server inserts");
-
-    AttributeSensor<Long> OPCOUNTERS_QUERIES = Sensors.newLongSensor(
-            "mongodb.server.opcounters.query", "Server queries");
-
-    AttributeSensor<Long> OPCOUNTERS_UPDATES = Sensors.newLongSensor(
-            "mongodb.server.opcounters.update", "Server updates");
-
-    AttributeSensor<Long> OPCOUNTERS_DELETES = Sensors.newLongSensor(
-            "mongodb.server.opcounters.delete", "Server deletes");
-
-    AttributeSensor<Long> OPCOUNTERS_GETMORE = Sensors.newLongSensor(
-            "mongodb.server.opcounters.getmore", "Server getmores");
-
-    AttributeSensor<Long> OPCOUNTERS_COMMAND = Sensors.newLongSensor(
-            "mongodb.server.opcounters.command", "Server commands");
-
-    AttributeSensor<Long> NETWORK_BYTES_IN = Sensors.newLongSensor(
-            "mongodb.server.network.bytesIn", "Server incoming network traffic 
(in bytes)");
-
-    AttributeSensor<Long> NETWORK_BYTES_OUT = Sensors.newLongSensor(
-            "mongodb.server.network.bytesOut", "Server outgoing network 
traffic (in bytes)");
-
-    AttributeSensor<Long> NETWORK_NUM_REQUESTS = Sensors.newLongSensor(
-            "mongodb.server.network.numRequests", "Server network requests");
-
-    /** A single server's replica set configuration **/
-    ConfigKey<MongoDBReplicaSet> REPLICA_SET = new 
BasicConfigKey<MongoDBReplicaSet>(MongoDBReplicaSet.class,
-            "mongodb.replicaset", "The replica set to which the server 
belongs. " +
-            "Users should not set this directly when creating a new replica 
set.");
-
-    AttributeSensor<ReplicaSetMemberStatus> REPLICA_SET_MEMBER_STATUS = 
Sensors.newSensor(
-            ReplicaSetMemberStatus.class, 
"mongodb.server.replicaSet.memberStatus", "The status of this server in the 
replica set");
-
-    AttributeSensor<Boolean> IS_PRIMARY_FOR_REPLICA_SET = 
Sensors.newBooleanSensor(
-            "mongodb.server.replicaSet.isPrimary", "True if this server is the 
write master for the replica set");
-
-    AttributeSensor<Boolean> IS_SECONDARY_FOR_REPLICA_SET = 
Sensors.newBooleanSensor(
-            "mongodb.server.replicaSet.isSecondary", "True if this server is a 
secondary server in the replica set");
-
-    AttributeSensor<String> REPLICA_SET_PRIMARY_ENDPOINT = 
Sensors.newStringSensor(
-            "mongodb.server.replicaSet.primary.endpoint", "The host:port of 
the server which is acting as primary (master) for the replica set");
-
-    AttributeSensor<String> MONGO_SERVER_ENDPOINT = Sensors.newStringSensor(
-            "mongodb.server.endpoint", "The host:port where this server is 
listening");
-
-    /**
-     * @return The replica set the server belongs to, or null if the server is 
a standalone instance.
-     */
-    MongoDBReplicaSet getReplicaSet();
-
-    /**
-     * @return True if the server is a child of {@link MongoDBReplicaSet}.
-     */
-    boolean isReplicaSetMember();
-
-    /**
-     * Initialises a replica set at the server the method is invoked on.
-     * @param replicaSetName The name for the replica set.
-     * @param id The id to be given to this server in the replica set 
configuration.
-     * @return True if initialisation is successful.
-     */
-    boolean initializeReplicaSet(String replicaSetName, Integer id);
-
-    /**
-     * Reconfigures the replica set that the server the method is invoked on 
is the primary member of
-     * to include a new member.
-     * <p/>
-     * Note that this can cause long downtime (typically 10-20s, even up to a 
minute).
-     *
-     * @param secondary New member of the set.
-     * @param id The id for the new set member. Must be unique within the set; 
its validity is not checked.
-     * @return True if addition is successful. False if the server this is 
called on is not the primary
-     *         member of the replica set.
-     */
-    boolean addMemberToReplicaSet(MongoDBServer secondary, Integer id);
-
-    /**
-     * Reconfigures the replica set that the server the method is invoked on 
is the primary member of
-     * to remove the given server.
-     * @param server The server to remove.
-     * @return True if removal is successful. False if the server this is 
called on is not the primary
-     *         member of the replica set.
-     */
-    boolean removeMemberFromReplicaSet(MongoDBServer server);
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBServerImpl.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBServerImpl.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBServerImpl.java
deleted file mode 100644
index a662508..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBServerImpl.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb;
-
-import java.net.UnknownHostException;
-import java.util.concurrent.Callable;
-import java.util.concurrent.TimeUnit;
-
-import org.bson.BasicBSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.config.render.RendererHints;
-import brooklyn.entity.basic.SoftwareProcessImpl;
-import brooklyn.event.SensorEvent;
-import brooklyn.event.SensorEventListener;
-import brooklyn.event.feed.function.FunctionFeed;
-import brooklyn.event.feed.function.FunctionPollConfig;
-import brooklyn.location.access.BrooklynAccessUtils;
-
-import com.google.common.base.Functions;
-import com.google.common.base.Objects;
-import com.google.common.net.HostAndPort;
-
-public class MongoDBServerImpl extends SoftwareProcessImpl implements 
MongoDBServer {
-
-    private static final Logger LOG = 
LoggerFactory.getLogger(MongoDBServerImpl.class);
-
-    static {
-        RendererHints.register(HTTP_INTERFACE_URL, 
RendererHints.namedActionWithUrl());
-    }
-
-    private FunctionFeed serviceStats;
-    private FunctionFeed replicaSetStats;
-    private MongoDBClientSupport client;
-
-    public MongoDBServerImpl() {
-    }
-
-    @Override
-    public Class<?> getDriverInterface() {
-        return MongoDBDriver.class;
-    }
-
-    @Override
-    protected void connectSensors() {
-        super.connectSensors();
-        connectServiceUpIsRunning();
-
-        int port = getAttribute(MongoDBServer.PORT);
-        HostAndPort accessibleAddress = 
BrooklynAccessUtils.getBrooklynAccessibleAddress(this, port);
-        setAttribute(MONGO_SERVER_ENDPOINT, String.format("http://%s:%d";,
-                accessibleAddress.getHostText(), accessibleAddress.getPort()));
-
-        int httpConsolePort = 
BrooklynAccessUtils.getBrooklynAccessibleAddress(this, 
getAttribute(HTTP_PORT)).getPort();
-        setAttribute(HTTP_INTERFACE_URL, String.format("http://%s:%d";,
-                accessibleAddress.getHostText(), httpConsolePort));
-
-        try {
-            client = MongoDBClientSupport.forServer(this);
-        } catch (UnknownHostException e) {
-            LOG.warn("Unable to create client connection to {}, not connecting 
sensors: {} ", this, e.getMessage());
-            return;
-        }
-
-        serviceStats = FunctionFeed.builder()
-                .entity(this)
-                .poll(new FunctionPollConfig<Object, 
BasicBSONObject>(STATUS_BSON)
-                        .period(2, TimeUnit.SECONDS)
-                        .callable(new Callable<BasicBSONObject>() {
-                            @Override
-                            public BasicBSONObject call() throws Exception {
-                                return 
MongoDBServerImpl.this.getAttribute(SERVICE_UP)
-                                    ? client.getServerStatus()
-                                    : null;
-                            }
-                        })
-                        
.onException(Functions.<BasicBSONObject>constant(null)))
-                .build();
-
-        if (isReplicaSetMember()) {
-            replicaSetStats = FunctionFeed.builder()
-                    .entity(this)
-                    .poll(new FunctionPollConfig<Object, 
ReplicaSetMemberStatus>(REPLICA_SET_MEMBER_STATUS)
-                            .period(2, TimeUnit.SECONDS)
-                            .callable(new Callable<ReplicaSetMemberStatus>() {
-                                /**
-                                 * Calls {@link 
MongoDBClientSupport#getReplicaSetStatus} and
-                                 * extracts <code>myState</code> from the 
response.
-                                 * @return
-                                 *      The appropriate {@link 
brooklyn.entity.nosql.mongodb.ReplicaSetMemberStatus}
-                                 *      if <code>myState</code> was non-null, 
{@link ReplicaSetMemberStatus#UNKNOWN} otherwise.
-                                 */
-                                @Override
-                                public ReplicaSetMemberStatus call() {
-                                    BasicBSONObject serverStatus = 
client.getReplicaSetStatus();
-                                    int state = serverStatus.getInt("myState", 
-1);
-                                    return 
ReplicaSetMemberStatus.fromCode(state);
-                                }
-                            })
-                            
.onException(Functions.constant(ReplicaSetMemberStatus.UNKNOWN)))
-                    .build();
-        } else {
-            setAttribute(IS_PRIMARY_FOR_REPLICA_SET, false);
-            setAttribute(IS_SECONDARY_FOR_REPLICA_SET, false);
-        }
-
-        // Take interesting details from STATUS.
-        subscribe(this, STATUS_BSON, new 
SensorEventListener<BasicBSONObject>() {
-                @Override public void onEvent(SensorEvent<BasicBSONObject> 
event) {
-                    BasicBSONObject map = event.getValue();
-                    if (map != null && !map.isEmpty()) {
-                        setAttribute(UPTIME_SECONDS, map.getDouble("uptime", 
0));
-
-                        // Operations
-                        BasicBSONObject opcounters = (BasicBSONObject) 
map.get("opcounters");
-                        setAttribute(OPCOUNTERS_INSERTS, 
opcounters.getLong("insert", 0));
-                        setAttribute(OPCOUNTERS_QUERIES, 
opcounters.getLong("query", 0));
-                        setAttribute(OPCOUNTERS_UPDATES, 
opcounters.getLong("update", 0));
-                        setAttribute(OPCOUNTERS_DELETES, 
opcounters.getLong("delete", 0));
-                        setAttribute(OPCOUNTERS_GETMORE, 
opcounters.getLong("getmore", 0));
-                        setAttribute(OPCOUNTERS_COMMAND, 
opcounters.getLong("command", 0));
-
-                        // Network stats
-                        BasicBSONObject network = (BasicBSONObject) 
map.get("network");
-                        setAttribute(NETWORK_BYTES_IN, 
network.getLong("bytesIn", 0));
-                        setAttribute(NETWORK_BYTES_OUT, 
network.getLong("bytesOut", 0));
-                        setAttribute(NETWORK_NUM_REQUESTS, 
network.getLong("numRequests", 0));
-
-                        // Replica set stats
-                        BasicBSONObject repl = (BasicBSONObject) 
map.get("repl");
-                        if (isReplicaSetMember() && repl != null) {
-                            setAttribute(IS_PRIMARY_FOR_REPLICA_SET, 
repl.getBoolean("ismaster"));
-                            setAttribute(IS_SECONDARY_FOR_REPLICA_SET, 
repl.getBoolean("secondary"));
-                            setAttribute(REPLICA_SET_PRIMARY_ENDPOINT, 
repl.getString("primary"));
-                        }
-                    }
-                }
-        });
-    }
-
-    @Override
-    protected void disconnectSensors() {
-        super.disconnectSensors();
-        disconnectServiceUpIsRunning();
-        if (serviceStats != null) serviceStats.stop();
-        if (replicaSetStats != null) replicaSetStats.stop();
-    }
-
-    @Override
-    public MongoDBReplicaSet getReplicaSet() {
-        return getConfig(MongoDBServer.REPLICA_SET);
-    }
-
-    @Override
-    public boolean isReplicaSetMember() {
-        return getReplicaSet() != null;
-    }
-
-    @Override
-    public boolean initializeReplicaSet(String replicaSetName, Integer id) {
-        return client.initializeReplicaSet(replicaSetName, id);
-    }
-
-    @Override
-    public boolean addMemberToReplicaSet(MongoDBServer secondary, Integer id) {
-        // TODO The attributes IS_PRIMARY_FOR_REPLICA_SET and 
REPLICA_SET_MEMBER_STATUS can be out-of-sync.
-        // The former is obtained by an enricher that listens to STATUS_BSON 
(set by client.getServerStatus()).
-        // The latter is set by a different feed doing 
client.getReplicaSetStatus().getInt("myState").
-        // The ReplicaSet uses REPLICA_SET_MEMBER_STATUS to determine which 
node to call.
-        // 
-        // Relying on caller to respect the `false` result, to retry.
-        if (!getAttribute(IS_PRIMARY_FOR_REPLICA_SET)) {
-            LOG.warn("Attempted to add {} to replica set at server that is not 
primary: {}", secondary, this);
-            return false;
-        }
-        return client.addMemberToReplicaSet(secondary, id);
-    }
-
-    @Override
-    public boolean removeMemberFromReplicaSet(MongoDBServer server) {
-        if (!getAttribute(IS_PRIMARY_FOR_REPLICA_SET)) {
-            LOG.warn("Attempted to remove {} from replica set at server that 
is not primary: {}", server, this);
-            return false;
-        }
-        return client.removeMemberFromReplicaSet(server);
-    }
-
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this)
-                .add("id", getId())
-                .add("hostname", getAttribute(HOSTNAME))
-                .add("port", getAttribute(PORT))
-                .toString();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBSshDriver.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBSshDriver.java
deleted file mode 100644
index ed20639..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBSshDriver.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb;
-
-import static com.google.common.base.Preconditions.checkState;
-import brooklyn.location.basic.SshMachineLocation;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-
-public class MongoDBSshDriver extends AbstractMongoDBSshDriver implements 
MongoDBDriver {
-
-    public MongoDBSshDriver(MongoDBServerImpl entity, SshMachineLocation 
machine) {
-        super(entity, machine);
-    }
-
-    @Override
-    public MongoDBServerImpl getEntity() {
-        return MongoDBServerImpl.class.cast(super.getEntity());
-    }
-
-    @Override
-    public void launch() {
-        MongoDBServer server = getEntity();
-
-        ImmutableList.Builder<String> argsBuilder = 
getArgsBuilderWithDefaults(server)
-            .add("--dbpath", getDataDirectory());
-
-        if (server.isReplicaSetMember()) {
-            String replicaSetName = server.getReplicaSet().getName();
-            checkState(!Strings.isNullOrEmpty(replicaSetName), "Replica set 
name must not be null or empty");
-            argsBuilder.add("--replSet", replicaSetName);
-        }
-
-        if 
(Boolean.TRUE.equals(server.getConfig(MongoDBServer.ENABLE_REST_INTERFACE)))
-            argsBuilder.add("--rest");
-
-        launch(argsBuilder);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/ReplicaSetConfig.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/ReplicaSetConfig.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/ReplicaSetConfig.java
deleted file mode 100644
index ab28930..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/ReplicaSetConfig.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Iterator;
-
-import org.bson.BSONObject;
-import org.bson.BasicBSONObject;
-import org.bson.types.BasicBSONList;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Optional;
-import com.google.common.net.HostAndPort;
-
-import brooklyn.location.access.BrooklynAccessUtils;
-
-/**
- * Simplifies the creation of configuration objects for Mongo DB replica sets.
- * <p/>
- * A configuration object is structured like this:
- * <pre>
- * {
- *    "_id" : "replica-set-name",
- *     "version" : 3,
- *    "members" : [
- *        { "_id" : 0, "host" : "Sams.local:27017" },
- *        { "_id" : 1, "host" : "Sams.local:27018" },
- *        { "_id" : 2, "host" : "Sams.local:27019" }
- *    ]
- * }
- * </pre>
- * To add or remove servers to a replica set you must redefine this 
configuration
- * (run <code>replSetReconfig</code> on the primary) with the new 
<code>members</code>
- * list and the <code>version</code> updated.
- */
-public class ReplicaSetConfig {
-
-    private static final Logger LOG = 
LoggerFactory.getLogger(ReplicaSetConfig.class);
-    static final int MAXIMUM_REPLICA_SET_SIZE = 12;
-    static final int MAXIMUM_VOTING_MEMBERS = 7;
-
-    private Optional<HostAndPort> primary = Optional.absent();
-
-    private String name;
-    private Integer version;
-    BasicBSONList members;
-
-    public ReplicaSetConfig(String name) {
-        this(name, new BasicBSONList());
-    }
-
-    public ReplicaSetConfig(String name, BasicBSONList existingMembers) {
-        this.name = name;
-        this.members = existingMembers;
-        this.version = 1;
-    }
-
-    /**
-     * Creates a configuration with the given name.
-     */
-    public static ReplicaSetConfig builder(String name) {
-        return new ReplicaSetConfig(name);
-    }
-
-    /**
-     * Creates a configuration from an existing configuration.
-     * <p/>
-     * Automatically increments the replica set's version number.
-     */
-    public static ReplicaSetConfig fromExistingConfig(BSONObject config) {
-        checkNotNull(config);
-        checkArgument(config.containsField("_id"), "_id missing from replica 
set config");
-        checkArgument(config.containsField("version"), "version missing from 
replica set config");
-        checkArgument(config.containsField("members"), "members missing from 
replica set config");
-
-        String name = (String) config.get("_id");
-        Integer version = (Integer) config.get("version");
-        BasicBSONList members = (BasicBSONList) config.get("members");
-
-        return new ReplicaSetConfig(name, members).version(++version);
-    }
-
-    /**
-     * Sets the version of the configuration. The version number must increase 
as the replica set changes.
-     */
-    public ReplicaSetConfig version(Integer version) {
-        this.version = version;
-        return this;
-    }
-
-    /**
-     * Notes the primary member of the replica. Primary members will always be 
voting members.
-     */
-    public ReplicaSetConfig primary(HostAndPort primary) {
-        this.primary = Optional.of(primary);
-        return this;
-    }
-
-    /**
-     * Adds a new member to the replica set config using {@link 
MongoDBServer#HOSTNAME} and {@link MongoDBServer#PORT}
-     * for hostname and port. Doesn't attempt to check that the id is free.
-     */
-    public ReplicaSetConfig member(MongoDBServer server, Integer id) {
-        // TODO: Switch to SUBNET_HOSTNAME and there should be no need for a 
Brooklyn accessible
-        // address. It will require modification to MongoDBClientSupport, 
though, since it sets
-        // the primary to the host/port accessible from Brooklyn.
-        HostAndPort hap = 
BrooklynAccessUtils.getBrooklynAccessibleAddress(server, 
server.getAttribute(MongoDBServer.PORT));
-        return member(hap.getHostText(), hap.getPort(), id);
-    }
-
-    /**
-     * Adds a new member to the replica set config using the given {@link 
HostAndPort} for hostname and port.
-     * Doesn't attempt to check that the id is free.
-     */
-    public ReplicaSetConfig member(HostAndPort address, Integer id) {
-        return member(address.getHostText(), address.getPort(), id);
-    }
-
-    /**
-     * Adds a new member to the replica set config with the given hostname, 
port and id. Doesn't attempt to check
-     * that the id is free.
-     */
-    public ReplicaSetConfig member(String hostname, Integer port, Integer id) {
-        if (members.size() == MAXIMUM_REPLICA_SET_SIZE) {
-            throw new IllegalStateException(String.format(
-                    "Replica set {} exceeds maximum size of {} with addition 
of member at {}:{}",
-                    new Object[]{name, MAXIMUM_REPLICA_SET_SIZE, hostname, 
port}));
-        }
-        BasicBSONObject member = new BasicBSONObject();
-        member.put("_id", id);
-        member.put("host", String.format("%s:%s", hostname, port));
-        members.add(member);
-        return this;
-    }
-
-    /** Removes the first entity using {@link MongoDBServer#HOSTNAME} and 
{@link MongoDBServer#PORT}. */
-    public ReplicaSetConfig remove(MongoDBServer server) {
-        HostAndPort hap = 
BrooklynAccessUtils.getBrooklynAccessibleAddress(server, 
server.getAttribute(MongoDBServer.PORT));
-        return remove(hap.getHostText(), hap.getPort());
-    }
-
-    /** Removes the first entity with host and port matching the given 
address. */
-    public ReplicaSetConfig remove(HostAndPort address) {
-        return remove(address.getHostText(), address.getPort());
-    }
-
-    /**
-     * Removes the first entity with the given hostname and port from the list 
of members
-     */
-    public ReplicaSetConfig remove(String hostname, Integer port) {
-        String host = String.format("%s:%s", hostname, port);
-        Iterator<Object> it = this.members.iterator();
-        while (it.hasNext()) {
-            Object next = it.next();
-            if (next instanceof BasicBSONObject) {
-                BasicBSONObject basicBSONObject = (BasicBSONObject) next;
-                if (host.equals(basicBSONObject.getString("host"))) {
-                    it.remove();
-                    break;
-                }
-            }
-        }
-        return this;
-    }
-
-    /**
-     * @return A {@link BasicBSONObject} representing the configuration that 
is suitable for a MongoDB server.
-     */
-    public BasicBSONObject build() {
-        setVotingMembers();
-        BasicBSONObject config = new BasicBSONObject();
-        config.put("_id", name);
-        config.put("version", version);
-        config.put("members", members);
-        return config;
-    }
-
-    /**
-     * Selects 1, 3, 5 or 7 members to have a vote. The primary member (as set 
by
-     * {@link #primary(com.google.common.net.HostAndPort)}) is guaranteed a 
vote if
-     * it is in {@link #members}.
-     * <p/>
-     *
-     * Reconfiguring a server to be voters when they previously did not have 
votes generally triggers
-     * a primary election. This confuses the MongoDB Java driver, which logs 
an error like:
-     * <pre>
-     * WARN  emptying DBPortPool to sams.home/192.168.1.64:27019 b/c of error
-     * java.io.EOFException: null
-     *    at org.bson.io.Bits.readFully(Bits.java:48) 
~[mongo-java-driver-2.11.3.jar:na]
-     * WARN  Command { "replSetReconfig" : ... } on 
sams.home/192.168.1.64:27019 failed
-     * com.mongodb.MongoException$Network: Read operation to server 
sams.home/192.168.1.64:27019 failed on database admin
-     *    at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:253) 
~[mongo-java-driver-2.11.3.jar:na]
-     * Caused by: java.io.EOFException: null
-     *    at org.bson.io.Bits.readFully(Bits.java:48) 
~[mongo-java-driver-2.11.3.jar:na]
-     * </pre>
-     *
-     * The MongoDB documentation on <a 
href=http://docs.mongodb.org/manual/tutorial/configure-a-non-voting-replica-set-member/";>
-     * non-voting members</a> says:
-     * <blockquote>
-     *     Initializes a new replica set configuration. Disconnects the shell 
briefly and forces a
-     *     reconnection as the replica set renegotiates which member will be 
primary. As a result,
-     *     the shell will display an error even if this command succeeds.
-     * </blockquote>
-     *
-     * So the problem is more that the MongoDB Java driver does not understand 
why the server
-     * may have disconnected and is to eager to report a problem.
-     */
-    private void setVotingMembers() {
-        if (LOG.isDebugEnabled())
-            LOG.debug("Setting voting and non-voting members of replica set: 
{}", name);
-        boolean seenPrimary = false;
-        String expectedPrimary = primary.isPresent()
-                ? primary.get().getHostText() + ":" + primary.get().getPort()
-                : "";
-
-        // Ensure an odd number of voters
-        int setSize = this.members.size();
-        int nonPrimaryVotingMembers = Math.min(setSize % 2 == 0 ? setSize - 1 
: setSize, MAXIMUM_VOTING_MEMBERS);
-        if (primary.isPresent()) {
-            if (LOG.isTraceEnabled())
-                LOG.trace("Reserving vote for primary: " + expectedPrimary);
-            nonPrimaryVotingMembers -= 1;
-        }
-
-        for (Object member : this.members) {
-            if (member instanceof BasicBSONObject) {
-                BasicBSONObject bsonObject = 
BasicBSONObject.class.cast(member);
-                String host = bsonObject.getString("host");
-
-                // is this member noted as the primary?
-                if (this.primary.isPresent() && expectedPrimary.equals(host)) {
-                    bsonObject.put("votes", 1);
-                    seenPrimary = true;
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("Voting member (primary) of set {}: {}", 
name, host);
-                } else if (nonPrimaryVotingMembers-- > 0) {
-                    bsonObject.put("votes", 1);
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("Voting member of set {}: {}", name, host);
-                } else {
-                    bsonObject.put("votes", 0);
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("Non-voting member of set {}: {}", name, 
host);
-                }
-            } else {
-                LOG.error("Unexpected entry in replica set members list: " + 
member);
-            }
-        }
-
-        if (primary.isPresent() && !seenPrimary) {
-            LOG.warn("Cannot give replica set primary a vote in reconfigured 
set: " +
-                    "primary was indicated as {} but no member with that host 
and port was seen in the set. " +
-                    "The replica set now has an even number of voters.",
-                    this.primary);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/ReplicaSetMemberStatus.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/ReplicaSetMemberStatus.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/ReplicaSetMemberStatus.java
deleted file mode 100644
index 170f097..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/ReplicaSetMemberStatus.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb;
-
-/**
- * @see <a 
href="http://docs.mongodb.org/manual/reference/replica-status/";>Replica set 
status reference</a>
- */
-public enum ReplicaSetMemberStatus {
-
-    STARTUP("Start up, phase 1 (parsing configuration)"),
-    PRIMARY("Primary"),
-    SECONDARY("Secondary"),
-    RECOVERING("Member is recovering (initial sync, post-rollback, stale 
members)"),
-    FATAL("Member has encountered an unrecoverable error"),
-    STARTUP2("Start up, phase 2 (forking threads)"),
-    UNKNOWN("Unknown (the set has never connected to the member)"),
-    ARBITER("Member is an arbiter"),
-    DOWN("Member is not accessible to the set"),
-    ROLLBACK("Member is rolling back data. See rollback"),
-    SHUNNED("Member has been removed from replica set");
-
-    private final String description;
-
-    ReplicaSetMemberStatus(String description) {
-        this.description = description;
-    }
-
-    public static ReplicaSetMemberStatus fromCode(int code) {
-        switch (code) {
-            case 0: return STARTUP;
-            case 1: return PRIMARY;
-            case 2: return SECONDARY;
-            case 3: return RECOVERING;
-            case 4: return FATAL;
-            case 5: return STARTUP2;
-            case 6: return UNKNOWN;
-            case 7: return ARBITER;
-            case 8: return DOWN;
-            case 9: return ROLLBACK;
-            case 10: return SHUNNED;
-            default: return UNKNOWN;
-        }
-    }
-
-    @Override
-    public String toString() {
-        return name() + ": " + description;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/CoLocatedMongoDBRouter.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/CoLocatedMongoDBRouter.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/CoLocatedMongoDBRouter.java
deleted file mode 100644
index eed05d2..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/CoLocatedMongoDBRouter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb.sharding;
-
-import java.util.List;
-import java.util.Map;
-
-import brooklyn.config.ConfigKey;
-import brooklyn.entity.basic.ConfigKeys;
-import brooklyn.entity.basic.SameServerEntity;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.entity.proxying.ImplementedBy;
-import brooklyn.event.AttributeSensor;
-import brooklyn.event.basic.Sensors;
-import brooklyn.util.flags.SetFromFlag;
-
-import com.google.common.reflect.TypeToken;
-
-@ImplementedBy(CoLocatedMongoDBRouterImpl.class)
-public interface CoLocatedMongoDBRouter extends SameServerEntity {
-    @SuppressWarnings("serial")
-    @SetFromFlag("siblingSpecs")
-    ConfigKey<Iterable<EntitySpec<?>>> SIBLING_SPECS = 
ConfigKeys.newConfigKey(new TypeToken<Iterable<EntitySpec<?>>>(){}, 
-            "mongodb.colocatedrouter.sibling.specs", "Collection of 
(configured) specs for entities to be co-located with the router");
-    
-    @SetFromFlag("shardedDeployment")
-    ConfigKey<MongoDBShardedDeployment> SHARDED_DEPLOYMENT = 
ConfigKeys.newConfigKey(MongoDBShardedDeployment.class, 
-            "mongodb.colocatedrouter.shardeddeployment", "Sharded deployment 
to which the router should report");
-
-    /** Deprecated since 0.7.0 use {@link #PROPAGATING_SENSORS} instead. */
-    @Deprecated
-    @SuppressWarnings("serial")
-    @SetFromFlag("propogatingSensors")
-    ConfigKey<List<Map<String, ?>>> PROPOGATING_SENSORS = 
ConfigKeys.newConfigKey(new TypeToken<List<Map<String, ?>>>(){}, 
-            "mongodb.colocatedrouter.propogating.sensors", "List of sensors to 
be propogated from child members");
-
-    @SetFromFlag("propagatingSensors")
-    ConfigKey<List<Map<String, ?>>> PROPAGATING_SENSORS = 
ConfigKeys.newConfigKey(new TypeToken<List<Map<String, ?>>>(){},
-            "mongodb.colocatedrouter.propagating.sensors", "List of sensors to 
be propogated from child members");
-
-    public static AttributeSensor<MongoDBRouter> ROUTER = 
Sensors.newSensor(MongoDBRouter.class,
-            "mongodb.colocatedrouter.router", "Router");
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/CoLocatedMongoDBRouterImpl.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/CoLocatedMongoDBRouterImpl.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/CoLocatedMongoDBRouterImpl.java
deleted file mode 100644
index a8bec4e..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/CoLocatedMongoDBRouterImpl.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb.sharding;
-
-import java.util.Collection;
-
-import brooklyn.enricher.Enrichers;
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.basic.SameServerEntityImpl;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.entity.trait.Startable;
-import brooklyn.event.basic.DependentConfiguration;
-import brooklyn.location.Location;
-
-import com.google.common.base.Predicates;
-import com.google.common.collect.Iterables;
-
-public class CoLocatedMongoDBRouterImpl extends SameServerEntityImpl 
implements CoLocatedMongoDBRouter {
-    @Override
-    public void init() {
-        super.init();
-        
-        for (EntitySpec<?> siblingSpec : 
getConfig(CoLocatedMongoDBRouter.SIBLING_SPECS)) {
-            addChild(siblingSpec);
-        }
-    }
-
-    @Override
-    protected void doStart(Collection<? extends Location> locations) {
-        // TODO Changed to create the router child after init as a workaround.
-        // When we use `mongo-sharded.yaml`, and we call 
-        // `getConfig(CoLocatedMongoDBRouter.SHARDED_DEPLOYMENT)`,
-        // the value is `$brooklyn:component("shardeddeployment")`.
-        // To look up the component, it tries to do 
`entity().getApplication()` to
-        // search the entities for one with the correct id. However if being 
done
-        // during `init()`, then this (which is returned by `entity()`) has 
not had its parent
-        // set, so `entity().getApplication()` returns null.
-        //
-        // We should move this code back to `init()` once we have a solution 
for that.
-        // We can also remove the call to Entities.manage() once this is in 
init() again.
-        
-        MongoDBRouter router = addChild(EntitySpec.create(MongoDBRouter.class)
-                .configure(MongoDBRouter.CONFIG_SERVERS,
-                        DependentConfiguration.attributeWhenReady(
-                                
getConfig(CoLocatedMongoDBRouter.SHARDED_DEPLOYMENT), 
-                                
MongoDBConfigServerCluster.CONFIG_SERVER_ADDRESSES)));
-        Entities.manage(router);
-        setAttribute(ROUTER, (MongoDBRouter) Iterables.tryFind(getChildren(), 
Predicates.instanceOf(MongoDBRouter.class)).get());
-        
addEnricher(Enrichers.builder().propagating(MongoDBRouter.PORT).from(router).build());
-        
-        super.doStart(locations);
-        setAttribute(Startable.SERVICE_UP, true);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServer.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServer.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServer.java
deleted file mode 100644
index 8fd2560..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServer.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb.sharding;
-
-import brooklyn.entity.nosql.mongodb.AbstractMongoDBServer;
-import brooklyn.entity.proxying.ImplementedBy;
-
-@ImplementedBy(MongoDBConfigServerImpl.class)
-public interface MongoDBConfigServer extends AbstractMongoDBServer {
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerCluster.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerCluster.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerCluster.java
deleted file mode 100644
index ae4ea2c..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerCluster.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb.sharding;
-
-import brooklyn.entity.group.DynamicCluster;
-import brooklyn.entity.proxying.ImplementedBy;
-import brooklyn.event.AttributeSensor;
-import brooklyn.event.basic.Sensors;
-
-import com.google.common.reflect.TypeToken;
-
-@ImplementedBy(MongoDBConfigServerClusterImpl.class)
-public interface MongoDBConfigServerCluster extends DynamicCluster {
-
-    @SuppressWarnings("serial")
-    AttributeSensor<Iterable<String>> CONFIG_SERVER_ADDRESSES = 
Sensors.newSensor(new TypeToken<Iterable<String>>() {}, 
-            "mongodb.config.server.addresses", "List of config server 
hostnames and ports");
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerClusterImpl.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerClusterImpl.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerClusterImpl.java
deleted file mode 100644
index c556d05..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerClusterImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb.sharding;
-
-import java.util.Collection;
-
-import brooklyn.entity.Entity;
-import brooklyn.entity.group.DynamicClusterImpl;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.location.Location;
-import brooklyn.location.access.BrooklynAccessUtils;
-
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.net.HostAndPort;
-
-public class MongoDBConfigServerClusterImpl extends DynamicClusterImpl 
implements MongoDBConfigServerCluster {
-    
-    @Override
-    protected EntitySpec<?> getMemberSpec() {
-        if (super.getMemberSpec() != null)
-            return super.getMemberSpec();
-        return EntitySpec.create(MongoDBConfigServer.class);
-    }
-    
-    @Override
-    public void start(Collection<? extends Location> locs) {
-        super.start(locs);
-        
-        // TODO this should be an enricher
-        Iterable<String> memberHostNamesAndPorts = 
Iterables.transform(getMembers(), new Function<Entity, String>() {
-            @Override
-            public String apply(Entity entity) {
-                return 
entity.getAttribute(MongoDBConfigServer.SUBNET_HOSTNAME) + ":" + 
entity.getAttribute(MongoDBConfigServer.PORT);
-            }
-        });
-        setAttribute(MongoDBConfigServerCluster.CONFIG_SERVER_ADDRESSES, 
ImmutableList.copyOf(memberHostNamesAndPorts));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerDriver.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerDriver.java
deleted file mode 100644
index 10122f3..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerDriver.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb.sharding;
-
-import brooklyn.entity.basic.SoftwareProcessDriver;
-
-public interface MongoDBConfigServerDriver extends SoftwareProcessDriver {
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerImpl.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerImpl.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerImpl.java
deleted file mode 100644
index 2414340..0000000
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/sharding/MongoDBConfigServerImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.nosql.mongodb.sharding;
-
-import brooklyn.entity.basic.SoftwareProcessImpl;
-
-public class MongoDBConfigServerImpl extends SoftwareProcessImpl implements 
MongoDBConfigServer {
-
-    @Override
-    public Class<?> getDriverInterface() {
-        return MongoDBConfigServerDriver.class;
-    }
-    
-    @Override
-    protected void connectSensors() {
-        super.connectSensors();
-        connectServiceUpIsRunning();
-    }
-
-}


Reply via email to