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 2015/03/19 15:07:34 UTC
[16/19] incubator-brooklyn git commit: Addressed PR#542 comments
Addressed PR#542 comments
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/363989b9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/363989b9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/363989b9
Branch: refs/heads/master
Commit: 363989b95ad20a51148f8140a5dae9cdef9a5434
Parents: a8a27f8
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Tue Mar 17 23:36:05 2015 +0200
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Thu Mar 19 16:03:08 2015 +0200
----------------------------------------------------------------------
.../management/ha/HighAvailabilityManager.java | 2 +-
.../entity/brooklynnode/BrooklynNodeImpl.java | 7 +-
.../software/MachineLifecycleEffectorTasks.java | 42 ++++---
.../BrooklynJavascriptGuiLauncherTest.java | 7 +-
.../rest/filter/HaHotCheckResourceFilter.java | 1 +
.../rest/filter/HaHotStateRequired.java | 8 ++
.../brooklyn/rest/BrooklynRestApiLauncher.java | 2 +-
.../test/java/brooklyn/rest/HaHotCheckTest.java | 19 ++-
.../mocks/HighAvailabilityManagerMock.java | 121 -------------------
.../mocks/HighAvailabilityManagerStub.java | 121 +++++++++++++++++++
.../testing/mocks/ManagementContextMock.java | 2 +-
11 files changed, 170 insertions(+), 162 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/363989b9/api/src/main/java/brooklyn/management/ha/HighAvailabilityManager.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/management/ha/HighAvailabilityManager.java b/api/src/main/java/brooklyn/management/ha/HighAvailabilityManager.java
index 2a1af9a..c530116 100644
--- a/api/src/main/java/brooklyn/management/ha/HighAvailabilityManager.java
+++ b/api/src/main/java/brooklyn/management/ha/HighAvailabilityManager.java
@@ -44,7 +44,7 @@ public interface HighAvailabilityManager {
ManagementNodeState getNodeState();
- /** The time in milliseconds when the state was last changed */
+ /** The time in milliseconds when the state was last changed. -1 if no state transition has occurred yet.*/
long getLastStateChange();
/**
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/363989b9/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 7856b8f..d4b4992 100644
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
+++ b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
@@ -176,8 +176,9 @@ public class BrooklynNodeImpl extends SoftwareProcessImpl implements BrooklynNod
@Override
protected void preRestart() {
super.preRestart();
+ //restart will kill the process, try to shut down before that
shutdownGracefully();
- DynamicTasks.queue("post-shutdown", new Runnable() { public void run() {
+ DynamicTasks.queue("pre-restart", new Runnable() { public void run() {
//set by shutdown - clear it so the entity starts cleanly. Does the indicator bring any value at all?
ServiceNotUpLogic.clearNotUpIndicator(BrooklynNodeImpl.this, SHUTDOWN.getName());
}});
@@ -220,7 +221,7 @@ public class BrooklynNodeImpl extends SoftwareProcessImpl implements BrooklynNod
@Override
protected void postStop() {
super.postStop();
- if (isStopMachine()) {
+ if (isMachineStopped()) {
// Don't unmanage in entity's task context as it will self-cancel the task. Wait for the stop effector to complete.
// If this is not enough (still getting Caused by: java.util.concurrent.CancellationException: null) then
// we could search for the top most task with entity context == this and wait on it. Even stronger would be
@@ -230,7 +231,7 @@ public class BrooklynNodeImpl extends SoftwareProcessImpl implements BrooklynNod
}
}
- private boolean isStopMachine() {
+ private boolean isMachineStopped() {
// Don't rely on effector parameters, check if there is still a machine running.
// If the entity was previously stopped with STOP_MACHINE_MODE=StopMode.NEVER
// and a second time with STOP_MACHINE_MODE=StopMode.IF_NOT_STOPPED, then the
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/363989b9/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java b/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java
index e64e078..4fd6b09 100644
--- a/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java
+++ b/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java
@@ -552,24 +552,8 @@ public abstract class MachineLifecycleEffectorTasks {
log.info("Stopping {} in {}", entity(), entity().getLocations());
- @SuppressWarnings("deprecation")
- final boolean hasStopMachine = parameters.containsKey(StopSoftwareParameters.STOP_MACHINE);
- @SuppressWarnings("deprecation")
- final Boolean isStopMachine = parameters.get(StopSoftwareParameters.STOP_MACHINE);
-
- final StopMode stopProcessMode = parameters.get(StopSoftwareParameters.STOP_PROCESS_MODE);
-
- final boolean hasStopMachineMode = parameters.containsKey(StopSoftwareParameters.STOP_MACHINE_MODE);
- StopMode stopMachineMode = parameters.get(StopSoftwareParameters.STOP_MACHINE_MODE);
-
- if (hasStopMachine && isStopMachine != null) {
- checkCompatibleMachineModes(isStopMachine, hasStopMachineMode, stopMachineMode);
- if (isStopMachine) {
- stopMachineMode = StopMode.IF_NOT_STOPPED;
- } else {
- stopMachineMode = StopMode.NEVER;
- }
- }
+ StopMode stopMachineMode = getStopMachineMode(parameters);
+ StopMode stopProcessMode = parameters.get(StopSoftwareParameters.STOP_PROCESS_MODE);
DynamicTasks.queue("pre-stop", new Callable<String>() { public String call() {
if (entity().getAttribute(SoftwareProcess.SERVICE_STATE_ACTUAL)==Lifecycle.STOPPED) {
@@ -650,6 +634,26 @@ public abstract class MachineLifecycleEffectorTasks {
if (log.isDebugEnabled()) log.debug("Stopped software process entity "+entity());
}
+ public static StopMode getStopMachineMode(ConfigBag parameters) {
+ @SuppressWarnings("deprecation")
+ final boolean hasStopMachine = parameters.containsKey(StopSoftwareParameters.STOP_MACHINE);
+ @SuppressWarnings("deprecation")
+ final Boolean isStopMachine = parameters.get(StopSoftwareParameters.STOP_MACHINE);
+
+ final boolean hasStopMachineMode = parameters.containsKey(StopSoftwareParameters.STOP_MACHINE_MODE);
+ final StopMode stopMachineMode = parameters.get(StopSoftwareParameters.STOP_MACHINE_MODE);
+
+ if (hasStopMachine && isStopMachine != null) {
+ checkCompatibleMachineModes(isStopMachine, hasStopMachineMode, stopMachineMode);
+ if (isStopMachine) {
+ return StopMode.IF_NOT_STOPPED;
+ } else {
+ return StopMode.NEVER;
+ }
+ }
+ return stopMachineMode;
+ }
+
public static boolean canStop(StopMode stopMode, Entity entity) {
boolean isEntityStopped = entity.getAttribute(SoftwareProcess.SERVICE_STATE_ACTUAL)==Lifecycle.STOPPED;
return canStop(stopMode, isEntityStopped);
@@ -660,7 +664,7 @@ public abstract class MachineLifecycleEffectorTasks {
stopMode == StopMode.IF_NOT_STOPPED && !isStopped;
}
- private void checkCompatibleMachineModes(Boolean isStopMachine, boolean hasStopMachineMode, StopMode stopMachineMode) {
+ private static void checkCompatibleMachineModes(Boolean isStopMachine, boolean hasStopMachineMode, StopMode stopMachineMode) {
if (hasStopMachineMode &&
(isStopMachine && stopMachineMode != StopMode.IF_NOT_STOPPED ||
!isStopMachine && stopMachineMode != StopMode.NEVER)) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/363989b9/usage/jsgui/src/test/java/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java
----------------------------------------------------------------------
diff --git a/usage/jsgui/src/test/java/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java b/usage/jsgui/src/test/java/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java
index ab55d66..9ebb40b 100644
--- a/usage/jsgui/src/test/java/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java
+++ b/usage/jsgui/src/test/java/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java
@@ -64,12 +64,7 @@ public class BrooklynJavascriptGuiLauncherTest {
protected void checkUrlContains(final String path, final String text) {
//Server may return 403 until it loads completely, wait a bit
//until it stabilizes.
- Asserts.succeedsEventually(new Runnable() {
- @Override
- public void run() {
- HttpTestUtils.assertContentContainsText(rootUrl()+path, text);
- }
- });
+ HttpTestUtils.assertContentEventuallyContainsText(rootUrl()+path, text);
}
protected void checkEventuallyHealthy() {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/363989b9/usage/rest-server/src/main/java/brooklyn/rest/filter/HaHotCheckResourceFilter.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/filter/HaHotCheckResourceFilter.java b/usage/rest-server/src/main/java/brooklyn/rest/filter/HaHotCheckResourceFilter.java
index 8b1d67f..5367439 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/filter/HaHotCheckResourceFilter.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/filter/HaHotCheckResourceFilter.java
@@ -89,6 +89,7 @@ public class HaHotCheckResourceFilter implements ResourceFilterFactory {
// and starting rebind so add a time offset just to be sure.
private boolean recentlySwitchedState() {
long lastStateChange = mgmt.getHighAvailabilityManager().getLastStateChange();
+ if (lastStateChange == -1) return false;
return System.currentTimeMillis() - lastStateChange < STATE_CHANGE_SETTLE_OFFSET;
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/363989b9/usage/rest-server/src/main/java/brooklyn/rest/filter/HaHotStateRequired.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/filter/HaHotStateRequired.java b/usage/rest-server/src/main/java/brooklyn/rest/filter/HaHotStateRequired.java
index 271da8f..09eea5f 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/filter/HaHotStateRequired.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/filter/HaHotStateRequired.java
@@ -23,6 +23,14 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+/**
+ * When a REST method (or its containing class) is marked with this annotation
+ * requests to it will fail with a 403 response if the instance is not in MASTER
+ * mode (or has recently switched or is still rebinding). Guards the method so
+ * that when it returns the caller can be certain of the response. For example
+ * if the response is 404, then the resource doesn't exist as opposed to
+ * not being loaded from persistence store yet.
+ */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface HaHotStateRequired {}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/363989b9/usage/rest-server/src/test/java/brooklyn/rest/BrooklynRestApiLauncher.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/brooklyn/rest/BrooklynRestApiLauncher.java b/usage/rest-server/src/test/java/brooklyn/rest/BrooklynRestApiLauncher.java
index cb7b29d..5643614 100644
--- a/usage/rest-server/src/test/java/brooklyn/rest/BrooklynRestApiLauncher.java
+++ b/usage/rest-server/src/test/java/brooklyn/rest/BrooklynRestApiLauncher.java
@@ -152,7 +152,7 @@ public class BrooklynRestApiLauncher {
this.deployJsgui = false;
return this;
}
-
+
public BrooklynRestApiLauncher disableHighAvailability(boolean value) {
this.disableHighAvailability = value;
return this;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/363989b9/usage/rest-server/src/test/java/brooklyn/rest/HaHotCheckTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/brooklyn/rest/HaHotCheckTest.java b/usage/rest-server/src/test/java/brooklyn/rest/HaHotCheckTest.java
index 8f28728..58a9e6b 100644
--- a/usage/rest-server/src/test/java/brooklyn/rest/HaHotCheckTest.java
+++ b/usage/rest-server/src/test/java/brooklyn/rest/HaHotCheckTest.java
@@ -23,7 +23,6 @@ import static org.testng.Assert.assertEquals;
import javax.ws.rs.core.MediaType;
import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
@@ -46,24 +45,24 @@ public class HaHotCheckTest extends BrooklynRestResourceTest {
private ManagementContextMock mgmtMock;
- //Treat before/after class methods as before/after method
- //otherwise they should be static.
- @BeforeClass(alwaysRun=true)
- public void setUpClass() {}
- @AfterClass(alwaysRun=true)
- public void tearDownClass() {}
-
- @BeforeMethod(alwaysRun = true)
+ @Override
+ @BeforeClass(alwaysRun = true)
public void setUp() throws Exception {
mgmtMock = new ManagementContextMock();
super.setUp();
}
- @AfterMethod(alwaysRun = true)
+ @Override
+ @AfterClass(alwaysRun = true)
public void tearDown() throws Exception {
super.tearDown();
}
+ @BeforeMethod(alwaysRun = true)
+ public void setUpMethod() {
+ mgmtMock.setState(ManagementNodeState.MASTER);
+ }
+
@Override
protected void addBrooklynResources() {
config.getSingletons().add(new ManagementContextProvider(mgmtMock));
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/363989b9/usage/rest-server/src/test/java/brooklyn/rest/testing/mocks/HighAvailabilityManagerMock.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/brooklyn/rest/testing/mocks/HighAvailabilityManagerMock.java b/usage/rest-server/src/test/java/brooklyn/rest/testing/mocks/HighAvailabilityManagerMock.java
deleted file mode 100644
index 5c99183..0000000
--- a/usage/rest-server/src/test/java/brooklyn/rest/testing/mocks/HighAvailabilityManagerMock.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.rest.testing.mocks;
-
-import java.util.Map;
-
-import brooklyn.management.ha.HighAvailabilityManager;
-import brooklyn.management.ha.HighAvailabilityMode;
-import brooklyn.management.ha.ManagementNodeState;
-import brooklyn.management.ha.ManagementPlaneSyncRecord;
-import brooklyn.management.ha.ManagementPlaneSyncRecordPersister;
-
-public class HighAvailabilityManagerMock implements HighAvailabilityManager {
-
- private ManagementNodeState state = ManagementNodeState.MASTER;
-
- public void setState(ManagementNodeState state) {
- this.state = state;
- }
-
- private static RuntimeException fail() {
- throw new UnsupportedOperationException("Mocked method not implemented");
- }
-
- @Override
- public boolean isRunning() {
- return state != ManagementNodeState.TERMINATED;
- }
-
- @Override
- public ManagementNodeState getNodeState() {
- return state;
- }
-
- @Override
- public long getLastStateChange() {
- return 0;
- }
-
- @Override
- public HighAvailabilityManager setPersister(ManagementPlaneSyncRecordPersister persister) {
- throw fail();
- }
-
- @Override
- public void disabled() {
- throw fail();
- }
-
- @Override
- public void start(HighAvailabilityMode startMode) {
- throw fail();
- }
-
- @Override
- public void stop() {
- throw fail();
- }
-
- @Override
- public void changeMode(HighAvailabilityMode mode) {
- throw fail();
- }
-
- @Override
- public void setPriority(long priority) {
- throw fail();
- }
-
- @Override
- public long getPriority() {
- throw fail();
- }
-
- @Override
- public void publishClearNonMaster() {
- throw fail();
- }
-
- @Override
- public ManagementPlaneSyncRecord getLastManagementPlaneSyncRecord() {
- throw fail();
- }
-
- @Override
- public ManagementPlaneSyncRecord getManagementPlaneSyncState() {
- throw fail();
- }
-
- @Override
- public ManagementPlaneSyncRecord loadManagementPlaneSyncRecord(boolean useLocalKnowledgeForThisNode) {
- throw fail();
- }
-
- @Override
- public ManagementPlaneSyncRecordPersister getPersister() {
- throw fail();
- }
-
- @Override
- public Map<String, Object> getMetrics() {
- throw fail();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/363989b9/usage/rest-server/src/test/java/brooklyn/rest/testing/mocks/HighAvailabilityManagerStub.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/brooklyn/rest/testing/mocks/HighAvailabilityManagerStub.java b/usage/rest-server/src/test/java/brooklyn/rest/testing/mocks/HighAvailabilityManagerStub.java
new file mode 100644
index 0000000..98fb8d5
--- /dev/null
+++ b/usage/rest-server/src/test/java/brooklyn/rest/testing/mocks/HighAvailabilityManagerStub.java
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package brooklyn.rest.testing.mocks;
+
+import java.util.Map;
+
+import brooklyn.management.ha.HighAvailabilityManager;
+import brooklyn.management.ha.HighAvailabilityMode;
+import brooklyn.management.ha.ManagementNodeState;
+import brooklyn.management.ha.ManagementPlaneSyncRecord;
+import brooklyn.management.ha.ManagementPlaneSyncRecordPersister;
+
+public class HighAvailabilityManagerStub implements HighAvailabilityManager {
+
+ private ManagementNodeState state = ManagementNodeState.MASTER;
+
+ public void setState(ManagementNodeState state) {
+ this.state = state;
+ }
+
+ private static RuntimeException fail() {
+ throw new UnsupportedOperationException("Mocked method not implemented");
+ }
+
+ @Override
+ public boolean isRunning() {
+ return state != ManagementNodeState.TERMINATED;
+ }
+
+ @Override
+ public ManagementNodeState getNodeState() {
+ return state;
+ }
+
+ @Override
+ public long getLastStateChange() {
+ return 0;
+ }
+
+ @Override
+ public HighAvailabilityManager setPersister(ManagementPlaneSyncRecordPersister persister) {
+ throw fail();
+ }
+
+ @Override
+ public void disabled() {
+ throw fail();
+ }
+
+ @Override
+ public void start(HighAvailabilityMode startMode) {
+ throw fail();
+ }
+
+ @Override
+ public void stop() {
+ throw fail();
+ }
+
+ @Override
+ public void changeMode(HighAvailabilityMode mode) {
+ throw fail();
+ }
+
+ @Override
+ public void setPriority(long priority) {
+ throw fail();
+ }
+
+ @Override
+ public long getPriority() {
+ throw fail();
+ }
+
+ @Override
+ public void publishClearNonMaster() {
+ throw fail();
+ }
+
+ @Override
+ public ManagementPlaneSyncRecord getLastManagementPlaneSyncRecord() {
+ throw fail();
+ }
+
+ @Override
+ public ManagementPlaneSyncRecord getManagementPlaneSyncState() {
+ throw fail();
+ }
+
+ @Override
+ public ManagementPlaneSyncRecord loadManagementPlaneSyncRecord(boolean useLocalKnowledgeForThisNode) {
+ throw fail();
+ }
+
+ @Override
+ public ManagementPlaneSyncRecordPersister getPersister() {
+ throw fail();
+ }
+
+ @Override
+ public Map<String, Object> getMetrics() {
+ throw fail();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/363989b9/usage/rest-server/src/test/java/brooklyn/rest/testing/mocks/ManagementContextMock.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/brooklyn/rest/testing/mocks/ManagementContextMock.java b/usage/rest-server/src/test/java/brooklyn/rest/testing/mocks/ManagementContextMock.java
index 6a29fed..90edf1e 100644
--- a/usage/rest-server/src/test/java/brooklyn/rest/testing/mocks/ManagementContextMock.java
+++ b/usage/rest-server/src/test/java/brooklyn/rest/testing/mocks/ManagementContextMock.java
@@ -44,7 +44,7 @@ import brooklyn.management.ha.ManagementNodeState;
import brooklyn.util.guava.Maybe;
public class ManagementContextMock implements ManagementContext {
- private HighAvailabilityManagerMock haMock = new HighAvailabilityManagerMock();
+ private HighAvailabilityManagerStub haMock = new HighAvailabilityManagerStub();
public void setState(ManagementNodeState state) {
haMock.setState(state);