Adds test for BrooklynNode restart
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/9bafb46d Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/9bafb46d Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/9bafb46d Branch: refs/heads/master Commit: 9bafb46df9f1f1ac7e8104ae7ab2e90d2b552f19 Parents: 363989b Author: Aled Sage <[email protected]> Authored: Tue Mar 10 13:46:54 2015 +0000 Committer: Svetoslav Neykov <[email protected]> Committed: Thu Mar 19 16:03:08 2015 +0200 ---------------------------------------------------------------------- .../BrooklynNodeIntegrationTest.java | 55 +++++++++++++++----- 1 file changed, 43 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9bafb46d/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeIntegrationTest.java b/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeIntegrationTest.java index 065996d..717eb68 100644 --- a/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeIntegrationTest.java +++ b/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeIntegrationTest.java @@ -41,26 +41,25 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import brooklyn.config.BrooklynProperties; +import brooklyn.entity.BrooklynAppUnitTestSupport; import brooklyn.entity.Effector; import brooklyn.entity.Entity; import brooklyn.entity.basic.BasicApplication; import brooklyn.entity.basic.BasicApplicationImpl; import brooklyn.entity.basic.Entities; +import brooklyn.entity.basic.SoftwareProcess.StopSoftwareParameters.StopMode; import brooklyn.entity.brooklynnode.BrooklynNode.DeployBlueprintEffector; import brooklyn.entity.brooklynnode.BrooklynNode.ExistingFileBehaviour; import brooklyn.entity.brooklynnode.BrooklynNode.StopNodeAndKillAppsEffector; import brooklyn.entity.proxying.EntityProxyImpl; import brooklyn.entity.proxying.EntitySpec; import brooklyn.event.feed.http.JsonFunctions; -import brooklyn.location.LocationSpec; import brooklyn.location.basic.LocalhostMachineProvisioningLocation; import brooklyn.location.basic.Locations; import brooklyn.location.basic.PortRanges; import brooklyn.location.basic.SshMachineLocation; -import brooklyn.management.ManagementContext; import brooklyn.test.EntityTestUtils; import brooklyn.test.HttpTestUtils; -import brooklyn.test.entity.TestApplication; import brooklyn.util.collections.MutableMap; import brooklyn.util.config.ConfigBag; import brooklyn.util.exceptions.Exceptions; @@ -102,36 +101,40 @@ import com.google.common.io.Files; * rm -rf /tmp/brooklyn-`whoami`/installs/BrooklynNode* * </code> */ -public class BrooklynNodeIntegrationTest { +public class BrooklynNodeIntegrationTest extends BrooklynAppUnitTestSupport { private static final Logger log = LoggerFactory.getLogger(BrooklynNodeIntegrationTest.class); private File pseudoBrooklynPropertiesFile; private File pseudoBrooklynCatalogFile; + private File persistenceDir; private LocalhostMachineProvisioningLocation loc; private List<LocalhostMachineProvisioningLocation> locs; - private TestApplication app; - private ManagementContext mgmt; @BeforeMethod(alwaysRun=true) + @Override public void setUp() throws Exception { + super.setUp(); pseudoBrooklynPropertiesFile = Os.newTempFile("brooklynnode-test", ".properties"); pseudoBrooklynPropertiesFile.delete(); pseudoBrooklynCatalogFile = Os.newTempFile("brooklynnode-test", ".catalog"); pseudoBrooklynCatalogFile.delete(); - app = TestApplication.Factory.newManagedInstanceForTests(); - mgmt = app.getManagementContext(); - loc = mgmt.getLocationManager().createLocation(LocationSpec.create(LocalhostMachineProvisioningLocation.class)); + loc = app.newLocalhostProvisioningLocation(); locs = ImmutableList.of(loc); } @AfterMethod(alwaysRun=true) + @Override public void tearDown() throws Exception { - if (mgmt != null) Entities.destroyAll(mgmt); - if (pseudoBrooklynPropertiesFile != null) pseudoBrooklynPropertiesFile.delete(); - if (pseudoBrooklynCatalogFile != null) pseudoBrooklynCatalogFile.delete(); + try { + super.tearDown(); + } finally { + if (pseudoBrooklynPropertiesFile != null) pseudoBrooklynPropertiesFile.delete(); + if (pseudoBrooklynCatalogFile != null) pseudoBrooklynCatalogFile.delete(); + if (persistenceDir != null) Os.deleteRecursively(persistenceDir); + } } protected EntitySpec<BrooklynNode> newBrooklynNodeSpecForTest() { @@ -471,6 +474,34 @@ services: public void testStopButLeaveAppsEffector() throws Exception { createNodeAndExecStopEffector(BrooklynNode.STOP_NODE_BUT_LEAVE_APPS); } + + @Test(groups="Integration") + public void testStopAndRestartProcess() throws Exception { + persistenceDir = Files.createTempDir(); + BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest() + .configure(BrooklynNode.EXTRA_LAUNCH_PARAMETERS, "--persist auto --persistenceDir "+persistenceDir.getAbsolutePath()) + .configure(BrooklynNode.APP, BasicApplicationImpl.class.getName())); + app.start(locs); + log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod()); + File pidFile = new File(getDriver(brooklynNode).getPidFile()); + URI webConsoleUri = brooklynNode.getAttribute(BrooklynNode.WEB_CONSOLE_URI); + + // Stop just the process; will not have unmanaged entity unless machine was being terminated + brooklynNode.invoke(BrooklynNode.STOP, ImmutableMap.<String, Object>of( + BrooklynNode.StopSoftwareParameters.STOP_MACHINE_MODE.getName(), StopMode.NEVER, + BrooklynNode.StopSoftwareParameters.STOP_PROCESS_MODE.getName(), StopMode.ALWAYS)).getUnchecked(); + + assertTrue(Entities.isManaged(brooklynNode)); + assertFalse(isPidRunning(pidFile), "pid in "+pidFile+" still running"); + + // Restart the process; expect persisted state to have been restored, so apps still known about + brooklynNode.invoke(BrooklynNode.RESTART, ImmutableMap.<String, Object>of( + BrooklynNode.RestartSoftwareParameters.RESTART_MACHINE.getName(), "false")).getUnchecked(); + + String apps = HttpTestUtils.getContent(webConsoleUri.toString()+"/v1/applications"); + List<String> appType = parseJsonList(apps, ImmutableList.of("spec", "type"), String.class); + assertEquals(appType, ImmutableList.of(BasicApplication.class.getName())); + } private void createNodeAndExecStopEffector(Effector<?> eff) throws Exception { BrooklynNode brooklynNode = setUpBrooklynNodeWithApp();
