You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2014/07/09 16:45:08 UTC

[2/8] git commit: Created basic elasticsearch node

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 <gi...@nakomis.com>
Authored: Thu May 29 17:38:50 2014 +0100
Committer: Martin Harris <gi...@nakomis.com>
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();
+    }
+
+}