You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2014/07/29 21:32:20 UTC
[25/31] git commit: create task warnings which show up in the gui on
sudo failure
create task warnings which show up in the gui on sudo failure
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/2bffd089
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/2bffd089
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/2bffd089
Branch: refs/heads/master
Commit: 2bffd089de8c9824d472c2796d1650dd013c3879
Parents: 13299c6
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Jul 23 18:12:51 2014 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Tue Jul 29 14:41:50 2014 -0400
----------------------------------------------------------------------
.../java/brooklyn/util/task/DynamicTasks.java | 5 +++
.../java/brooklyn/util/task/ssh/SshTasks.java | 37 +++++++++++++++-----
.../postgresql/PostgreSqlSshDriver.java | 3 +-
.../entity/proxy/nginx/NginxSshDriver.java | 5 +--
4 files changed, 39 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2bffd089/core/src/main/java/brooklyn/util/task/DynamicTasks.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/task/DynamicTasks.java b/core/src/main/java/brooklyn/util/task/DynamicTasks.java
index 4a08d6f..3957b55 100644
--- a/core/src/main/java/brooklyn/util/task/DynamicTasks.java
+++ b/core/src/main/java/brooklyn/util/task/DynamicTasks.java
@@ -159,6 +159,11 @@ public class DynamicTasks {
public void andWaitForSuccess() {
task.getUnchecked();
}
+ public void orCancel() {
+ if (!wasQueued()) {
+ task.cancel(false);
+ }
+ }
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2bffd089/core/src/main/java/brooklyn/util/task/ssh/SshTasks.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/task/ssh/SshTasks.java b/core/src/main/java/brooklyn/util/task/ssh/SshTasks.java
index 6a0a63e..07e0a8a 100644
--- a/core/src/main/java/brooklyn/util/task/ssh/SshTasks.java
+++ b/core/src/main/java/brooklyn/util/task/ssh/SshTasks.java
@@ -131,9 +131,24 @@ public class SshTasks {
return result;
}
+ @Beta
+ public static enum OnFailingTask { FAIL, WARN_OR_FAIL_INESSENTIAL_IF_DYNAMIC, WARN_IN_LOG_ONLY, IGNORE }
+ public static ProcessTaskFactory<Boolean> dontRequireTtyForSudo(SshMachineLocation machine, final boolean failIfCantSudo) {
+ return dontRequireTtyForSudo(machine, failIfCantSudo ? OnFailingTask.FAIL : OnFailingTask.WARN_IN_LOG_ONLY);
+ }
/** creates a task which returns modifies sudoers to ensure non-tty access is permitted;
* also gives nice warnings if sudo is not permitted */
- public static ProcessTaskFactory<Boolean> dontRequireTtyForSudo(SshMachineLocation machine, final boolean requireSuccess) {
+ public static ProcessTaskFactory<Boolean> dontRequireTtyForSudo(SshMachineLocation machine, OnFailingTask onFailingTaskRequested) {
+ final OnFailingTask onFailingTask;
+ if (onFailingTaskRequested==OnFailingTask.WARN_OR_FAIL_INESSENTIAL_IF_DYNAMIC) {
+ if (DynamicTasks.getTaskQueuingContext()!=null)
+ onFailingTask = onFailingTaskRequested;
+ else
+ onFailingTask = OnFailingTask.WARN_IN_LOG_ONLY;
+ } else {
+ onFailingTask = onFailingTaskRequested;
+ }
+
final String id = Identifiers.makeRandomId(6);
return newSshExecTaskFactory(machine,
BashCommands.dontRequireTtyForSudo(),
@@ -146,18 +161,24 @@ public class SshTasks {
if (task.getExitCode()==0 && task.getStdout().contains("sudo-is-working-"+id)) return true;
Entity entity = BrooklynTaskTags.getTargetOrContextEntity(Tasks.current());
- // TODO if in a queueing context can we mark this task inessential and throw?
- // that way user sees the message...
- String message = "Error setting up sudo for "+task.getMachine().getUser()+"@"+task.getMachine().getAddress().getHostName()+" "+
- " (exit code "+task.getExitCode()+(entity!=null ? ", entity "+entity : "")+")";
- DynamicTasks.queueIfPossible(Tasks.warning(message, null));
+ if (onFailingTask!=OnFailingTask.IGNORE) {
+ // TODO if in a queueing context can we mark this task inessential and throw?
+ // that way user sees the message...
+ String message = "Error setting up sudo for "+task.getMachine().getUser()+"@"+task.getMachine().getAddress().getHostName()+" "+
+ " (exit code "+task.getExitCode()+(entity!=null ? ", entity "+entity : "")+")";
+ DynamicTasks.queueIfPossible(Tasks.warning(message, null));
+ }
Streams.logStreamTail(log, "STDERR of sudo setup problem", Streams.byteArrayOfString(task.getStderr()), 1024);
- if (requireSuccess) {
+
+ if (onFailingTask==OnFailingTask.WARN_OR_FAIL_INESSENTIAL_IF_DYNAMIC) {
+ Tasks.markInessential();
+ }
+ if (onFailingTask==OnFailingTask.FAIL || onFailingTask==OnFailingTask.WARN_OR_FAIL_INESSENTIAL_IF_DYNAMIC) {
throw new IllegalStateException("Passwordless sudo is required for "+task.getMachine().getUser()+"@"+task.getMachine().getAddress().getHostName()+
(entity!=null ? " ("+entity+")" : ""));
}
- return true;
+ return false;
} });
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2bffd089/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlSshDriver.java
----------------------------------------------------------------------
diff --git a/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlSshDriver.java b/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlSshDriver.java
index 5552ae1..5f112af 100644
--- a/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlSshDriver.java
+++ b/software/database/src/main/java/brooklyn/entity/database/postgresql/PostgreSqlSshDriver.java
@@ -56,6 +56,7 @@ import brooklyn.util.os.Os;
import brooklyn.util.stream.Streams;
import brooklyn.util.task.DynamicTasks;
import brooklyn.util.task.ssh.SshTasks;
+import brooklyn.util.task.ssh.SshTasks.OnFailingTask;
import brooklyn.util.task.system.ProcessTaskWrapper;
import brooklyn.util.text.Identifiers;
import brooklyn.util.text.StringFunctions;
@@ -112,7 +113,7 @@ public class PostgreSqlSshDriver extends AbstractSoftwareProcessSshDriver implem
DynamicTasks.queueIfPossible(SshTasks.dontRequireTtyForSudo(getMachine(),
// sudo is absolutely required here, in customize we set user to postgres
- true)).orSubmitAndBlock();
+ OnFailingTask.FAIL)).orSubmitAndBlock();
DynamicTasks.waitForLast();
// Check whether we can find a usable pg_ctl, and if not install one
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2bffd089/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
index afe3e21..df261c0 100644
--- a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
+++ b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
@@ -43,6 +43,7 @@ import brooklyn.util.stream.Streams;
import brooklyn.util.task.DynamicTasks;
import brooklyn.util.task.Tasks;
import brooklyn.util.task.ssh.SshTasks;
+import brooklyn.util.task.ssh.SshTasks.OnFailingTask;
import brooklyn.util.text.Strings;
import com.google.common.collect.ImmutableList;
@@ -114,8 +115,8 @@ public class NginxSshDriver extends AbstractSoftwareProcessSshDriver implements
@Override
public void install() {
- // will fail later if can't sudo (if sudo is required)
- DynamicTasks.queueIfPossible(SshTasks.dontRequireTtyForSudo(getMachine(), false)).orSubmitAndBlock();
+ // inessential here, installation will fail later if it needs to sudo (eg if using port 80)
+ DynamicTasks.queueIfPossible(SshTasks.dontRequireTtyForSudo(getMachine(), OnFailingTask.WARN_OR_FAIL_INESSENTIAL_IF_DYNAMIC)).orSubmitAndBlock();
DownloadResolver nginxResolver = mgmt().getEntityDownloadsManager().newDownloader(this);
List<String> nginxUrls = nginxResolver.getTargets();