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 2017/11/06 23:12:07 UTC

[1/2] brooklyn-server git commit: BROOKLYN-547: fix VanillaSoftwareProcess.restart with no ssh-monitoring

Repository: brooklyn-server
Updated Branches:
  refs/heads/master 9c9331c1b -> 2f57d79eb


BROOKLYN-547: fix VanillaSoftwareProcess.restart with no ssh-monitoring

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

Branch: refs/heads/master
Commit: b8782c253f87f79d84c65c93f0391ec527729383
Parents: 9c9331c
Author: Aled Sage <al...@gmail.com>
Authored: Mon Nov 6 17:54:28 2017 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Nov 6 17:54:28 2017 +0000

----------------------------------------------------------------------
 .../base/VanillaSoftwareProcessImpl.java        | 11 +++
 .../base/VanillaSoftwareProcessTest.java        | 74 ++++++++++++++++++++
 2 files changed, 85 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b8782c25/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessImpl.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessImpl.java
index 5fa7b66..02a34f1 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessImpl.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessImpl.java
@@ -18,7 +18,10 @@
  */
 package org.apache.brooklyn.entity.software.base;
 
+import org.apache.brooklyn.api.sensor.Enricher;
+import org.apache.brooklyn.core.entity.EntityAdjuncts;
 import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.ServiceNotUpLogic;
+import org.apache.brooklyn.util.guava.Maybe;
 
 public class VanillaSoftwareProcessImpl extends SoftwareProcessImpl implements VanillaSoftwareProcess {
     
@@ -35,6 +38,14 @@ public class VanillaSoftwareProcessImpl extends SoftwareProcessImpl implements V
         } else {
             // See SoftwareProcessImpl.waitForEntityStart(). We will already have waited for driver.isRunning.
             // We will not poll for that again.
+            // 
+            // Also disable the associated enricher - otherwise that would reset the not-up-indicator 
+            // if serviceUp=false temporarily (e.g. if restart effector is called).
+            // See https://issues.apache.org/jira/browse/BROOKLYN-547
+            Maybe<Enricher> enricher = EntityAdjuncts.tryFindWithUniqueTag(enrichers(), "service-process-is-running-updating-not-up");
+            if (enricher.isPresent()) {
+                enrichers().remove(enricher.get());
+            }
             ServiceNotUpLogic.clearNotUpIndicator(this, SERVICE_PROCESS_IS_RUNNING);
         }
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b8782c25/software/base/src/test/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessTest.java
index fa8695f..3c78b35 100644
--- a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessTest.java
+++ b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessTest.java
@@ -19,6 +19,8 @@
 package org.apache.brooklyn.entity.software.base;
 
 import static org.apache.brooklyn.util.core.internal.ssh.ExecCmdAsserts.assertExecContains;
+import static org.apache.brooklyn.util.core.internal.ssh.ExecCmdAsserts.assertExecHasAtLeastOnce;
+import static org.apache.brooklyn.util.core.internal.ssh.ExecCmdAsserts.assertExecHasNever;
 import static org.apache.brooklyn.util.core.internal.ssh.ExecCmdAsserts.assertExecHasOnlyOnce;
 import static org.apache.brooklyn.util.core.internal.ssh.ExecCmdAsserts.assertExecSatisfies;
 import static org.apache.brooklyn.util.core.internal.ssh.ExecCmdAsserts.assertExecsContain;
@@ -26,25 +28,38 @@ import static org.apache.brooklyn.util.core.internal.ssh.ExecCmdAsserts.assertEx
 import static org.apache.brooklyn.util.core.internal.ssh.ExecCmdAsserts.assertExecsSatisfy;
 
 import java.util.Map;
+import java.util.concurrent.Callable;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.location.MachineLocation;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
+import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.core.entity.Entities;
+import org.apache.brooklyn.core.entity.EntityAsserts;
+import org.apache.brooklyn.core.sensor.Sensors;
+import org.apache.brooklyn.core.sensor.function.FunctionSensor;
 import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
+import org.apache.brooklyn.enricher.stock.UpdatingMap;
 import org.apache.brooklyn.entity.software.base.SoftwareProcess.ChildStartableMode;
 import org.apache.brooklyn.location.byon.FixedListMachineProvisioningLocation;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
+import org.apache.brooklyn.test.Asserts;
+import org.apache.brooklyn.util.collections.MutableMap;
+import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.internal.ssh.RecordingSshTool;
 import org.apache.brooklyn.util.core.internal.ssh.RecordingSshTool.CustomResponse;
+import org.apache.brooklyn.util.core.internal.ssh.RecordingSshTool.CustomResponseGenerator;
 import org.apache.brooklyn.util.core.internal.ssh.RecordingSshTool.ExecCmdPredicates;
 import org.apache.brooklyn.util.core.internal.ssh.RecordingSshTool.ExecParams;
+import org.apache.brooklyn.util.time.Duration;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import com.google.common.base.Functions;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -294,4 +309,63 @@ public class VanillaSoftwareProcessTest extends BrooklynAppUnitTestSupport {
         assertExecHasOnlyOnce(RecordingSshTool.getExecCmds(), "preInstallCommand");
         assertExecHasOnlyOnce(RecordingSshTool.getExecCmds(), "launchCommand");
     }
+    
+    @Test
+    public void testUseSshMonitoringDisabled() throws Exception {
+        // Setup a custom health-check that returns true after launch is called, 
+        // and false after stop is called.
+        final AtomicBoolean customHealth = new AtomicBoolean(false);
+        
+        RecordingSshTool.setCustomResponse(".*launchCommand.*", new CustomResponseGenerator() {
+            @Override public CustomResponse generate(ExecParams execParams) throws Exception {
+                customHealth.set(true);
+                return new CustomResponse(0, "", "");
+            }});
+        RecordingSshTool.setCustomResponse(".*stopCommand.*", new CustomResponseGenerator() {
+            @Override public CustomResponse generate(ExecParams execParams) throws Exception {
+                customHealth.set(false);
+                return new CustomResponse(0, "", "");
+            }});
+        
+        // The entity polls for the custom-health; it populates the service-up-indicators using that.
+        VanillaSoftwareProcess entity = app.createAndManageChild(EntitySpec.create(VanillaSoftwareProcess.class)
+                .configure(VanillaSoftwareProcess.USE_SSH_MONITORING, false)
+                .configure(VanillaSoftwareProcess.SERVICE_PROCESS_IS_RUNNING_POLL_PERIOD, Duration.ONE_MILLISECOND)
+                .configure(VanillaSoftwareProcess.LAUNCH_COMMAND, "launchCommand")
+                .configure(VanillaSoftwareProcess.CHECK_RUNNING_COMMAND, "checkRunningCommand")
+                .configure(VanillaSoftwareProcess.STOP_COMMAND, "stopCommand")
+                .addInitializer(new FunctionSensor<Boolean>(ConfigBag.newInstance()
+                        .configure(FunctionSensor.SENSOR_NAME, "myCustomHealth")
+                        .configure(FunctionSensor.SUPPRESS_DUPLICATES, true)
+                        .configure(FunctionSensor.SENSOR_PERIOD, Duration.ONE_MILLISECOND)
+                        .configure(FunctionSensor.FUNCTION, new Callable<Boolean>() {
+                            public Boolean call() {
+                                return customHealth.get();
+                            }})
+                        ))
+                .enricher(EnricherSpec.create(UpdatingMap.class)
+                        .configure(UpdatingMap.SOURCE_SENSOR, Sensors.newBooleanSensor("myCustomHealth"))
+                        .configure(UpdatingMap.TARGET_SENSOR, Attributes.SERVICE_NOT_UP_INDICATORS)
+                        .configure(UpdatingMap.COMPUTING, Functions.forMap(
+                                MutableMap.of(true, null, false, "custom-health-is-false"),
+                                "custom-health-unknown")))
+                        );
+        
+        // Start the entity
+        app.start(ImmutableList.of(loc));
+        EntityAsserts.assertAttributeEqualsEventually(entity, Attributes.SERVICE_UP, true);
+
+        // Expect to have ssh "checkRunningCommand" called once during startup, and not again 
+        assertExecHasAtLeastOnce(RecordingSshTool.getExecCmds(), "checkRunningCommand");
+        
+        RecordingSshTool.clearCmdHistory();
+        Asserts.succeedsContinually(ImmutableMap.of("timeout", Duration.millis(100)), new Runnable() {
+            public void run() {
+                assertExecHasNever(RecordingSshTool.getExecCmds(), "checkRunningCommand");
+            }});
+
+        // Restart (see https://issues.apache.org/jira/browse/BROOKLYN-547)
+        entity.restart();
+        EntityAsserts.assertAttributeEqualsEventually(entity, Attributes.SERVICE_UP, true);
+    }
 }


[2/2] brooklyn-server git commit: This closes #881

Posted by al...@apache.org.
This closes #881


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/2f57d79e
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/2f57d79e
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/2f57d79e

Branch: refs/heads/master
Commit: 2f57d79eb6f6b0b9b7a93f7f0f66a1757d02e35e
Parents: 9c9331c b8782c2
Author: Aled Sage <al...@gmail.com>
Authored: Mon Nov 6 23:11:57 2017 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Nov 6 23:11:57 2017 +0000

----------------------------------------------------------------------
 .../base/VanillaSoftwareProcessImpl.java        | 11 +++
 .../base/VanillaSoftwareProcessTest.java        | 74 ++++++++++++++++++++
 2 files changed, 85 insertions(+)
----------------------------------------------------------------------