@Override
  public void start(Collection<? extends Location> locations) {
    super.start(locations);
    connectSensors();

    Time.sleep(getConfig(DELAY_BEFORE_ADVERTISING_CLUSTER));

    // FIXME: add a quorum to tolerate failed nodes before setting on fire.
    Optional<Entity> anyNode =
        Iterables.tryFind(
            getMembers(),
            new Predicate<Entity>() {

              @Override
              public boolean apply(@Nullable Entity entity) {
                return (entity instanceof RiakNode
                    && hasMemberJoinedCluster(entity)
                    && entity.getAttribute(RiakNode.SERVICE_UP));
              }
            });

    if (anyNode.isPresent()) {
      log.info(
          "Planning and Committing cluster changes on node: {}, cluster: {}",
          anyNode.get().getId(),
          getId());
      Entities.invokeEffector(this, anyNode.get(), RiakNode.COMMIT_RIAK_CLUSTER);
      setAttribute(IS_CLUSTER_INIT, true);
    } else {
      log.warn("No Riak Nodes are found on the cluster: {}. Initialization Failed", getId());
      setAttribute(SERVICE_STATE, Lifecycle.ON_FIRE);
    }
  }
 @Override
 public String executeScript(String commands) {
   return Entities.invokeEffector(
           this,
           this,
           EXECUTE_SCRIPT,
           ConfigBag.newInstance()
               .configure(ExecuteScriptEffectorBody.SCRIPT, commands)
               .getAllConfig())
       .getUnchecked();
 }
 public Task<?> start(Application app, List<? extends Location> locations) {
   return Entities.invokeEffector(
       (EntityLocal) app, app, Startable.START, MutableMap.of("locations", locations));
 }
  protected synchronized void onServerPoolMemberChanged(Entity member) {
    if (log.isTraceEnabled())
      log.trace(
          "For {}, considering membership of {} which is in locations {}",
          new Object[] {this, member, member.getLocations()});

    if (belongsInServerPool(member)) {
      // TODO can we discover the nodes by asking the riak cluster, rather than assuming what we add
      // will be in there?
      // TODO and can we do join as part of node starting?

      Map<Entity, String> nodes = getAttribute(RIAK_CLUSTER_NODES);
      if (nodes == null) nodes = Maps.newLinkedHashMap();
      String riakName = getRiakName(member);

      if (riakName == null) {
        log.error("Unable to get riak name for node: {}", member.getId());
      } else {
        // flag a first node to be the first node in the riak cluster.
        if (!isFirstNodeSet.get()) {
          nodes.put(member, riakName);
          setAttribute(RIAK_CLUSTER_NODES, nodes);

          ((EntityInternal) member)
              .setAttribute(RiakNode.RIAK_NODE_HAS_JOINED_CLUSTER, Boolean.TRUE);
          isFirstNodeSet.set(true);

          log.info(
              "Adding riak node {}: {}; {} to cluster",
              new Object[] {this, member, getRiakName(member)});

        } else {

          // TODO: be wary of erreneous nodes but are still flagged 'in cluster'
          // add the new node to be part of the riak cluster.
          Optional<Entity> anyNodeInCluster =
              Iterables.tryFind(
                  nodes.keySet(),
                  new Predicate<Entity>() {
                    @Override
                    public boolean apply(@Nullable Entity node) {
                      return (node instanceof RiakNode && hasMemberJoinedCluster(node));
                    }
                  });

          if (anyNodeInCluster.isPresent()) {
            if (!nodes.containsKey(member) && !hasMemberJoinedCluster(member)) {

              String anyNodeName = anyNodeInCluster.get().getAttribute(RiakNode.RIAK_NODE_NAME);
              Entities.invokeEffectorWithArgs(
                  this, member, RiakNode.JOIN_RIAK_CLUSTER, anyNodeName);
              if (getAttribute(IS_CLUSTER_INIT)) {
                Entities.invokeEffector(
                    RiakClusterImpl.this, anyNodeInCluster.get(), RiakNode.COMMIT_RIAK_CLUSTER);
              }
              nodes.put(member, riakName);
              setAttribute(RIAK_CLUSTER_NODES, nodes);
              log.info(
                  "Adding riak node {}: {}; {} to cluster",
                  new Object[] {this, member, getRiakName(member)});
            }
          } else {
            log.error("entity {}: is not present", member.getId());
          }
        }
      }
    } else {
      Map<Entity, String> nodes = getAttribute(RIAK_CLUSTER_NODES);
      if (nodes != null && nodes.containsKey(member)) {
        final Entity memberToBeRemoved = member;

        Optional<Entity> anyNodeInCluster =
            Iterables.tryFind(
                nodes.keySet(),
                new Predicate<Entity>() {

                  @Override
                  public boolean apply(@Nullable Entity node) {
                    return (node instanceof RiakNode
                        && hasMemberJoinedCluster(node)
                        && !node.equals(memberToBeRemoved));
                  }
                });
        if (anyNodeInCluster.isPresent()) {
          Entities.invokeEffectorWithArgs(
              this,
              anyNodeInCluster.get(),
              RiakNode.LEAVE_RIAK_CLUSTER,
              getRiakName(memberToBeRemoved));
        }

        nodes.remove(member);
        setAttribute(RIAK_CLUSTER_NODES, nodes);
        log.info(
            "Removing riak node {}: {}; {} from cluster",
            new Object[] {this, member, getRiakName(member)});
      }
    }
    if (log.isTraceEnabled()) log.trace("Done {} checkEntity {}", this, member);
  }