Misc tidies to mongoDB following PR review
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/d4bb730a Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/d4bb730a Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/d4bb730a Branch: refs/heads/master Commit: d4bb730ad4309db5be28784a61de637511bfc4ad Parents: aed8448 Author: Martin Harris <[email protected]> Authored: Tue Sep 15 11:39:58 2015 +0100 Committer: Martin Harris <[email protected]> Committed: Tue Sep 15 15:03:01 2015 +0100 ---------------------------------------------------------------------- .../nosql/mongodb/AbstractMongoDBSshDriver.java | 10 +- .../mongodb/MongoDBAuthenticationMixins.java | 4 +- .../mongodb/MongoDBAuthenticationUtils.java | 16 +-- .../nosql/mongodb/MongoDBClientSupport.java | 60 ++++++--- .../nosql/mongodb/MongoDBReplicaSetImpl.java | 121 ++++++++++--------- .../entity/nosql/mongodb/ReplicaSetConfig.java | 4 - .../sharding/CoLocatedMongoDBRouterImpl.java | 40 ++---- .../sharding/MongoDBRouterSshDriver.java | 4 - .../sharding/MongoDBShardedDeploymentImpl.java | 1 - .../apache/brooklyn/util/ssh/BashCommands.java | 12 +- 10 files changed, 132 insertions(+), 140 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d4bb730a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java index 277fafd..c182355 100644 --- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java +++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java @@ -82,8 +82,11 @@ public abstract class AbstractMongoDBSshDriver extends AbstractSoftwareProcessSs String destinationLocation = Os.mergePaths(getRunDir(), "mongodb-keyfile"); entity.sensors().set(AbstractMongoDBServer.MONGODB_KEYFILE_DESTINATION, destinationLocation); String keyfileContents = entity.config().get(AbstractMongoDBServer.MONGODB_KEYFILE_CONTENTS); - if (keyfileContents == null) { + if (Strings.isNullOrEmpty(keyfileContents)) { String keyfileUrl = entity.config().get(AbstractMongoDBServer.MONGODB_KEYFILE_URL); + if (Strings.isNullOrEmpty(keyfileUrl)) { + throw new IllegalStateException("MongoDBAuthenticationUtils.usesAuthentication returned true, but neither keyfileContents nor keyfileUrl are set"); + } copyResource(keyfileUrl, destinationLocation); } else { commands.add(BashCommands.pipeTextToFile(keyfileContents, destinationLocation)); @@ -211,13 +214,12 @@ public abstract class AbstractMongoDBSshDriver extends AbstractSoftwareProcessSs protected void launch(ImmutableList.Builder<String> argsBuilder) { String args = Joiner.on(" ").join(argsBuilder.build()); - List<String> commands = new LinkedList<String>(); - commands.add(String.format("%s/bin/mongod %s > out.log 2> err.log < /dev/null", getExpandedInstallDir(), args)); + String command = String.format("%s/bin/mongod %s >> out.log 2>> err.log < /dev/null", getExpandedInstallDir(), args); newScript(LAUNCHING) .setFlag(SshTool.PROP_CONNECT_TIMEOUT, Duration.TEN_SECONDS.toMilliseconds()) .updateTaskAndFailOnNonZeroResultCode() - .body.append(commands).execute(); + .body.append(command).execute(); } } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d4bb730a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBAuthenticationMixins.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBAuthenticationMixins.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBAuthenticationMixins.java index a47c384..0ad885b 100644 --- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBAuthenticationMixins.java +++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBAuthenticationMixins.java @@ -28,11 +28,11 @@ import org.apache.brooklyn.util.core.flags.SetFromFlag; public interface MongoDBAuthenticationMixins { @SetFromFlag("mongodbKeyfileContents") ConfigKey<String> MONGODB_KEYFILE_CONTENTS = ConfigKeys.newStringConfigKey( - "mongodb.keyfile.contents", "Contents of the keyfile used for authentication"); + "mongodb.keyfile.contents", "Contents of the keyfile used for authentication. If mongodb.keyfile.contents and mongodb.keyfile.url are both set, mongodb.keyfile.contents will take precedence"); @SetFromFlag("mongodbKeyfileUrl") ConfigKey<String> MONGODB_KEYFILE_URL = ConfigKeys.newStringConfigKey( - "mongodb.keyfile.url", "Location of the keyfile used for authentication"); + "mongodb.keyfile.url", "Location of the keyfile used for authentication. If mongodb.keyfile.contents and mongodb.keyfile.url are both set, mongodb.keyfile.contents will take precedence"); @SetFromFlag("rootUsername") BasicAttributeSensorAndConfigKey<String> ROOT_USERNAME = http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d4bb730a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBAuthenticationUtils.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBAuthenticationUtils.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBAuthenticationUtils.java index 0c337a0..41808ae 100644 --- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBAuthenticationUtils.java +++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBAuthenticationUtils.java @@ -39,26 +39,23 @@ public class MongoDBAuthenticationUtils { public static boolean usesAuthentication(Entity entity) { String keyfileContents = entity.config().get(MongoDBAuthenticationMixins.MONGODB_KEYFILE_CONTENTS); String keyfileUrl = entity.config().get(MongoDBAuthenticationMixins.MONGODB_KEYFILE_URL); - if (!(Strings.isEmpty(keyfileContents) || Strings.isEmpty(keyfileUrl))) { - throw new IllegalStateException("keyfile contents and keyfile location cannot both be set"); - } - if (Strings.isEmpty(keyfileContents) && Strings.isEmpty(keyfileUrl)) { - return false; - } - return true; + return Strings.isNonBlank(keyfileContents) || Strings.isNonBlank(keyfileUrl); } public static String getRootPassword(Entity entity) { String password = entity.config().get(MongoDBAuthenticationMixins.ROOT_PASSWORD); if (Strings.isEmpty(password)) { LOG.debug(entity + " has no password specified for " + MongoDBAuthenticationMixins.ROOT_PASSWORD.getName() + "; using a random string"); - password = Strings.makeRandomId(8); + password = Strings.makeRandomId(16); entity.sensors().set(MongoDBAuthenticationMixins.ROOT_PASSWORD, password); entity.config().set(MongoDBAuthenticationMixins.ROOT_PASSWORD, password); } return password; } + /** + * Configures the {@code spec} with authentication configuration from {@code source} + */ public static void setAuthenticationConfig(EntitySpec<?> spec, Entity source) { if (MongoDBAuthenticationUtils.usesAuthentication(source)) { spec.configure(MongoDBAuthenticationMixins.MONGODB_KEYFILE_CONTENTS, source.config().get(MongoDBAuthenticationMixins.MONGODB_KEYFILE_CONTENTS)); @@ -68,6 +65,9 @@ public class MongoDBAuthenticationUtils { } } + /** + * Configures the {@code spec} with authentication configuration from {@code source} + */ public static void setAuthenticationConfig(Entity entity, Entity source) { if (MongoDBAuthenticationUtils.usesAuthentication(source)) { entity.config().set(MongoDBAuthenticationMixins.MONGODB_KEYFILE_CONTENTS, source.config().get(MongoDBAuthenticationMixins.MONGODB_KEYFILE_CONTENTS)); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d4bb730a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBClientSupport.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBClientSupport.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBClientSupport.java index 32c128c..3fadd4d 100644 --- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBClientSupport.java +++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBClientSupport.java @@ -19,8 +19,12 @@ package org.apache.brooklyn.entity.nosql.mongodb; import java.net.UnknownHostException; +import java.util.concurrent.Callable; import org.apache.brooklyn.core.location.access.BrooklynAccessUtils; +import org.apache.brooklyn.util.exceptions.ReferenceWithError; +import org.apache.brooklyn.util.repeat.Repeater; +import org.apache.brooklyn.util.time.Duration; import org.bson.BSONObject; import org.bson.BasicBSONObject; import org.slf4j.Logger; @@ -70,10 +74,15 @@ public class MongoDBClientSupport { private static final BasicBSONObject EMPTY_RESPONSE = new BasicBSONObject(); - public MongoDBClientSupport(ServerAddress standalone, boolean usesAuthentication, String username, String password, String authenticationDatabase) { + public MongoDBClientSupport(ServerAddress standalone) { + address = standalone; + usesAuthentication = false; + } + + public MongoDBClientSupport(ServerAddress standalone, String username, String password, String authenticationDatabase) { // We could also use a MongoClient to access an entire replica set. See MongoClient(List<ServerAddress>). address = standalone; - this.usesAuthentication = usesAuthentication; + this.usesAuthentication = true; this.username = username; this.password = password; this.authenticationDatabase = authenticationDatabase; @@ -85,8 +94,12 @@ public class MongoDBClientSupport { 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, MongoDBAuthenticationUtils.usesAuthentication(standalone), standalone.sensors().get(MongoDBAuthenticationMixins.ROOT_USERNAME), - standalone.sensors().get(MongoDBAuthenticationMixins.ROOT_PASSWORD), standalone.sensors().get(MongoDBAuthenticationMixins.AUTHENTICATION_DATABASE)); + if (MongoDBAuthenticationUtils.usesAuthentication(standalone)) { + return new MongoDBClientSupport(address, standalone.sensors().get(MongoDBAuthenticationMixins.ROOT_USERNAME), + standalone.sensors().get(MongoDBAuthenticationMixins.ROOT_PASSWORD), standalone.sensors().get(MongoDBAuthenticationMixins.AUTHENTICATION_DATABASE)); + } else { + return new MongoDBClientSupport(address); + } } private ServerAddress getServerAddress() { @@ -107,28 +120,35 @@ public class MongoDBClientSupport { return runDBCommand(database, new BasicDBObject(command, Boolean.TRUE)); } - private Optional<CommandResult> runDBCommand(String database, DBObject command) { + private Optional<CommandResult> runDBCommand(String database, final DBObject command) { MongoClient client = client(); try { - DB db = client.getDB(database); - CommandResult status = null; + final DB db = client.getDB(database); + final CommandResult[] status = new CommandResult[1]; // The mongoDB client can occasionally fail to connect. Try up to 5 times to run the command - for (int i = 0; i < 5; i++) { - try { - status = db.command(command); - break; - } catch (MongoException e) { - LOG.warn("Command " + command + " on " + getServerAddress() + " failed", e); - if (i == 4) { - return Optional.absent(); - } - } + boolean commandResult = Repeater.create().backoff(Duration.ONE_SECOND, 1.5, null).limitIterationsTo(5) + .until(new Callable<Boolean>() { + @Override + public Boolean call() throws Exception { + try { + status[0] = db.command(command); + return true; + } catch (Exception e) { + LOG.warn("Command " + command + " on " + getServerAddress() + " failed", e); + return false; + } + } + }).run(); + + if (!commandResult) { + return Optional.absent(); } - if (!status.ok()) { + + if (!status[0].ok()) { LOG.debug("Unexpected result of {} on {}: {}", - new Object[] { command, getServerAddress(), status.getErrorMessage() }); + new Object[] { command, getServerAddress(), status[0].getErrorMessage() }); } - return Optional.of(status); + return Optional.of(status[0]); } finally { client.close(); } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d4bb730a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBReplicaSetImpl.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBReplicaSetImpl.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBReplicaSetImpl.java index 046c716..f96a56a 100644 --- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBReplicaSetImpl.java +++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/MongoDBReplicaSetImpl.java @@ -145,6 +145,7 @@ public class MongoDBReplicaSetImpl extends DynamicClusterImpl implements MongoDB EntitySpec<?> spec = config().get(MEMBER_SPEC); if (spec == null) { spec = EntitySpec.create(MongoDBServer.class); + config().set(MEMBER_SPEC, spec); } MongoDBAuthenticationUtils.setAuthenticationConfig(spec, this); return spec; @@ -195,24 +196,28 @@ public class MongoDBReplicaSetImpl extends DynamicClusterImpl implements MongoDB * 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); + try { + 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.ServiceNotUpLogic.updateNotUpIndicator(this, "initialization", "replicaset failed to initialize"); + ServiceStateLogic.setExpectedState(this, Lifecycle.ON_FIRE); + } } else { - ServiceStateLogic.ServiceNotUpLogic.updateNotUpIndicator(this, "initialization", "replicaset failed to initialize"); - ServiceStateLogic.setExpectedState(this, Lifecycle.ON_FIRE); + if (LOG.isDebugEnabled()) + LOG.debug("Scheduling addition of member to {}: {}", getName(), server); + addSecondaryWhenPrimaryIsNonNull(server); } - } else { - if (LOG.isDebugEnabled()) - LOG.debug("Scheduling addition of member to {}: {}", getName(), server); - addSecondaryWhenPrimaryIsNonNull(server); + } catch (Exception e) { + ServiceStateLogic.ServiceNotUpLogic.updateNotUpIndicator((EntityLocal)server, "Failed to update replicaset", e); } } @@ -269,47 +274,51 @@ public class MongoDBReplicaSetImpl extends DynamicClusterImpl implements MongoDB * @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; + try { + 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.isDebugEnabled()) { - LOG.debug("{} could not be removed from replica set via {}; rescheduling", member, getName()); + if (LOG.isTraceEnabled()) { + LOG.trace("Rescheduling removal of member {} from replica set {}: service_up={}, primary={}", + new Object[]{member, getName(), isAvailable, primary}); } reschedule = true; } - } else { - if (LOG.isTraceEnabled()) { - LOG.trace("Rescheduling removal of member {} from replica set {}: service_up={}, primary={}", - new Object[]{member, getName(), isAvailable, primary}); + if (reschedule) { + // TODO Could limit number of retries + executor.schedule(this, 3, TimeUnit.SECONDS); } - reschedule = true; - } - - if (reschedule) { - // TODO Could limit number of retries - executor.schedule(this, 3, TimeUnit.SECONDS); } - } - }); + }); + } catch (Exception e) { + ServiceStateLogic.ServiceNotUpLogic.updateNotUpIndicator((EntityLocal)member, "Failed to update replicaset", e); + } } @Override @@ -401,18 +410,10 @@ public class MongoDBReplicaSetImpl extends DynamicClusterImpl implements MongoDB // Ignored } @Override protected void onEntityAdded(Entity member) { - try { - ((MongoDBReplicaSetImpl) entity).serverAdded((MongoDBServer) member); - } catch (Exception e) { - ServiceStateLogic.ServiceNotUpLogic.updateNotUpIndicator((EntityLocal)member, "Failed to update replicaset", e); - } + ((MongoDBReplicaSetImpl) entity).serverAdded((MongoDBServer) member); } @Override protected void onEntityRemoved(Entity member) { - try { - ((MongoDBReplicaSetImpl) entity).serverRemoved((MongoDBServer) member); - } catch (Exception e) { - ServiceStateLogic.ServiceNotUpLogic.updateNotUpIndicator((EntityLocal)member, "Failed to update replicaset", e); - } + ((MongoDBReplicaSetImpl) entity).serverRemoved((MongoDBServer) member); } } } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d4bb730a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/ReplicaSetConfig.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/ReplicaSetConfig.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/ReplicaSetConfig.java index 9da870e..9ea240b 100644 --- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/ReplicaSetConfig.java +++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/ReplicaSetConfig.java @@ -148,10 +148,6 @@ public class ReplicaSetConfig { BasicBSONObject member = new BasicBSONObject(); member.put("_id", id); member.put("host", String.format("%s:%s", hostname, port)); - if (members.contains(member)) { - LOG.warn("Ignoring attempt to add entity to a set of which it is already a member"); - return this; - } members.add(member); return this; } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d4bb730a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/CoLocatedMongoDBRouterImpl.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/CoLocatedMongoDBRouterImpl.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/CoLocatedMongoDBRouterImpl.java index 0c81de2..f96b517 100644 --- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/CoLocatedMongoDBRouterImpl.java +++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/CoLocatedMongoDBRouterImpl.java @@ -19,7 +19,6 @@ package org.apache.brooklyn.entity.nosql.mongodb.sharding; import java.util.Collection; -import java.util.concurrent.ExecutionException; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.location.Location; @@ -32,61 +31,42 @@ import org.apache.brooklyn.entity.group.AbstractGroup; import org.apache.brooklyn.entity.nosql.mongodb.MongoDBAuthenticationMixins; import org.apache.brooklyn.entity.nosql.mongodb.MongoDBAuthenticationUtils; import org.apache.brooklyn.entity.software.base.SameServerEntityImpl; -import org.apache.brooklyn.util.exceptions.Exceptions; - -import com.google.common.base.Predicates; -import com.google.common.collect.Iterables; public class CoLocatedMongoDBRouterImpl extends SameServerEntityImpl implements CoLocatedMongoDBRouter, MongoDBAuthenticationMixins { - private MongoDBRouter router; - @Override public void init() { super.init(); - router = addChild(EntitySpec.create(MongoDBRouter.class) + MongoDBRouter router = addChild(EntitySpec.create(MongoDBRouter.class) .configure(MongoDBRouter.CONFIG_SERVERS, DependentConfiguration.attributeWhenReady( getConfig(CoLocatedMongoDBRouter.SHARDED_DEPLOYMENT), MongoDBConfigServerCluster.CONFIG_SERVER_ADDRESSES))); + for (EntitySpec<?> siblingSpec : getConfig(CoLocatedMongoDBRouter.SIBLING_SPECS)) { addChild(siblingSpec); } - sensors().set(ROUTER, (MongoDBRouter) Iterables.tryFind(getChildren(), Predicates.instanceOf(MongoDBRouter.class)).get()); + sensors().set(ROUTER, router); } @Override protected void doStart(Collection<? extends Location> locations) { + MongoDBRouter router = sensors().get(ROUTER); - // 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. + // Do not attempt to read the configuration until after the router has been added to the cluster + // as it is at this point that the authentication configuration is set + Task<?> clusterTask = DependentConfiguration.attributeWhenReady(router, AbstractGroup.FIRST); + Entities.submit(this, clusterTask); + clusterTask.getUnchecked(); - try { - // Do not attempt to read the configuration until after the router has been added to the cluster - // as it is at this point that the authentication configuration is set - Task<?> clusterTask = DependentConfiguration.attributeWhenReady(router, AbstractGroup.FIRST); - Entities.submit(this, clusterTask); - clusterTask.get(); - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - } MongoDBAuthenticationUtils.setAuthenticationConfig(router, this); router.sensors().set(MongoDBAuthenticationMixins.ROOT_PASSWORD, router.config().get(MongoDBAuthenticationMixins.ROOT_PASSWORD)); router.sensors().set(MongoDBAuthenticationMixins.ROOT_USERNAME, router.config().get(MongoDBAuthenticationMixins.ROOT_USERNAME)); router.sensors().set(MongoDBAuthenticationMixins.AUTHENTICATION_DATABASE, router.config().get(MongoDBAuthenticationMixins.AUTHENTICATION_DATABASE)); - Entities.manage(router); addEnricher(Enrichers.builder().propagating(MongoDBRouter.PORT).from(router).build()); super.doStart(locations); sensors().set(Startable.SERVICE_UP, true); } + } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d4bb730a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/MongoDBRouterSshDriver.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/MongoDBRouterSshDriver.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/MongoDBRouterSshDriver.java index df73868..816906d 100644 --- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/MongoDBRouterSshDriver.java +++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/MongoDBRouterSshDriver.java @@ -48,8 +48,4 @@ public class MongoDBRouterSshDriver extends AbstractMongoDBSshDriver implements .body.append(command).execute(); } - @Override - public boolean isRunning() { - return super.isRunning(); - } } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d4bb730a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/MongoDBShardedDeploymentImpl.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/MongoDBShardedDeploymentImpl.java b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/MongoDBShardedDeploymentImpl.java index 198e787..5cc217a 100644 --- a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/MongoDBShardedDeploymentImpl.java +++ b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/sharding/MongoDBShardedDeploymentImpl.java @@ -82,7 +82,6 @@ public class MongoDBShardedDeploymentImpl extends AbstractEntity implements Mong // Advertise even if default are used (root password is set in MongoDBAuthenticationUtils) sensors().set(MongoDBAuthenticationMixins.AUTHENTICATION_DATABASE, config().get(MongoDBAuthenticationMixins.AUTHENTICATION_DATABASE)); sensors().set(MongoDBAuthenticationMixins.ROOT_USERNAME, config().get(MongoDBAuthenticationMixins.ROOT_USERNAME)); - sensors().set(MongoDBAuthenticationMixins.MONGODB_KEYFILE_DESTINATION, config().get(MongoDBAuthenticationMixins.MONGODB_KEYFILE_CONTENTS)); ServiceNotUpLogic.updateNotUpIndicator(this, Attributes.SERVICE_STATE_ACTUAL, "stopped"); } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d4bb730a/utils/common/src/main/java/org/apache/brooklyn/util/ssh/BashCommands.java ---------------------------------------------------------------------- diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/ssh/BashCommands.java b/utils/common/src/main/java/org/apache/brooklyn/util/ssh/BashCommands.java index e91d60c..dc75c3a 100644 --- a/utils/common/src/main/java/org/apache/brooklyn/util/ssh/BashCommands.java +++ b/utils/common/src/main/java/org/apache/brooklyn/util/ssh/BashCommands.java @@ -619,17 +619,15 @@ public class BashCommands { /** cats the given text to the given command, using bash << multi-line input syntax */ public static String pipeTextTo(String text, String command) { - String id = Identifiers.makeRandomId(8); - return "cat << EOF_"+id+" | "+command+"\n" + return "cat << EOL_BROOKLYN | "+command+"\n" +text - +"\n"+"EOF_"+id+"\n"; + +"\n"+"EOL_BROOKLYN\n"; } public static String pipeTextToFile(String text, String filepath) { - String id = Identifiers.makeRandomId(8); - return "cat > " + filepath + " << EOL_" + id + "\n" - + text - + "EOL_" + id + "\n"; + return "cat > \"" + filepath + "\" << EOF_BROOKLYN\n" + + text + "\n" + + "EOF_BROOKLYN\n"; } public static String prependToEtcHosts(String ip, String... hostnames) {
