Riak Linux

- Fallback to the old installation method if the packagecloud one fails


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/5d01ab51
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/5d01ab51
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/5d01ab51

Branch: refs/heads/master
Commit: 5d01ab5173a3e84f24ab3962b82be4695aa44f39
Parents: 7e1cbed
Author: Valentin Aitken <[email protected]>
Authored: Tue Mar 10 16:20:35 2015 +0200
Committer: Valentin Aitken <[email protected]>
Committed: Thu Mar 12 13:27:05 2015 +0200

----------------------------------------------------------------------
 .../entity/basic/lifecycle/ScriptHelper.java    |  7 +-
 .../entity/nosql/riak/RiakNodeImpl.java         | 11 +++
 .../entity/nosql/riak/RiakNodeSshDriver.java    | 76 ++++++++++++++++++--
 3 files changed, 87 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5d01ab51/software/base/src/main/java/brooklyn/entity/basic/lifecycle/ScriptHelper.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/brooklyn/entity/basic/lifecycle/ScriptHelper.java 
b/software/base/src/main/java/brooklyn/entity/basic/lifecycle/ScriptHelper.java
index fb71a79..6d524d5 100644
--- 
a/software/base/src/main/java/brooklyn/entity/basic/lifecycle/ScriptHelper.java
+++ 
b/software/base/src/main/java/brooklyn/entity/basic/lifecycle/ScriptHelper.java
@@ -275,6 +275,11 @@ public class ScriptHelper {
         isInessential = true;
     }
 
+    public ScriptHelper inessential() {
+        isInessential = true;
+        return this;
+    }
+
     /** creates a task which will execute this script; note this can only be 
run once per instance of this class */
     public synchronized Task<Integer> newTask() {
         if (task!=null) throw new IllegalStateException("task can only be 
generated once");
@@ -336,7 +341,7 @@ public class ScriptHelper {
             return executeInternal();
         }
     }
-    
+
     @SuppressWarnings({ "rawtypes", "unchecked" })
     public int executeInternal() {
         if (!executionCheck.apply(this)) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5d01ab51/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeImpl.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeImpl.java 
b/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeImpl.java
index f762ac9..769ebac 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeImpl.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeImpl.java
@@ -30,6 +30,7 @@ import javax.annotation.Nullable;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.SoftwareProcessImpl;
 import brooklyn.entity.webapp.WebAppServiceMethods;
+import brooklyn.event.basic.AttributeSensorAndConfigKey;
 import brooklyn.event.feed.http.HttpFeed;
 import brooklyn.event.feed.http.HttpPollConfig;
 import brooklyn.event.feed.http.HttpValueFunctions;
@@ -66,6 +67,16 @@ public class RiakNodeImpl extends SoftwareProcessImpl 
implements RiakNode {
         Entities.getRequiredUrlConfig(this, RIAK_APP_CONFIG_TEMPLATE_URL);
     }
 
+    public boolean isPackageDownloadUrlProvided() {
+        AttributeSensorAndConfigKey[] downloadProperties = 
{DOWNLOAD_URL_RHEL_CENTOS, DOWNLOAD_URL_UBUNTU, DOWNLOAD_URL_DEBIAN};
+        for(AttributeSensorAndConfigKey property : downloadProperties) {
+            
if(!((ConfigurationSupportInternal)config()).getLocalRaw(property).isAbsent()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     @Override
     protected Map<String, Object> 
obtainProvisioningFlags(@SuppressWarnings("rawtypes") 
MachineProvisioningLocation location) {
         ConfigBag result = 
ConfigBag.newInstance(super.obtainProvisioningFlags(location));

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5d01ab51/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
index ed44f4f..aed7ceb 100644
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
+++ 
b/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Map;
 
 import brooklyn.util.ssh.BashCommands;
+import brooklyn.util.task.ssh.SshTasks;
 import com.google.api.client.util.Joiner;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,6 +41,7 @@ import brooklyn.util.collections.MutableMap;
 import brooklyn.util.net.Urls;
 import brooklyn.util.os.Os;
 import brooklyn.util.task.DynamicTasks;
+import brooklyn.util.text.Strings;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -50,6 +52,7 @@ public class RiakNodeSshDriver extends 
AbstractSoftwareProcessSshDriver implemen
 
     private static final Logger LOG = 
LoggerFactory.getLogger(RiakNodeSshDriver.class);
     private static final String sbinPath = 
"$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
+    private static final String INSTALLING_FALLBACK = INSTALLING + "_fallback";
     private boolean isPackageInstall = true;
     private boolean isRiakOnPath = true;
 
@@ -89,7 +92,11 @@ public class RiakNodeSshDriver extends 
AbstractSoftwareProcessSshDriver implemen
         OsDetails osDetails = getMachine().getMachineDetails().getOsDetails();
         List<String> commands = Lists.newLinkedList();
         if (osDetails.isLinux()) {
-            commands.addAll(installFromPackageCloud());
+            if(getEntity().isPackageDownloadUrlProvided()) {
+                
commands.addAll(installLinuxFromPackageUrl(getExpandedInstallDir()));
+            } else {
+                commands.addAll(installFromPackageCloud());
+            }
         } else if (osDetails.isMac()) {
             isPackageInstall = false;
             commands.addAll(installMac());
@@ -99,11 +106,68 @@ public class RiakNodeSshDriver extends 
AbstractSoftwareProcessSshDriver implemen
             throw new IllegalStateException("Machine was not detected as 
linux, mac or windows! Installation does not know how to proceed with " +
                     getMachine() + ". Details: " + 
getMachine().getMachineDetails().getOsDetails());
         }
-        newScript(INSTALLING)
-                .body.append(commands)
-                .failIfBodyEmpty()
-                .failOnNonZeroResultCode()
-                .execute();
+
+        try {
+            newScript(INSTALLING)
+                    .body.append(commands)
+                    .failIfBodyEmpty()
+                    .failOnNonZeroResultCode()
+                    .inessential()
+                    .execute();
+        } catch(RuntimeException e) {
+            if (osDetails.isLinux()) {
+                newScript(INSTALLING_FALLBACK).body
+                        
.append(installLinuxFromPackageUrl(getExpandedInstallDir()))
+                        .failIfBodyEmpty()
+                        .failOnNonZeroResultCode()
+                        .execute();
+            }
+        }
+    }
+
+    private List<String> installLinuxFromPackageUrl(String expandedInstallDir) 
{
+        
DynamicTasks.queueIfPossible(SshTasks.dontRequireTtyForSudo(getMachine(), 
SshTasks.OnFailingTask.WARN_OR_IF_DYNAMIC_FAIL_MARKING_INESSENTIAL)).orSubmitAndBlock();
+
+        String installBin = Urls.mergePaths(expandedInstallDir, "bin");
+        String saveAsYum = "riak.rpm";
+        String saveAsApt = "riak.deb";
+        OsDetails osDetails = getMachine().getOsDetails();
+
+        String downloadUrl;
+        String osReleaseCmd;
+        if ("debian".equalsIgnoreCase(osDetails.getName())) {
+            // TODO osDetails.getName() is returning "linux", instead of 
debian/ubuntu on AWS with jenkins image,
+            //      running as integration test targetting localhost.
+            // TODO Debian support (default debian image fails with 'sudo: 
command not found')
+            downloadUrl = 
(String)entity.getAttribute(RiakNode.DOWNLOAD_URL_DEBIAN);
+            osReleaseCmd = osDetails.getVersion().substring(0, 
osDetails.getVersion().indexOf("."));
+        } else {
+            // assume Ubuntu
+            downloadUrl = 
(String)entity.getAttribute(RiakNode.DOWNLOAD_URL_UBUNTU);
+            osReleaseCmd = "`lsb_release -sc` && " +
+                    "export OS_RELEASE=`([[ \"lucid natty precise\" =~ (^| 
)\\$OS_RELEASE($| ) ]] && echo $OS_RELEASE || echo precise)`";
+        }
+        String apt = chainGroup(
+                //debian fix
+                "export 
PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+                "which apt-get",
+                ok(sudo("apt-get -y --allow-unauthenticated install logrotate 
libpam0g-dev libssl0.9.8")),
+                "export OS_NAME=" + Strings.toLowerCase(osDetails.getName()),
+                "export OS_RELEASE=" + osReleaseCmd,
+                String.format("wget -O %s %s", saveAsApt, downloadUrl),
+                sudo(String.format("dpkg -i %s", saveAsApt)));
+        String yum = chainGroup(
+                "which yum",
+                ok(sudo("yum -y install openssl")),
+                String.format("wget -O %s %s", saveAsYum, 
entity.getAttribute(RiakNode.DOWNLOAD_URL_RHEL_CENTOS)),
+                sudo(String.format("rpm -Uvh %s", saveAsYum)));
+        return ImmutableList.<String>builder()
+                .add("mkdir -p " + installBin)
+                .add(INSTALL_CURL)
+                .add(alternatives(apt, yum))
+                .add("ln -s `which riak` " + Urls.mergePaths(installBin, 
"riak"))
+                .add("ln -s `which riak-admin` " + Urls.mergePaths(installBin, 
"riak-admin"))
+                .build();
     }
 
     private List<String> installFromPackageCloud() {

Reply via email to