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 2021/09/14 21:56:39 UTC

[brooklyn-server] 20/27: add option to clear orig mgmt state, and test that it is doing what is expected

This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit f6c5d85e0e00ed5949d0854ba9339551007e9883
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Tue Sep 14 15:08:54 2021 +0100

    add option to clear orig mgmt state, and test that it is doing what is expected
---
 .../core/mgmt/ha/HighAvailabilityManagerImpl.java         |  3 ++-
 .../apache/brooklyn/core/mgmt/rebind/RebindOptions.java   |  6 ++++++
 .../brooklyn/core/mgmt/rebind/RebindTestFixture.java      |  6 +++++-
 .../apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java | 11 ++++++++++-
 .../brooklyn/feed/windows/WinRmCommandSensorTest.java     | 15 +++++++++++++--
 5 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerImpl.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerImpl.java
index 9bbd00e..8c63775 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerImpl.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerImpl.java
@@ -989,7 +989,8 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
      * which is comparatively more expensive, so we only do it when we stop being a hotProxy or when we are demoted 
      * (e.g. during the periodic rebind as hot_stanby we will not repeatedly clear the brooklyn-managed-bundles).
      */
-    protected void clearManagedItems(ManagementTransitionMode mode) {
+    @VisibleForTesting
+    public void clearManagedItems(ManagementTransitionMode mode) {
         // log this because it may be surprising, it is just HA transitions,
         // not symmetric with usual single-node start
         LOG.info("Clearing all managed items on transition to "+mode);
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindOptions.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindOptions.java
index 72e956f..14e40cb 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindOptions.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindOptions.java
@@ -39,6 +39,7 @@ import com.google.common.collect.Iterables;
 public class RebindOptions {
 
     public boolean checkSerializable;
+    public boolean clearOrigManagementContext;
     public boolean terminateOrigManagementContext;
     public RebindExceptionHandler exceptionHandler = RebindExceptionHandlerImpl.builder().strict().build();
     public ManagementContext origManagementContext;
@@ -58,6 +59,7 @@ public class RebindOptions {
     public static RebindOptions create(RebindOptions options) {
         RebindOptions result = create();
         result.checkSerializable(options.checkSerializable);
+        result.clearOrigManagementContext(options.clearOrigManagementContext);
         result.terminateOrigManagementContext(options.terminateOrigManagementContext);
         result.exceptionHandler(options.exceptionHandler);
         result.origManagementContext(options.origManagementContext);
@@ -80,6 +82,10 @@ public class RebindOptions {
         this.terminateOrigManagementContext = val;
         return this;
     }
+    public RebindOptions clearOrigManagementContext(boolean val) {
+        this.clearOrigManagementContext = val;
+        return this;
+    }
     public RebindOptions defaultExceptionHandler() {
         this.exceptionHandler = null;
         return this;
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
index b09aba6..b2296e8 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
@@ -18,6 +18,7 @@
  */
 package org.apache.brooklyn.core.mgmt.rebind;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import java.io.File;
 import java.io.IOException;
 import java.util.List;
@@ -38,7 +39,10 @@ import org.apache.brooklyn.core.entity.EntityPredicates;
 import org.apache.brooklyn.core.entity.StartableApplication;
 import org.apache.brooklyn.core.entity.trait.Startable;
 import org.apache.brooklyn.core.internal.BrooklynProperties;
+import org.apache.brooklyn.core.mgmt.ha.HighAvailabilityManagerImpl;
+import org.apache.brooklyn.core.mgmt.internal.BrooklynObjectManagementMode;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
+import org.apache.brooklyn.core.mgmt.internal.ManagementTransitionMode;
 import org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectStore;
 import org.apache.brooklyn.core.mgmt.persist.FileBasedObjectStore;
 import org.apache.brooklyn.core.mgmt.persist.PersistMode;
@@ -123,7 +127,7 @@ public abstract class RebindTestFixture<T extends StartableApplication> {
         return true;
     }
     
-    /** As {@link #createNewManagementContext(File)} using the default memento dir */
+    /** As {@link #createNewManagementContext(File, Map)} using the default memento dir */
     protected LocalManagementContext createNewManagementContext() {
         return createNewManagementContext(mementoDir, null);
     }
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
index 4107735..128d50c 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
@@ -45,9 +45,12 @@ import org.apache.brooklyn.api.objs.Identifiable;
 import org.apache.brooklyn.core.entity.EntityInternal;
 import org.apache.brooklyn.core.internal.BrooklynProperties;
 import org.apache.brooklyn.core.location.internal.LocationInternal;
+import org.apache.brooklyn.core.mgmt.ha.HighAvailabilityManagerImpl;
 import org.apache.brooklyn.core.mgmt.ha.ManagementPlaneSyncRecordPersisterToObjectStore;
+import org.apache.brooklyn.core.mgmt.internal.BrooklynObjectManagementMode;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
+import org.apache.brooklyn.core.mgmt.internal.ManagementTransitionMode;
 import org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectStore;
 import org.apache.brooklyn.core.mgmt.persist.FileBasedObjectStore;
 import org.apache.brooklyn.core.mgmt.persist.PersistMode;
@@ -354,6 +357,7 @@ public class RebindTestUtils {
         boolean hasHaPersister = newManagementContext != null && newManagementContext.getHighAvailabilityManager().getPersister() != null;
         boolean checkSerializable = options.checkSerializable;
         boolean terminateOrigManagementContext = options.terminateOrigManagementContext;
+        boolean clearOrigManagementContext = options.clearOrigManagementContext;
         Function<BrooklynMementoPersister, Void> stateTransformer = options.stateTransformer;
         
         LOG.info("Rebinding app, using mementoDir " + mementoDir + "; object store " + objectStore);
@@ -385,11 +389,16 @@ public class RebindTestUtils {
             RebindTestUtils.checkCurrentMementoSerializable(origManagementContext);
         }
 
+        if (clearOrigManagementContext) {
+            checkNotNull(origManagementContext, "must supply origManagementContext with terminateOrigManagementContext");
+            ((HighAvailabilityManagerImpl)origManagementContext.getHighAvailabilityManager()).clearManagedItems(
+                    ManagementTransitionMode.transitioning(BrooklynObjectManagementMode.MANAGED_PRIMARY, BrooklynObjectManagementMode.UNMANAGED_PERSISTED) );
+        }
         if (terminateOrigManagementContext) {
             checkNotNull(origManagementContext, "must supply origManagementContext with terminateOrigManagementContext");
             origManagementContext.terminate();
         }
-        
+
         if (mementoDirBackup != null) {
             FileUtil.copyDir(mementoDir, mementoDirBackup);
             FileUtil.setFilePermissionsTo700(mementoDirBackup);
diff --git a/software/winrm/src/test/java/org/apache/brooklyn/feed/windows/WinRmCommandSensorTest.java b/software/winrm/src/test/java/org/apache/brooklyn/feed/windows/WinRmCommandSensorTest.java
index 75e10c4..543570f 100644
--- a/software/winrm/src/test/java/org/apache/brooklyn/feed/windows/WinRmCommandSensorTest.java
+++ b/software/winrm/src/test/java/org/apache/brooklyn/feed/windows/WinRmCommandSensorTest.java
@@ -22,9 +22,11 @@ import org.apache.brooklyn.api.entity.Entity;
 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.mgmt.ha.HighAvailabilityMode;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.core.entity.EntityAsserts;
 import org.apache.brooklyn.core.entity.RecordingSensorEventListener;
+import org.apache.brooklyn.core.mgmt.rebind.RebindOptions;
 import org.apache.brooklyn.core.mgmt.rebind.RebindTestFixtureWithApp;
 import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.core.sensor.http.HttpRequestSensor;
@@ -65,6 +67,12 @@ public class WinRmCommandSensorTest extends RebindTestFixtureWithApp {
         RecordingWinRmTool.clear();
     }
 
+    @Override
+    protected TestApplication rebind() throws Exception {
+        // trigger demotion to stop threads
+        return rebind(RebindOptions.create().clearOrigManagementContext(true));
+    }
+
     @Test
     public void testRebind() throws Exception {
         RecordingWinRmTool.setCustomResponse(".*mycommand.*", new RecordingWinRmTool.CustomResponse(0, "myval", ""));
@@ -81,9 +89,12 @@ public class WinRmCommandSensorTest extends RebindTestFixtureWithApp {
 
         TestApplication app2 = rebind();
 
-        entity = app2.getChildren().iterator().next();
+        Entity entity2 = app2.getChildren().iterator().next();
         RecordingWinRmTool.setCustomResponse(".*mycommand.*", new RecordingWinRmTool.CustomResponse(0, "myval2", ""));
-        EntityAsserts.assertAttributeEqualsEventually(entity, Sensors.newStringSensor("mysensor"), "myval2");
+        EntityAsserts.assertAttributeEqualsEventually(entity2, Sensors.newStringSensor("mysensor"), "myval2");
+
+        // entity is not updated
+        EntityAsserts.assertAttributeEquals(entity, Sensors.newStringSensor("mysensor"), "myval");
     }
     
     // "Integration" because takes a second