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/09/19 13:31:20 UTC

[04/16] git commit: Shutdown effector in BrooklynNode

Shutdown effector in BrooklynNode


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

Branch: refs/heads/master
Commit: 3191665ea836fbb54337485257f3a93c8fdd1b12
Parents: df789d9
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Fri Sep 12 19:08:08 2014 +0300
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Wed Sep 17 15:40:47 2014 +0300

----------------------------------------------------------------------
 .../entity/brooklynnode/BrooklynNode.java       | 20 +++++++++-
 .../entity/brooklynnode/BrooklynNodeImpl.java   | 39 +++++++++++++++-----
 2 files changed, 47 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/3191665e/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
index 77e7214..035d5aa 100644
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
+++ b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
@@ -41,6 +41,7 @@ import brooklyn.event.basic.PortAttributeSensorAndConfigKey;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.flags.SetFromFlag;
 import brooklyn.util.ssh.BashCommands;
+import brooklyn.util.time.Duration;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
@@ -220,8 +221,23 @@ public interface BrooklynNode extends SoftwareProcess, UsesJava {
             .parameter(BLUEPRINT_CAMP_PLAN)
             .buildAbstract();
     }
-    
-    public static Effector<String> DEPLOY_BLUEPRINT = DeployBlueprintEffector.DEPLOY_BLUEPRINT;
+
+    public static final Effector<String> DEPLOY_BLUEPRINT = DeployBlueprintEffector.DEPLOY_BLUEPRINT;
+
+    public interface ShutdownEffector {
+        ConfigKey<Boolean> STOP_APPS = ConfigKeys.newBooleanConfigKey("stop_apps", "Whether to stop apps before shutting down", true);
+        ConfigKey<Duration> DELAY = ConfigKeys.newConfigKey(Duration.class, "delay", "How long to wait before exiting the process", Duration.ZERO);
+        ConfigKey<Duration> HTTP_RETURN_TIMEOUT = ConfigKeys.newConfigKey(Duration.class, "httpReturnTimeout", "Maximum time to block the request for the shutdown to finish. 0 for infinity, positive to block");
+        Effector<Void> SHUTDOWN = Effectors.effector(Void.class, "shutdown")
+            .description("Shutdown the remote brooklyn instance")
+            .parameter(STOP_APPS)
+            .parameter(DELAY)
+            .parameter(HTTP_RETURN_TIMEOUT)
+            .buildAbstract();
+    }
+
+    public static final Effector<Void> SHUTDOWN = ShutdownEffector.SHUTDOWN;
+
 
     public EntityHttpClient http();
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/3191665e/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
index 3475ef9..6cc6f34 100644
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
+++ b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
@@ -22,8 +22,7 @@ import java.net.URI;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.HttpClient;
+import org.apache.http.HttpStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -31,7 +30,6 @@ import brooklyn.config.ConfigKey;
 import brooklyn.config.render.RendererHints;
 import brooklyn.entity.Effector;
 import brooklyn.entity.Entity;
-import brooklyn.entity.basic.BrooklynTaskTags;
 import brooklyn.entity.basic.SoftwareProcessImpl;
 import brooklyn.entity.effector.EffectorBody;
 import brooklyn.entity.effector.Effectors;
@@ -42,18 +40,12 @@ import brooklyn.event.feed.http.HttpValueFunctions;
 import brooklyn.util.collections.Jsonya;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.config.ConfigBag;
-import brooklyn.util.exceptions.Exceptions;
-import brooklyn.util.http.HttpTool;
-import brooklyn.util.http.HttpTool.HttpClientBuilder;
 import brooklyn.util.http.HttpToolResponse;
 import brooklyn.util.javalang.JavaClassNames;
-import brooklyn.util.net.Urls;
-import brooklyn.util.stream.Streams;
-import brooklyn.util.task.Tasks;
 import brooklyn.util.text.Strings;
+import brooklyn.util.time.Duration;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
 import com.google.gson.Gson;
 
 public class BrooklynNodeImpl extends SoftwareProcessImpl implements BrooklynNode {
@@ -83,6 +75,7 @@ public class BrooklynNodeImpl extends SoftwareProcessImpl implements BrooklynNod
     public void init() {
         super.init();
         getMutableEntityType().addEffector(DeployBlueprintEffectorBody.DEPLOY_BLUEPRINT);
+        getMutableEntityType().addEffector(ShutdownEffectorBody.SHUTDOWN);
     }
     
     public static class DeployBlueprintEffectorBody extends EffectorBody<String> implements DeployBlueprintEffector {
@@ -152,6 +145,32 @@ public class BrooklynNodeImpl extends SoftwareProcessImpl implements BrooklynNod
         }
     }
 
+    public static class ShutdownEffectorBody extends EffectorBody<Void> implements ShutdownEffector {
+        public static final Effector<Void> SHUTDOWN = Effectors.effector(BrooklynNode.SHUTDOWN).impl(new ShutdownEffectorBody()).build();
+
+        @Override
+        public Void call(ConfigBag parameters) {
+            Map<String, String> formParams = MutableMap.<String, String>of(
+                    "stopAppsFirst", parameters.get(STOP_APPS).toString(),
+                    "delayMillis", getDelayMillis(parameters));
+            Duration httpReturnTimeout = parameters.get(HTTP_RETURN_TIMEOUT);
+            if (httpReturnTimeout != null) {
+                formParams.put("httpReturnTimeout", httpReturnTimeout.toString());
+            }
+            HttpToolResponse resp = ((BrooklynNode)entity()).http()
+                .post("/v1/server/shutdown", MutableMap.<String, String>of(), formParams);
+            if (resp.getResponseCode() != HttpStatus.SC_NO_CONTENT) {
+                throw new IllegalStateException("Remote node shutdown failed.");
+            }
+            return null;
+        }
+
+        private String getDelayMillis(ConfigBag parameters) {
+            return Long.toString(parameters.get(DELAY).toMilliseconds());
+        }
+
+    }
+
     public List<String> getClasspath() {
         List<String> classpath = getConfig(CLASSPATH);
         if (classpath == null || classpath.isEmpty()) {