Created basic elasticsearch node
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/b158aa31 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/b158aa31 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/b158aa31 Branch: refs/heads/master Commit: b158aa319be25be04c80acc442616c56fa74cdb5 Parents: c2faca4 Author: Martin Harris <[email protected]> Authored: Thu May 29 17:38:50 2014 +0100 Committer: Martin Harris <[email protected]> Committed: Tue Jun 17 10:19:57 2014 +0100 ---------------------------------------------------------------------- .../nosql/elasticsearch/ElasticSearchNode.java | 34 +++++++++ .../elasticsearch/ElasticSearchNodeDriver.java | 7 ++ .../elasticsearch/ElasticSearchNodeImpl.java | 72 ++++++++++++++++++++ .../ElasticSearchNodeSshDriver.java | 70 +++++++++++++++++++ 4 files changed, 183 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b158aa31/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNode.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNode.java b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNode.java new file mode 100644 index 0000000..30d80e9 --- /dev/null +++ b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNode.java @@ -0,0 +1,34 @@ +package brooklyn.entity.nosql.elasticsearch; + +import brooklyn.config.ConfigKey; +import brooklyn.entity.basic.ConfigKeys; +import brooklyn.entity.basic.SoftwareProcess; +import brooklyn.entity.database.DatastoreMixins; +import brooklyn.entity.proxying.ImplementedBy; +import brooklyn.entity.webapp.WebAppServiceConstants; +import brooklyn.event.AttributeSensor; +import brooklyn.event.basic.BasicAttributeSensorAndConfigKey; +import brooklyn.event.basic.PortAttributeSensorAndConfigKey; +import brooklyn.event.basic.Sensors; +import brooklyn.location.basic.PortRanges; +import brooklyn.util.flags.SetFromFlag; + +/** + * An {@link brooklyn.entity.Entity} that represents an ElasticSearch node + */ +@ImplementedBy(ElasticSearchNodeImpl.class) +public interface ElasticSearchNode extends SoftwareProcess, DatastoreMixins.HasDatastoreUrl { + @SetFromFlag("version") + ConfigKey<String> SUGGESTED_VERSION = ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "1.2.0"); + + @SetFromFlag("downloadUrl") + BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new BasicAttributeSensorAndConfigKey<String>( + SoftwareProcess.DOWNLOAD_URL, "https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-${version}.tar.gz"); + + @SetFromFlag("httpPort") + PortAttributeSensorAndConfigKey HTTP_PORT = new PortAttributeSensorAndConfigKey(WebAppServiceConstants.HTTP_PORT, PortRanges.fromString("9200+")); + + AttributeSensor<String> NODE_ID = Sensors.newStringSensor("elasticsearch.node.id"); + AttributeSensor<String> NODE_NAME = Sensors.newStringSensor("elasticsearch.node.name"); + AttributeSensor<String> CLUSTER_NAME = Sensors.newStringSensor("elasticsearch.cluster.name"); +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b158aa31/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeDriver.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeDriver.java new file mode 100644 index 0000000..327640f --- /dev/null +++ b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeDriver.java @@ -0,0 +1,7 @@ +package brooklyn.entity.nosql.elasticsearch; + +import brooklyn.entity.basic.SoftwareProcessDriver; + +public interface ElasticSearchNodeDriver extends SoftwareProcessDriver { + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b158aa31/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeImpl.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeImpl.java new file mode 100644 index 0000000..92c809c --- /dev/null +++ b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeImpl.java @@ -0,0 +1,72 @@ +package brooklyn.entity.nosql.elasticsearch; + +import static com.google.common.base.Preconditions.checkNotNull; +import brooklyn.entity.basic.SoftwareProcessImpl; +import brooklyn.event.feed.http.HttpFeed; +import brooklyn.event.feed.http.HttpPollConfig; +import brooklyn.event.feed.http.HttpValueFunctions; +import brooklyn.event.feed.http.JsonFunctions; +import brooklyn.location.access.BrooklynAccessUtils; + +import com.google.common.base.Function; +import com.google.common.base.Functions; +import com.google.common.net.HostAndPort; +import com.google.gson.JsonElement; + +public class ElasticSearchNodeImpl extends SoftwareProcessImpl implements ElasticSearchNode { + + HttpFeed httpFeed; + + public ElasticSearchNodeImpl() { + + } + + @Override + public Class<ElasticSearchNodeDriver> getDriverInterface() { + return ElasticSearchNodeDriver.class; + } + + @Override + protected void connectSensors() { + super.connectSensors(); + Integer rawPort = getAttribute(HTTP_PORT); + checkNotNull(rawPort, "HTTP_PORT sensors not set for %s; is an acceptable port available?", this); + HostAndPort hp = BrooklynAccessUtils.getBrooklynAccessibleAddress(this, rawPort); + Function<JsonElement, String> getNodeId = new Function<JsonElement, String>() { + @Override public String apply(JsonElement input) { + return input.getAsJsonObject().entrySet().iterator().next().getKey(); + } + }; + Function<JsonElement, JsonElement> getFirstNode = new Function<JsonElement, JsonElement>() { + @Override public JsonElement apply(JsonElement input) { + return input.getAsJsonObject().entrySet().iterator().next().getValue(); + } + }; + httpFeed = HttpFeed.builder() + .entity(this) + .period(1000) + .baseUri(String.format("http://%s:%s/_nodes/_local", hp.getHostText(), hp.getPort())) + .poll(new HttpPollConfig<Boolean>(SERVICE_UP) + .onSuccess(HttpValueFunctions.responseCodeEquals(200)) + .onFailureOrException(Functions.constant(false))) + .poll(new HttpPollConfig<String>(NODE_ID) + .onSuccess(HttpValueFunctions.chain(HttpValueFunctions.jsonContents(), JsonFunctions.walk("nodes"), getNodeId)) + .onFailureOrException(Functions.constant(""))) + .poll(new HttpPollConfig<String>(NODE_NAME) + .onSuccess(HttpValueFunctions.chain(HttpValueFunctions.chain(HttpValueFunctions.jsonContents(), JsonFunctions.walk("nodes"), getFirstNode), + JsonFunctions.walk("name"), JsonFunctions.cast(String.class))) + .onFailureOrException(Functions.constant(""))) + .poll(new HttpPollConfig<String>(CLUSTER_NAME) + .onSuccess(HttpValueFunctions.chain(HttpValueFunctions.chain(HttpValueFunctions.jsonContents(), JsonFunctions.walk("nodes"), getFirstNode), + JsonFunctions.walk("settings", "cluster", "name"), JsonFunctions.cast(String.class))) + .onFailureOrException(Functions.constant(""))) + .build(); + } + + @Override + protected void disconnectSensors() { + if (httpFeed != null) { + httpFeed.stop(); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b158aa31/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java new file mode 100644 index 0000000..f3846ca --- /dev/null +++ b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java @@ -0,0 +1,70 @@ +package brooklyn.entity.nosql.elasticsearch; + +import static java.lang.String.format; + +import java.util.List; + +import com.google.common.collect.ImmutableList; + +import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver; +import brooklyn.entity.basic.Entities; +import brooklyn.entity.basic.EntityLocal; +import brooklyn.entity.drivers.downloads.DownloadResolver; +import brooklyn.location.basic.SshMachineLocation; +import brooklyn.util.collections.MutableMap; +import brooklyn.util.ssh.BashCommands; + +public class ElasticSearchNodeSshDriver extends AbstractSoftwareProcessSshDriver implements ElasticSearchNodeDriver { + + public ElasticSearchNodeSshDriver(EntityLocal entity, SshMachineLocation machine) { + super(entity, machine); + } + + @Override + public void install() { + DownloadResolver resolver = Entities.newDownloader(this); + List<String> urls = resolver.getTargets(); + String saveAs = resolver.getFilename(); + + List<String> commands = ImmutableList.<String>builder() + .addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs)) + .add(String.format("tar zxvf %s", saveAs)) + .build(); + + newScript(INSTALLING).body.append(commands).execute(); + + setExpandedInstallDir(getInstallDir() + "/" + resolver.getUnpackedDirectoryName(format("elasticsearch-%s", getVersion()))); + } + + @Override + public void customize() { + // TODO Auto-generated method stub + + } + + @Override + public void launch() { + String pidFile = getRunDir() + "/" + AbstractSoftwareProcessSshDriver.PID_FILENAME; + entity.setAttribute(ElasticSearchNode.PID_FILE, pidFile); + newScript(MutableMap.of("usePidFile", false), LAUNCHING) + .updateTaskAndFailOnNonZeroResultCode() + .body.append(String.format("%s/bin/elasticsearch -d -p %s > out.log 2> err.log < /dev/null", getExpandedInstallDir(), pidFile)) + .execute(); + } + + @Override + public boolean isRunning() { + return newScript(MutableMap.of("usePidFile", true), CHECK_RUNNING).execute() == 0; + } + + @Override + public void stop() { + newScript(MutableMap.of("usePidFile", true), STOPPING).execute(); + } + + @Override + public void kill() { + newScript(MutableMap.of("usePidFile", true), KILLING).execute(); + } + +}
