You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by sj...@apache.org on 2015/05/14 11:59:54 UTC

[3/8] incubator-brooklyn git commit: Adds SoftwareProcessEntityLatchTest

Adds SoftwareProcessEntityLatchTest

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

Branch: refs/heads/master
Commit: b18f31659944d2930904a19e18e9b28ac6dc9792
Parents: 78776ca
Author: Aled Sage <al...@gmail.com>
Authored: Wed May 13 11:38:49 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Wed May 13 11:38:49 2015 +0100

----------------------------------------------------------------------
 .../basic/SoftwareProcessEntityLatchTest.java   | 156 +++++++++++++++++++
 1 file changed, 156 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b18f3165/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityLatchTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityLatchTest.java b/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityLatchTest.java
new file mode 100644
index 0000000..6449f16
--- /dev/null
+++ b/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityLatchTest.java
@@ -0,0 +1,156 @@
+/*
+ * 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.entity.basic;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import brooklyn.config.ConfigKey;
+import brooklyn.entity.BrooklynAppUnitTestSupport;
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.SoftwareProcessEntityTest.MyService;
+import brooklyn.entity.basic.SoftwareProcessEntityTest.SimulatedDriver;
+import brooklyn.entity.proxying.EntitySpec;
+import brooklyn.event.basic.DependentConfiguration;
+import brooklyn.location.LocationSpec;
+import brooklyn.location.basic.FixedListMachineProvisioningLocation;
+import brooklyn.location.basic.SshMachineLocation;
+import brooklyn.management.Task;
+import brooklyn.test.Asserts;
+import brooklyn.util.task.TaskInternal;
+import brooklyn.util.time.Duration;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+
+public class SoftwareProcessEntityLatchTest extends BrooklynAppUnitTestSupport {
+
+    // NB: These tests don't actually require ssh to localhost -- only that 'localhost' resolves.
+
+    @SuppressWarnings("unused")
+    private static final Logger LOG = LoggerFactory.getLogger(SoftwareProcessEntityLatchTest.class);
+
+    private SshMachineLocation machine;
+    private FixedListMachineProvisioningLocation<SshMachineLocation> loc;
+    
+    @BeforeMethod(alwaysRun=true)
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        loc = getLocation();
+    }
+
+    @SuppressWarnings("unchecked")
+    private FixedListMachineProvisioningLocation<SshMachineLocation> getLocation() {
+        FixedListMachineProvisioningLocation<SshMachineLocation> loc = mgmt.getLocationManager().createLocation(LocationSpec.create(FixedListMachineProvisioningLocation.class));
+        machine = mgmt.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class)
+                .configure("address", "localhost"));
+        loc.addMachine(machine);
+        return loc;
+    }
+
+    @Test
+    public void testStartLatchBlocks() throws Exception {
+        runTestLatchBlocks(SoftwareProcess.START_LATCH, ImmutableList.<String>of());
+    }
+
+    @Test
+    public void testSetupLatchBlocks() throws Exception {
+        runTestLatchBlocks(SoftwareProcess.SETUP_LATCH, ImmutableList.<String>of());
+    }
+
+    @Test
+    public void testIntallResourcesLatchBlocks() throws Exception {
+        runTestLatchBlocks(SoftwareProcess.INSTALL_RESOURCES_LATCH, ImmutableList.of("setup"));
+    }
+
+    @Test
+    public void testInstallLatchBlocks() throws Exception {
+        runTestLatchBlocks(SoftwareProcess.INSTALL_LATCH, ImmutableList.of("setup", "copyInstallResources"));
+    }
+
+    @Test
+    public void testCustomizeLatchBlocks() throws Exception {
+        runTestLatchBlocks(SoftwareProcess.CUSTOMIZE_LATCH, ImmutableList.of("setup", "copyInstallResources", "install"));
+    }
+
+    @Test
+    public void testRuntimeResourcesLatchBlocks() throws Exception {
+        runTestLatchBlocks(SoftwareProcess.RUNTIME_RESOURCES_LATCH, ImmutableList.of("setup", "copyInstallResources", "install", "customize"));
+    }
+
+    @Test
+    public void testLaunchLatchBlocks() throws Exception {
+        runTestLatchBlocks(SoftwareProcess.LAUNCH_LATCH, ImmutableList.of("setup", "copyInstallResources", "install", "customize", "copyRuntimeResources"));
+    }
+
+    protected void runTestLatchBlocks(final ConfigKey<Boolean> latch, List<String> preLatchEvents) throws Exception {
+        final BasicEntity triggerEntity = app.createAndManageChild(EntitySpec.create(BasicEntity.class));
+        final MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)
+                .configure(latch, DependentConfiguration.attributeWhenReady(triggerEntity, Attributes.SERVICE_UP)));
+        
+        final Task<Void> task = Entities.invokeEffector(app, app, MyService.START, ImmutableMap.of("locations", ImmutableList.of(loc)));
+        
+        assertEffectorBlockingDetailsEventually(entity, "Waiting for config "+latch.getName());
+        assertDriverEventsEquals(entity, preLatchEvents);
+
+        assertFalse(task.isDone());
+        ((EntityLocal)triggerEntity).setAttribute(Attributes.SERVICE_UP, true);
+        task.get(Duration.THIRTY_SECONDS);
+        assertDriverEventsEquals(entity, ImmutableList.of("setup", "copyInstallResources", "install", "customize", "copyRuntimeResources", "launch"));
+    }
+
+    private void assertDriverEventsEquals(MyService entity, List<String> expectedEvents) {
+        List<String> events = ((SimulatedDriver)entity.getDriver()).events;
+        assertEquals(events, expectedEvents, "events="+events);
+    }
+
+    private void assertEffectorBlockingDetailsEventually(final Entity entity, final String blockingDetailsSnippet) {
+        Asserts.succeedsEventually(new Runnable() {
+            @Override public void run() {
+                Task<?> entityTask = Iterables.getOnlyElement(mgmt.getExecutionManager().getTasksWithAllTags(ImmutableList.of(BrooklynTaskTags.EFFECTOR_TAG, BrooklynTaskTags.tagForContextEntity(entity))));
+                String blockingDetails = getBlockingDetails(entityTask);
+                assertTrue(blockingDetails.contains(blockingDetailsSnippet));
+            }});
+    }
+    
+    private String getBlockingDetails(Task<?> task) {
+        List<TaskInternal<?>> taskChain = Lists.newArrayList();
+        TaskInternal<?> taskI = (TaskInternal<?>) task;
+        while (taskI != null) {
+            taskChain.add(taskI);
+            if (taskI.getBlockingDetails() != null) {
+                return taskI.getBlockingDetails();
+            }
+            taskI = (TaskInternal<?>) taskI.getBlockingTask();
+        }
+        throw new IllegalStateException("No blocking details for "+task+" (walked task chain "+taskChain+")");
+    }
+}