Repository: incubator-brooklyn Updated Branches: refs/heads/master addf30e23 -> 125f01e00
Nodejs riak sample app - Refactoring the NodeJsWebAppSshDriver install packages from package.json as non-root Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/ac3bab73 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/ac3bab73 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/ac3bab73 Branch: refs/heads/master Commit: ac3bab73dc271a6c9e5e2f769e9c1d5e2f053b85 Parents: 7b97cee Author: Valentin Aitken <[email protected]> Authored: Wed Apr 22 20:56:49 2015 +0300 Committer: Valentin Aitken <[email protected]> Committed: Sun Apr 26 20:27:57 2015 +0300 ---------------------------------------------------------------------- .../brooklyn/demo/nodejs-riak-todo.yaml | 46 ++++++++++++++++++++ .../brooklyn/entity/nosql/riak/RiakCluster.java | 2 + .../entity/nosql/riak/RiakClusterImpl.java | 3 ++ .../webapp/nodejs/NodeJsWebAppSshDriver.java | 13 +++--- 4 files changed, 59 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ac3bab73/examples/simple-web-cluster/src/main/resources/brooklyn/demo/nodejs-riak-todo.yaml ---------------------------------------------------------------------- diff --git a/examples/simple-web-cluster/src/main/resources/brooklyn/demo/nodejs-riak-todo.yaml b/examples/simple-web-cluster/src/main/resources/brooklyn/demo/nodejs-riak-todo.yaml new file mode 100644 index 0000000..d963671 --- /dev/null +++ b/examples/simple-web-cluster/src/main/resources/brooklyn/demo/nodejs-riak-todo.yaml @@ -0,0 +1,46 @@ +# 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. + +name: "Node.JS Todo Application" +origin: "https://github.com/amirrajan/nodejs-todo/" +location: + jclouds:aws-ec2:us-west-1: + imageId: us-west-1/ami-c33cdd87 +services: +- type: brooklyn.entity.nosql.riak.RiakCluster + initialSize: 2 + id: mycluster + brooklyn.config: + provisioning.properties: + osFamily: centos + minCores: 4 + minRam: 2048 +- type: brooklyn.entity.webapp.nodejs.NodeJsWebAppService + id: nodejs-riak1 + name: "Node.JS" + brooklyn.config: + gitRepoUrl: + "https://github.com/bostko/nodejs-todo.git" + appFileName: server.js + appName: nodejs-todo + nodePackages: + - basho-riak-client + env: + NODE_ENV: production + RIAK_NODES: > + $brooklyn:component("mycluster").attributeWhenReady("riak.cluster.nodeListPbPort") + launch.latch: $brooklyn:component("mycluster").attributeWhenReady("service.isUp") \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ac3bab73/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakCluster.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakCluster.java b/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakCluster.java index a5a3838..41aa6be 100644 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakCluster.java +++ b/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakCluster.java @@ -54,6 +54,8 @@ public interface RiakCluster extends DynamicCluster { AttributeSensor<String> NODE_LIST = Sensors.newStringSensor("riak.cluster.nodeList", "List of nodes (including ports), comma separated"); + AttributeSensor<String> NODE_LIST_PB_PORT = Sensors.newStringSensor("riak.cluster.nodeListPbPort", "List of nodes (including ports for riak db clients), comma separated"); + AttributeSensor<URI> RIAK_CONSOLE_URI = Attributes.MAIN_URI; } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ac3bab73/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakClusterImpl.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakClusterImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakClusterImpl.java index becaee7..637346e 100644 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakClusterImpl.java +++ b/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakClusterImpl.java @@ -182,13 +182,16 @@ public class RiakClusterImpl extends DynamicClusterImpl implements RiakCluster { private void calculateClusterAddresses() { List<String> addresses = Lists.newArrayList(); + List<String> addressesPbPort = Lists.newArrayList(); for (Entity entity : this.getMembers()) { if (entity instanceof RiakNode && entity.getAttribute(Attributes.SERVICE_UP)) { RiakNode riakNode = (RiakNode) entity; addresses.add(riakNode.getAttribute(Attributes.SUBNET_HOSTNAME) + ":" + riakNode.getAttribute(RiakNode.RIAK_WEB_PORT)); + addressesPbPort.add(riakNode.getAttribute(Attributes.SUBNET_HOSTNAME) + ":" + riakNode.getAttribute(RiakNode.RIAK_PB_PORT)); } } setAttribute(RiakCluster.NODE_LIST, Joiner.on(",").join(addresses)); + setAttribute(RiakCluster.NODE_LIST_PB_PORT, Joiner.on(",").join(addressesPbPort)); } protected boolean belongsInServerPool(Entity member) { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ac3bab73/software/webapp/src/main/java/brooklyn/entity/webapp/nodejs/NodeJsWebAppSshDriver.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/nodejs/NodeJsWebAppSshDriver.java b/software/webapp/src/main/java/brooklyn/entity/webapp/nodejs/NodeJsWebAppSshDriver.java index fb2eb25..3beee70 100644 --- a/software/webapp/src/main/java/brooklyn/entity/webapp/nodejs/NodeJsWebAppSshDriver.java +++ b/software/webapp/src/main/java/brooklyn/entity/webapp/nodejs/NodeJsWebAppSshDriver.java @@ -103,6 +103,7 @@ public class NodeJsWebAppSshDriver extends AbstractSoftwareProcessSshDriver impl BashCommands.installPackage("software-properties-common python-software-properties python g++ make"), BashCommands.sudo("add-apt-repository ppa:chris-lea/node.js")))) .add(BashCommands.installPackage(MutableMap.of("yum", "git nodejs npm", "apt", "git-core nodejs"), null)) + .add("mkdir \"$HOME/.npm\"") .add(BashCommands.sudo("npm install -g n")) .add(BashCommands.sudo("n " + getEntity().getConfig(SoftwareProcess.SUGGESTED_VERSION))) .build(); @@ -116,11 +117,6 @@ public class NodeJsWebAppSshDriver extends AbstractSoftwareProcessSshDriver impl public void customize() { List<String> commands = Lists.newLinkedList(); - List<String> packages = getEntity().getConfig(NodeJsWebAppService.NODE_PACKAGE_LIST); - if (packages != null && packages.size() > 0) { - commands.add(BashCommands.sudo("npm install -g " + Joiner.on(' ').join(packages))); - } - String gitRepoUrl = getEntity().getConfig(NodeJsWebAppService.APP_GIT_REPOSITORY_URL); String archiveUrl = getEntity().getConfig(NodeJsWebAppService.APP_ARCHIVE_URL); String appName = getEntity().getConfig(NodeJsWebAppService.APP_NAME); @@ -128,12 +124,19 @@ public class NodeJsWebAppSshDriver extends AbstractSoftwareProcessSshDriver impl throw new IllegalStateException("Only one of Git or archive URL must be set for " + getEntity()); } else if (Strings.isNonBlank(gitRepoUrl)) { commands.add(String.format("git clone %s %s", gitRepoUrl, appName)); + commands.add(String.format("cd %s", appName)); } else if (Strings.isNonBlank(archiveUrl)) { ArchiveUtils.deploy(archiveUrl, getMachine(), getRunDir()); } else { throw new IllegalStateException("At least one of Git or archive URL must be set for " + getEntity()); } + commands.add(BashCommands.ifFileExistsElse1("package.json", "npm install")); + List<String> packages = getEntity().getConfig(NodeJsWebAppService.NODE_PACKAGE_LIST); + if (packages != null && packages.size() > 0) { + commands.add(BashCommands.sudo("npm install -g " + Joiner.on(' ').join(packages))); + } + newScript(CUSTOMIZING) .body.append(commands) .execute();
