http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/location/basic/MultiLocationRebindTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/location/basic/MultiLocationRebindTest.java b/core/src/test/java/org/apache/brooklyn/location/basic/MultiLocationRebindTest.java deleted file mode 100644 index 4728ab9..0000000 --- a/core/src/test/java/org/apache/brooklyn/location/basic/MultiLocationRebindTest.java +++ /dev/null @@ -1,119 +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 org.apache.brooklyn.location.basic; - -import java.io.File; -import java.util.List; - -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.ManagementContext; -import org.apache.brooklyn.core.mgmt.rebind.RebindTestUtils; -import org.apache.brooklyn.core.test.entity.TestApplication; -import org.apache.brooklyn.entity.core.Entities; -import org.apache.brooklyn.entity.factory.ApplicationBuilder; -import org.apache.brooklyn.location.cloud.AvailabilityZoneExtension; -import org.apache.brooklyn.test.Asserts; -import org.apache.brooklyn.util.collections.MutableSet; -import org.apache.brooklyn.util.net.Networking; -import org.apache.brooklyn.util.os.Os; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import com.google.common.base.Function; -import com.google.common.base.Predicates; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; - -public class MultiLocationRebindTest { - - private ClassLoader classLoader = getClass().getClassLoader(); - private ManagementContext origManagementContext; - private ManagementContext newManagementContext; - private File mementoDir; - - private TestApplication origApp; - private TestApplication newApp; - private SshMachineLocation mac1a; - private SshMachineLocation mac2a; - private FixedListMachineProvisioningLocation<SshMachineLocation> loc1; - private FixedListMachineProvisioningLocation<SshMachineLocation> loc2; - private MultiLocation<SshMachineLocation> multiLoc; - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - mementoDir = Os.newTempDir(getClass()); - origManagementContext = RebindTestUtils.newPersistingManagementContext(mementoDir, classLoader, 1); - origApp = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class), origManagementContext); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - if (origManagementContext != null) Entities.destroyAll(origManagementContext); - if (newApp != null) Entities.destroyAll(newApp.getManagementContext()); - if (newManagementContext != null) Entities.destroyAll(newManagementContext); - if (mementoDir != null) RebindTestUtils.deleteMementoDir(mementoDir); - } - - @SuppressWarnings("unchecked") - @Test - public void testRebindsMultiLocation() throws Exception { - mac1a = origManagementContext.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .displayName("mac1a") - .configure("address", Networking.getInetAddressWithFixedName("1.1.1.1"))); - mac2a = origManagementContext.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .displayName("mac2a") - .configure("address", Networking.getInetAddressWithFixedName("1.1.1.3"))); - loc1 = origManagementContext.getLocationManager().createLocation(LocationSpec.create(FixedListMachineProvisioningLocation.class) - .displayName("loc1") - .configure("machines", MutableSet.of(mac1a))); - loc2 = origManagementContext.getLocationManager().createLocation(LocationSpec.create(FixedListMachineProvisioningLocation.class) - .displayName("loc2") - .configure("machines", MutableSet.of(mac2a))); - multiLoc = origManagementContext.getLocationManager().createLocation(LocationSpec.create(MultiLocation.class) - .displayName("multiLoc") - .configure("subLocations", ImmutableList.of(loc1, loc2))); - - newApp = rebind(); - newManagementContext = newApp.getManagementContext(); - - MultiLocation newMultiLoc = (MultiLocation) Iterables.find(newManagementContext.getLocationManager().getLocations(), Predicates.instanceOf(MultiLocation.class)); - AvailabilityZoneExtension azExtension = newMultiLoc.getExtension(AvailabilityZoneExtension.class); - List<Location> newSublLocs = azExtension.getAllSubLocations(); - Iterable<String> newSubLocNames = Iterables.transform(newSublLocs, new Function<Location, String>() { - @Override public String apply(Location input) { - return (input == null) ? null : input.getDisplayName(); - }}); - Asserts.assertEqualsIgnoringOrder(newSubLocNames, ImmutableList.of("loc1", "loc2")); - } - - private TestApplication rebind() throws Exception { - return rebind(true); - } - - private TestApplication rebind(boolean checkSerializable) throws Exception { - RebindTestUtils.waitForPersisted(origApp); - if (checkSerializable) { - RebindTestUtils.checkCurrentMementoSerializable(origApp); - } - return (TestApplication) RebindTestUtils.rebind(mementoDir, getClass().getClassLoader()); - } -}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/location/basic/MultiLocationResolverTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/location/basic/MultiLocationResolverTest.java b/core/src/test/java/org/apache/brooklyn/location/basic/MultiLocationResolverTest.java deleted file mode 100644 index ed20753..0000000 --- a/core/src/test/java/org/apache/brooklyn/location/basic/MultiLocationResolverTest.java +++ /dev/null @@ -1,198 +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 org.apache.brooklyn.location.basic; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.fail; - -import java.net.InetAddress; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; - -import javax.annotation.Nullable; - -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.location.MachineLocation; -import org.apache.brooklyn.api.location.MachineProvisioningLocation; -import org.apache.brooklyn.api.location.NoMachinesAvailableException; -import org.apache.brooklyn.core.internal.BrooklynProperties; -import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; -import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; -import org.apache.brooklyn.entity.core.Entities; -import org.apache.brooklyn.location.cloud.AvailabilityZoneExtension; -import org.apache.brooklyn.util.collections.MutableList; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.testng.Assert; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import com.google.common.base.Objects; -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; - -public class MultiLocationResolverTest { - - private BrooklynProperties brooklynProperties; - private LocalManagementContext managementContext; - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - managementContext = LocalManagementContextForTests.newInstance(); - brooklynProperties = managementContext.getBrooklynProperties(); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - if (managementContext != null) Entities.destroyAll(managementContext); - } - - @Test - public void testThrowsOnInvalid() throws Exception { - assertThrowsNoSuchElement("wrongprefix:(hosts=\"1.1.1.1\")"); - assertThrowsIllegalArgument("single"); - } - - @Test - public void testThrowsOnInvalidTarget() throws Exception { - assertThrowsIllegalArgument("multi:()"); - assertThrowsIllegalArgument("multi:(wrongprefix:(hosts=\"1.1.1.1\"))"); - assertThrowsIllegalArgument("multi:(foo:bar)"); - } - - @Test - public void testCleansUpOnInvalidTarget() { - assertThrowsNoSuchElement("multi:(targets=\"localhost:(name=testCleansUpOnInvalidTarget),thisNamedLocationDoesNotExist\")"); - Optional<Location> subtarget = Iterables.tryFind(managementContext.getLocationManager().getLocations(), LocationPredicates.displayNameEqualTo("testCleansUpOnInvalidTarget")); - assertFalse(subtarget.isPresent(), "subtarget="+subtarget); - } - - - @Test - public void testResolvesSubLocs() { - assertMultiLocation(resolve("multi:(targets=localhost)"), 1, ImmutableList.of(Predicates.instanceOf(LocalhostMachineProvisioningLocation.class))); - assertMultiLocation(resolve("multi:(targets=\"localhost,localhost\")"), 2, Collections.nCopies(2, Predicates.instanceOf(LocalhostMachineProvisioningLocation.class))); - assertMultiLocation(resolve("multi:(targets=\"localhost,localhost,localhost\")"), 3, Collections.nCopies(3, Predicates.instanceOf(LocalhostMachineProvisioningLocation.class))); - assertMultiLocation(resolve("multi:(targets=\"localhost:(name=mysubname)\")"), 1, ImmutableList.of(displayNameEqualTo("mysubname"))); - assertMultiLocation(resolve("multi:(targets=byon:(hosts=\"1.1.1.1\"))"), 1, ImmutableList.of(Predicates.and( - Predicates.instanceOf(FixedListMachineProvisioningLocation.class), - new Predicate<MachineProvisioningLocation>() { - @Override public boolean apply(MachineProvisioningLocation input) { - SshMachineLocation machine; - try { - machine = (SshMachineLocation) input.obtain(ImmutableMap.of()); - } catch (NoMachinesAvailableException e) { - throw Exceptions.propagate(e); - } - try { - String addr = ((SshMachineLocation)machine).getAddress().getHostAddress(); - return addr != null && addr.equals("1.1.1.1"); - } finally { - input.release(machine); - } - } - }))); - assertMultiLocation(resolve("multi:(targets=\"byon:(hosts=1.1.1.1),byon:(hosts=1.1.1.2)\")"), 2, Collections.nCopies(2, Predicates.instanceOf(FixedListMachineProvisioningLocation.class))); - } - - @Test - public void testResolvesName() { - MultiLocation<SshMachineLocation> multiLoc = resolve("multi:(name=myname,targets=localhost)"); - assertEquals(multiLoc.getDisplayName(), "myname"); - } - - @Test - public void testNamedByonLocation() throws Exception { - brooklynProperties.put("brooklyn.location.named.mynamed", "multi:(targets=byon:(hosts=\"1.1.1.1\"))"); - - MultiLocation<SshMachineLocation> loc = resolve("named:mynamed"); - assertEquals(loc.obtain(ImmutableMap.of()).getAddress(), InetAddress.getByName("1.1.1.1")); - } - - @Test - public void testResolvesFromMap() throws NoMachinesAvailableException { - Location l = managementContext.getLocationRegistry().resolve("multi", MutableMap.of("targets", - MutableList.of("localhost", MutableMap.of("byon", MutableMap.of("hosts", "127.0.0.127"))))); - MultiLocation<?> ml = (MultiLocation<?>)l; - Iterator<MachineProvisioningLocation<?>> ci = ml.getSubLocations().iterator(); - - l = ci.next(); - Assert.assertTrue(l instanceof LocalhostMachineProvisioningLocation, "Expected localhost, got "+l); - - l = ci.next(); - Assert.assertTrue(l instanceof FixedListMachineProvisioningLocation, "Expected fixed, got "+l); - MachineLocation sl = ((FixedListMachineProvisioningLocation<?>)l).obtain(); - Assert.assertEquals(sl.getAddress().getHostAddress(), "127.0.0.127"); - - Assert.assertFalse(ci.hasNext()); - } - - - private void assertThrowsNoSuchElement(String val) { - try { - resolve(val); - fail(); - } catch (NoSuchElementException e) { - // success - } - } - - private void assertThrowsIllegalArgument(String val) { - try { - resolve(val); - fail(); - } catch (IllegalArgumentException e) { - // success - } - } - - @SuppressWarnings("unchecked") - private MultiLocation<SshMachineLocation> resolve(String val) { - return (MultiLocation<SshMachineLocation>) managementContext.getLocationRegistry().resolve(val); - } - - @SuppressWarnings("rawtypes") - private void assertMultiLocation(MultiLocation<?> multiLoc, int expectedSize, List<? extends Predicate> expectedSubLocationPredicates) { - AvailabilityZoneExtension zones = multiLoc.getExtension(AvailabilityZoneExtension.class); - List<Location> subLocs = zones.getAllSubLocations(); - assertEquals(subLocs.size(), expectedSize, "zones="+subLocs); - for (int i = 0; i < subLocs.size(); i++) { - MachineProvisioningLocation subLoc = (MachineProvisioningLocation) subLocs.get(i); - assertTrue(expectedSubLocationPredicates.get(i).apply(subLoc), "index="+i+"; subLocs="+subLocs); - } - } - - public static <T> Predicate<Location> displayNameEqualTo(final T val) { - return new Predicate<Location>() { - @Override - public boolean apply(@Nullable Location input) { - return Objects.equal(input.getDisplayName(), val); - } - }; - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/location/basic/MultiLocationTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/location/basic/MultiLocationTest.java b/core/src/test/java/org/apache/brooklyn/location/basic/MultiLocationTest.java deleted file mode 100644 index e5b3fda..0000000 --- a/core/src/test/java/org/apache/brooklyn/location/basic/MultiLocationTest.java +++ /dev/null @@ -1,118 +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 org.apache.brooklyn.location.basic; - -import static org.testng.Assert.assertTrue; - -import org.apache.brooklyn.test.Asserts; -import org.apache.brooklyn.util.collections.MutableSet; -import org.apache.brooklyn.util.net.Networking; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.Assert; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; -import org.apache.brooklyn.api.location.LocationSpec; -import org.apache.brooklyn.api.location.NoMachinesAvailableException; -import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; -import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; -import org.apache.brooklyn.entity.core.Entities; -import org.apache.brooklyn.location.cloud.AvailabilityZoneExtension; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; - -public class MultiLocationTest { - - private static final Logger log = LoggerFactory.getLogger(MultiLocationTest.class); - - private LocalManagementContext managementContext; - private SshMachineLocation mac1a; - private SshMachineLocation mac1b; - private SshMachineLocation mac2a; - private SshMachineLocation mac2b; - private FixedListMachineProvisioningLocation<SshMachineLocation> loc1; - private FixedListMachineProvisioningLocation<SshMachineLocation> loc2; - private MultiLocation<SshMachineLocation> multiLoc; - - @SuppressWarnings("unchecked") - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - managementContext = LocalManagementContextForTests.newInstance(); - mac1a = managementContext.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .displayName("mac1a") - .configure("address", Networking.getInetAddressWithFixedName("1.1.1.1"))); - mac1b = managementContext.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .displayName("mac1b") - .configure("address", Networking.getInetAddressWithFixedName("1.1.1.2"))); - mac2a = managementContext.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .displayName("mac2a") - .configure("address", Networking.getInetAddressWithFixedName("1.1.1.3"))); - mac2b = managementContext.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .displayName("mac2b") - .configure("address", Networking.getInetAddressWithFixedName("1.1.1.4"))); - loc1 = managementContext.getLocationManager().createLocation(LocationSpec.create(FixedListMachineProvisioningLocation.class) - .displayName("loc1") - .configure("machines", MutableSet.of(mac1a, mac1b))); - loc2 = managementContext.getLocationManager().createLocation(LocationSpec.create(FixedListMachineProvisioningLocation.class) - .displayName("loc2") - .configure("machines", MutableSet.of(mac2a, mac2b))); - multiLoc = managementContext.getLocationManager().createLocation(LocationSpec.create(MultiLocation.class) - .displayName("multiLoc") - .configure("subLocations", ImmutableList.of(loc1, loc2))); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - if (managementContext != null) Entities.destroyAll(managementContext); - } - - @Test - public void testHasAvailabilityZonesAsSubLocations() throws Exception { - multiLoc.hasExtension(AvailabilityZoneExtension.class); - AvailabilityZoneExtension extension = multiLoc.getExtension(AvailabilityZoneExtension.class); - Asserts.assertEqualsIgnoringOrder(extension.getAllSubLocations(), ImmutableList.of(loc1, loc2)); - Asserts.assertEqualsIgnoringOrder(extension.getSubLocations(2), ImmutableList.of(loc1, loc2)); - assertTrue(ImmutableList.of(loc1, loc2).containsAll(extension.getSubLocations(1))); - } - - @Test - public void testObtainAndReleaseDelegateToSubLocation() throws Exception { - SshMachineLocation obtained = multiLoc.obtain(ImmutableMap.of()); - assertTrue(ImmutableList.of(mac1a, mac1b, mac2a, mac2b).contains(obtained)); - multiLoc.release(obtained); - } - - @Test - public void testObtainsMovesThroughSubLocations() throws Exception { - Assert.assertEquals(multiLoc.obtain().getAddress().getHostAddress(), "1.1.1.1"); - Assert.assertEquals(multiLoc.obtain().getAddress().getHostAddress(), "1.1.1.2"); - Assert.assertEquals(multiLoc.obtain().getAddress().getHostAddress(), "1.1.1.3"); - Assert.assertEquals(multiLoc.obtain().getAddress().getHostAddress(), "1.1.1.4"); - try { - multiLoc.obtain(); - Assert.fail(); - } catch (NoMachinesAvailableException e) { - log.info("Error when no machines available across locations is: "+e); - Assert.assertTrue(e.toString().contains("loc1"), "Message should have referred to sub-location message: "+e); - } - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/location/basic/PaasLocationTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/location/basic/PaasLocationTest.java b/core/src/test/java/org/apache/brooklyn/location/basic/PaasLocationTest.java deleted file mode 100644 index 1322cc3..0000000 --- a/core/src/test/java/org/apache/brooklyn/location/basic/PaasLocationTest.java +++ /dev/null @@ -1,35 +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 org.apache.brooklyn.location.basic; - -import org.apache.brooklyn.core.test.location.TestPaasLocation; -import org.apache.brooklyn.location.paas.PaasLocation; -import org.testng.Assert; -import org.testng.annotations.Test; - -public class PaasLocationTest { - - private PaasLocation location; - - @Test - public void testProviderName(){ - location = new TestPaasLocation(); - Assert.assertEquals(location.getPaasProviderName(), "TestPaas"); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/location/basic/PortRangesTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/location/basic/PortRangesTest.java b/core/src/test/java/org/apache/brooklyn/location/basic/PortRangesTest.java deleted file mode 100644 index f0c1f09..0000000 --- a/core/src/test/java/org/apache/brooklyn/location/basic/PortRangesTest.java +++ /dev/null @@ -1,129 +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 org.apache.brooklyn.location.basic; - -import static org.testng.Assert.assertEquals; - -import java.util.Iterator; - -import org.testng.Assert; -import org.testng.annotations.Test; -import org.apache.brooklyn.api.location.PortRange; -import org.apache.brooklyn.util.core.flags.TypeCoercions; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; - -public class PortRangesTest { - - @Test - public void testSingleRange() { - PortRange r = PortRanges.fromInteger(1234); - assertContents(r, 1234); - } - - @Test - public void testFromCollection() { - PortRange r = PortRanges.fromCollection(ImmutableList.of(1234, 2345)); - assertContents(r, 1234, 2345); - } - - @Test - public void testFromString() { - PortRange r = PortRanges.fromString("80,8080,8000,8080-8099"); - assertContents(r, 80, 8080, 8000, - 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, - 8090, 8091, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099); - } - - @Test - public void testFromStringWithSpaces() { - PortRange r = PortRanges.fromString(" 80 , 8080 , 8000 , 8080 - 8099 "); - assertContents(r, 80, 8080, 8000, - 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, - 8090, 8091, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099); - } - - @Test - public void testFromStringWithSpacesToString() { - PortRange r = PortRanges.fromString(" 80 , 8080 , 8000 , 8080 - 8099 "); - Assert.assertEquals(r.toString(), "80,8080,8000,8080-8099"); - } - - @Test - public void testFromStringThrowsIllegalArgumentException() { - assertFromStringThrowsIllegalArgumentException("80-100000"); - assertFromStringThrowsIllegalArgumentException("0-80"); - } - - @Test - public void testCoercion() { - PortRanges.init(); - PortRange r = TypeCoercions.coerce("80", PortRange.class); - assertContents(r, 80); - } - - @Test - public void testCoercionInt() { - PortRanges.init(); - PortRange r = TypeCoercions.coerce(80, PortRange.class); - assertContents(r, 80); - } - - @Test - public void testLinearRangeOfSizeOne() throws Exception { - PortRanges.LinearPortRange range = new PortRanges.LinearPortRange(80, 80); - assertEquals(Lists.newArrayList(range), ImmutableList.of(80)); - } - - @Test - public void testLinearRangeCountingUpwards() throws Exception { - PortRanges.LinearPortRange range = new PortRanges.LinearPortRange(80, 81); - assertEquals(Lists.newArrayList(range), ImmutableList.of(80, 81)); - } - - @Test - public void testLinearRangeCountingDownwards() throws Exception { - PortRanges.LinearPortRange range = new PortRanges.LinearPortRange(80, 79); - assertEquals(Lists.newArrayList(range), ImmutableList.of(80, 79)); - } - - protected void assertFromStringThrowsIllegalArgumentException(String range) { - try { - PortRanges.fromString(range); - Assert.fail(); - } catch (IllegalArgumentException e) { - // success - } - } - - private static <T> void assertContents(Iterable<T> actual, T ...expected) { - Iterator<T> i = actual.iterator(); - int c = 0; - while (i.hasNext()) { - if (expected.length<=c) { - Assert.fail("Iterable contained more than the "+c+" expected elements"); - } - Assert.assertEquals(i.next(), expected[c++]); - } - if (expected.length>c) { - Assert.fail("Iterable contained only "+c+" elements, "+expected.length+" expected"); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/location/basic/RecordingMachineLocationCustomizer.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/location/basic/RecordingMachineLocationCustomizer.java b/core/src/test/java/org/apache/brooklyn/location/basic/RecordingMachineLocationCustomizer.java deleted file mode 100644 index 53e261f..0000000 --- a/core/src/test/java/org/apache/brooklyn/location/basic/RecordingMachineLocationCustomizer.java +++ /dev/null @@ -1,71 +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 org.apache.brooklyn.location.basic; - -import static com.google.common.base.Preconditions.checkNotNull; - -import java.util.List; - -import com.google.common.base.Objects; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; - -import org.apache.brooklyn.api.location.MachineLocation; -import org.apache.brooklyn.api.location.MachineLocationCustomizer; - -public class RecordingMachineLocationCustomizer implements MachineLocationCustomizer { - public static class Call { - public final String methodName; - public final List<?> args; - - Call(String methodName, List<?> args) { - this.methodName = checkNotNull(methodName); - this.args = checkNotNull(args); - } - - @Override - public String toString() { - return methodName+args; - } - - @Override - public int hashCode() { - return Objects.hashCode(methodName, args); - } - - @Override - public boolean equals(Object other) { - return (other instanceof RecordingMachineLocationCustomizer.Call) && - methodName.equals(((RecordingMachineLocationCustomizer.Call)other).methodName) && - args.equals(((RecordingMachineLocationCustomizer.Call)other).args); - } - } - - public final List<RecordingMachineLocationCustomizer.Call> calls = Lists.newCopyOnWriteArrayList(); - - @Override - public void customize(MachineLocation machine) { - calls.add(new Call("customize", ImmutableList.of(machine))); - } - - @Override - public void preRelease(MachineLocation machine) { - calls.add(new Call("preRelease", ImmutableList.of(machine))); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/location/basic/SimulatedLocation.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/location/basic/SimulatedLocation.java b/core/src/test/java/org/apache/brooklyn/location/basic/SimulatedLocation.java deleted file mode 100644 index 1e2cd33..0000000 --- a/core/src/test/java/org/apache/brooklyn/location/basic/SimulatedLocation.java +++ /dev/null @@ -1,136 +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 org.apache.brooklyn.location.basic; - -import java.net.InetAddress; -import java.util.Collection; -import java.util.Map; -import java.util.Set; - -import org.apache.brooklyn.api.location.HardwareDetails; -import org.apache.brooklyn.api.location.LocationSpec; -import org.apache.brooklyn.api.location.MachineDetails; -import org.apache.brooklyn.api.location.MachineLocation; -import org.apache.brooklyn.api.location.MachineProvisioningLocation; -import org.apache.brooklyn.api.location.OsDetails; -import org.apache.brooklyn.api.location.PortRange; -import org.apache.brooklyn.api.location.PortSupplier; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.net.Networking; - -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; - - -/** Location for use in dev/test, defining custom start/stop support, and/or tweaking the ports which are permitted to be available - * (using setPermittedPorts(Iterable)) - */ -public class SimulatedLocation extends AbstractLocation implements MachineProvisioningLocation<MachineLocation>, MachineLocation, PortSupplier { - - private static final long serialVersionUID = 1L; - - private static final InetAddress address; - static { - address = Networking.getLocalHost(); - } - - Iterable<Integer> permittedPorts = PortRanges.fromString("1+"); - Set<Integer> usedPorts = Sets.newLinkedHashSet(); - - public SimulatedLocation() { - this(MutableMap.<String,Object>of()); - } - public SimulatedLocation(Map<String,? extends Object> flags) { - super(flags); - } - - @Override - public SimulatedLocation newSubLocation(Map<?,?> newFlags) { - // TODO shouldn't have to copy config bag as it should be inherited (but currently it is not used inherited everywhere; just most places) - return getManagementContext().getLocationManager().createLocation(LocationSpec.create(getClass()) - .parent(this) - .configure(config().getLocalBag().getAllConfig()) // FIXME Should this just be inherited? - .configure(newFlags)); - } - - public MachineLocation obtain(Map<?,?> flags) { - return this; - } - - public void release(MachineLocation machine) { - } - - public Map<String,Object> getProvisioningFlags(Collection<String> tags) { - return MutableMap.<String,Object>of(); - } - - public InetAddress getAddress() { - return address; - } - - @Override - public String getHostname() { - String hostname = address.getHostName(); - return (hostname == null || hostname.equals(address.getHostAddress())) ? null : hostname; - } - - @Override - public Set<String> getPublicAddresses() { - return ImmutableSet.of(address.getHostAddress()); - } - - @Override - public Set<String> getPrivateAddresses() { - return ImmutableSet.of(); - } - - public synchronized boolean obtainSpecificPort(int portNumber) { - if (!Iterables.contains(permittedPorts, portNumber)) return false; - if (usedPorts.contains(portNumber)) return false; - usedPorts.add(portNumber); - return true; - } - - public synchronized int obtainPort(PortRange range) { - for (int p: range) - if (obtainSpecificPort(p)) return p; - return -1; - } - - public synchronized void releasePort(int portNumber) { - usedPorts.remove(portNumber); - } - - public synchronized void setPermittedPorts(Iterable<Integer> ports) { - permittedPorts = ports; - } - - @Override - public OsDetails getOsDetails() { - return getMachineDetails().getOsDetails(); - } - - @Override - public MachineDetails getMachineDetails() { - HardwareDetails hardwareDetails = new BasicHardwareDetails(null, null); - OsDetails osDetails = BasicOsDetails.Factory.ANONYMOUS_LINUX; - return new BasicMachineDetails(hardwareDetails, osDetails); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/location/basic/SingleMachineLocationResolverTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/location/basic/SingleMachineLocationResolverTest.java b/core/src/test/java/org/apache/brooklyn/location/basic/SingleMachineLocationResolverTest.java deleted file mode 100644 index 6775352..0000000 --- a/core/src/test/java/org/apache/brooklyn/location/basic/SingleMachineLocationResolverTest.java +++ /dev/null @@ -1,130 +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 org.apache.brooklyn.location.basic; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.fail; - -import java.net.InetAddress; -import java.util.Map; -import java.util.NoSuchElementException; - -import org.apache.brooklyn.core.internal.BrooklynProperties; -import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; -import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; -import org.apache.brooklyn.entity.core.Entities; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableMap; - -public class SingleMachineLocationResolverTest { - - private BrooklynProperties brooklynProperties; - private LocalManagementContext managementContext; - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - managementContext = LocalManagementContextForTests.newInstance(); - brooklynProperties = managementContext.getBrooklynProperties(); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - if (managementContext != null) Entities.destroyAll(managementContext); - } - - @Test - public void testThrowsOnInvalid() throws Exception { - assertThrowsNoSuchElement("wrongprefix:(hosts=\"1.1.1.1\")"); - assertThrowsIllegalArgument("single"); - } - - @Test - public void testThrowsOnInvalidTarget() throws Exception { - assertThrowsIllegalArgument("single()"); - assertThrowsIllegalArgument("single(wrongprefix:(hosts=\"1.1.1.1\"))"); - assertThrowsIllegalArgument("single(foo:bar)"); - } - - @Test - public void resolveHosts() { - resolve("single(target=localhost)"); - resolve("single(target=byon(hosts=\"1.1.1.1\"))"); - - brooklynProperties.put("brooklyn.location.named.mynamed", "single(target=byon:(hosts=\"1.1.1.1\"))"); - managementContext.clearLocationRegistry(); - resolve("single(target=named:mynamed)"); - } - - @Test - public void resolveWithOldColonFormat() { - resolve("single:(target=localhost)"); - } - - @Test - public void testNamedByonLocation() throws Exception { - brooklynProperties.put("brooklyn.location.named.mynamed", "single(target=byon:(hosts=\"1.1.1.1\"))"); - - SingleMachineProvisioningLocation<SshMachineLocation> loc = resolve("named:mynamed"); - assertEquals(loc.obtain(ImmutableMap.of()).getAddress(), InetAddress.getByName("1.1.1.1")); - } - - @Test - public void testPropertyScopePrescedence() throws Exception { - brooklynProperties.put("brooklyn.location.named.mynamed", "single(target=byon:(hosts=\"1.1.1.1\"))"); - - // prefer those in "named" over everything else - brooklynProperties.put("brooklyn.location.named.mynamed.privateKeyFile", "privateKeyFile-inNamed"); - brooklynProperties.put("brooklyn.localhost.privateKeyFile", "privateKeyFile-inGeneric"); - - // prefer location-generic if nothing else - brooklynProperties.put("brooklyn.location.privateKeyData", "privateKeyData-inGeneric"); - - Map<String, Object> conf = resolve("named:mynamed").obtain(ImmutableMap.of()).config().getBag().getAllConfig(); - - assertEquals(conf.get("privateKeyFile"), "privateKeyFile-inNamed"); - assertEquals(conf.get("privateKeyData"), "privateKeyData-inGeneric"); - } - - private void assertThrowsNoSuchElement(String val) { - try { - resolve(val); - fail(); - } catch (NoSuchElementException e) { - // success - } - } - - private void assertThrowsIllegalArgument(String val) { - try { - resolve(val); - fail(); - } catch (IllegalArgumentException e) { - // success - } - } - - @SuppressWarnings("unchecked") - private SingleMachineProvisioningLocation<SshMachineLocation> resolve(String val) { - return (SingleMachineProvisioningLocation<SshMachineLocation>) managementContext.getLocationRegistry().resolve(val); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/location/basic/SingleMachineProvisioningLocationTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/location/basic/SingleMachineProvisioningLocationTest.java b/core/src/test/java/org/apache/brooklyn/location/basic/SingleMachineProvisioningLocationTest.java deleted file mode 100644 index 77a0d3f..0000000 --- a/core/src/test/java/org/apache/brooklyn/location/basic/SingleMachineProvisioningLocationTest.java +++ /dev/null @@ -1,63 +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 org.apache.brooklyn.location.basic; - -import static org.testng.Assert.assertNotNull; - -import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; -import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -public class SingleMachineProvisioningLocationTest { - - private static final Logger log = LoggerFactory.getLogger(SingleMachineProvisioningLocation.class); - - private LocalManagementContext managementContext; - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - managementContext = LocalManagementContextForTests.newInstance(); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - if (managementContext != null) managementContext.terminate(); - } - - @SuppressWarnings("unchecked") - @Test - public void testLocalhostSingle() throws Exception { - SingleMachineProvisioningLocation<SshMachineLocation> l = (SingleMachineProvisioningLocation<SshMachineLocation>) - managementContext.getLocationRegistry().resolve("single:(target='localhost')"); - l.setManagementContext(managementContext); - - SshMachineLocation m1 = l.obtain(); - - assertNotNull(m1); - - log.info("GOT "+m1); - - l.release(m1); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationIntegrationTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationIntegrationTest.java b/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationIntegrationTest.java deleted file mode 100644 index af0ca0d..0000000 --- a/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationIntegrationTest.java +++ /dev/null @@ -1,139 +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 org.apache.brooklyn.location.basic; - -import java.io.ByteArrayOutputStream; -import java.security.KeyPair; -import java.util.Arrays; -import java.util.Map; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; - -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; -import org.apache.brooklyn.core.test.entity.TestApplication; -import org.apache.brooklyn.entity.core.Entities; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.core.crypto.SecureKeys; -import org.apache.brooklyn.util.core.internal.ssh.SshTool; -import org.apache.brooklyn.util.core.internal.ssh.sshj.SshjTool; -import org.apache.brooklyn.util.core.internal.ssh.sshj.SshjTool.SshjToolBuilder; -import org.testng.Assert; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import com.google.common.base.Preconditions; - -import static org.testng.Assert.assertEquals; - -public class SshMachineLocationIntegrationTest { - - protected TestApplication app; - protected ManagementContext mgmt; - - @BeforeMethod(alwaysRun=true) - public void setup() throws Exception { - mgmt = LocalManagementContextForTests.builder(true) - .useDefaultProperties() - .build(); - app = TestApplication.Factory.newManagedInstanceForTests(mgmt); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - if (mgmt != null) Entities.destroyAll(mgmt); - mgmt = null; - } - - // Note: requires `named:localhost-passphrase` set up with a key whose passphrase is "localhost" - // * create the key with: - // ssh-keygen -t rsa -N "brooklyn" -f ~/.ssh/id_rsa_passphrase - // ssh-copy-id localhost - // * create brooklyn.properties, containing: - // brooklyn.location.named.localhost-passphrase=localhost - // brooklyn.location.named.localhost-passphrase.privateKeyFile=~/.ssh/id_rsa_passphrase - // brooklyn.location.named.localhost-passphrase.privateKeyPassphrase=brooklyn - @Test(groups = "Integration") - public void testExtractingConnectablePassphraselessKey() throws Exception { - LocalhostMachineProvisioningLocation lhp = (LocalhostMachineProvisioningLocation) mgmt.getLocationRegistry().resolve("named:localhost-passphrase", true, null).orNull(); - Preconditions.checkNotNull(lhp, "This test requires a localhost named location called 'localhost-passphrase' (which should have a passphrase set)"); - SshMachineLocation sm = lhp.obtain(); - - SshjToolBuilder builder = SshjTool.builder().host(sm.getAddress().getHostName()).user(sm.getUser()); - - KeyPair data = sm.findKeyPair(); - if (data!=null) builder.privateKeyData(SecureKeys.toPem(data)); - String password = sm.findPassword(); - if (password!=null) builder.password(password); - SshjTool tool = builder.build(); - tool.connect(); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int result = tool.execCommands(MutableMap.<String,Object>of("out", out), Arrays.asList("date")); - Assert.assertTrue(out.toString().contains(" 20"), "out="+out); - assertEquals(result, 0); - } - - @Test(groups = "Integration") - public void testExecScriptScriptDirFlagIsRespected() throws Exception { - // For explanation of (some of) the magic behind this command, see http://stackoverflow.com/a/229606/68898 - final String command = "if [[ \"$0\" == \"/var/tmp/\"* ]]; then true; else false; fi"; - - LocalhostMachineProvisioningLocation lhp = (LocalhostMachineProvisioningLocation) mgmt.getLocationRegistry().resolve("localhost", true, null).orNull(); - SshMachineLocation sm = lhp.obtain(); - - Map<String, Object> props = ImmutableMap.<String, Object>builder() - .put(SshTool.PROP_SCRIPT_DIR.getName(), "/var/tmp") - .build(); - int rc = sm.execScript(props, "Test script directory execution", ImmutableList.of(command)); - assertEquals(rc, 0); - } - - @Test(groups = "Integration") - public void testLocationScriptDirConfigIsRespected() throws Exception { - // For explanation of (some of) the magic behind this command, see http://stackoverflow.com/a/229606/68898 - final String command = "if [[ \"$0\" == \"/var/tmp/\"* ]]; then true; else false; fi"; - - Map<String, Object> locationConfig = ImmutableMap.<String, Object>builder() - .put(SshMachineLocation.SCRIPT_DIR.getName(), "/var/tmp") - .build(); - - LocalhostMachineProvisioningLocation lhp = (LocalhostMachineProvisioningLocation) mgmt.getLocationRegistry().resolve("localhost", locationConfig); - SshMachineLocation sm = lhp.obtain(); - - int rc = sm.execScript("Test script directory execution", ImmutableList.of(command)); - assertEquals(rc, 0); - } - - @Test(groups = "Integration") - public void testMissingLocationScriptDirIsAlsoOkay() throws Exception { - final String command = "echo hello"; - - Map<String, Object> locationConfig = ImmutableMap.<String, Object>builder() -// .put(SshMachineLocation.SCRIPT_DIR.getName(), "/var/tmp") - .build(); - - LocalhostMachineProvisioningLocation lhp = (LocalhostMachineProvisioningLocation) mgmt.getLocationRegistry().resolve("localhost", locationConfig); - SshMachineLocation sm = lhp.obtain(); - - int rc = sm.execScript("Test script directory execution", ImmutableList.of(command)); - assertEquals(rc, 0); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationPerformanceTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationPerformanceTest.java b/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationPerformanceTest.java deleted file mode 100644 index cd254c9..0000000 --- a/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationPerformanceTest.java +++ /dev/null @@ -1,171 +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 org.apache.brooklyn.location.basic; - -import java.io.ByteArrayOutputStream; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -import org.apache.brooklyn.test.PerformanceTestUtils; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.core.internal.ssh.SshTool; -import org.apache.brooklyn.util.net.Networking; -import org.apache.brooklyn.util.stream.Streams; -import org.apache.brooklyn.util.text.Identifiers; -import org.apache.brooklyn.util.time.Time; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import com.google.common.base.Stopwatch; -import com.google.common.base.Throwables; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.common.util.concurrent.MoreExecutors; - -/** - * Test the performance of different variants of invoking the sshj tool. - * - * Intended for human-invocation and inspection, to see which parts are most expensive. - */ -public class SshMachineLocationPerformanceTest { - - private static final Logger LOG = LoggerFactory.getLogger(SshMachineLocationPerformanceTest.class); - - private SshMachineLocation machine; - private ListeningExecutorService executor; - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - machine = new SshMachineLocation(MutableMap.of("address", "localhost")); - executor = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool()); - } - - @AfterMethod(alwaysRun=true) - public void afterMethod() throws Exception { - if (executor != null) executor.shutdownNow(); - Streams.closeQuietly(machine); - } - - @Test(groups = {"Integration"}) - public void testConsecutiveSmallCommands() throws Exception { - runExecManyCommands(ImmutableList.of("true"), "small-cmd", 10); - } - - // Mimics SshSensorAdapter's polling - @Test(groups = {"Integration"}) - public void testConsecutiveSmallCommandsWithCustomStdoutAndErr() throws Exception { - final ByteArrayOutputStream stdout = new ByteArrayOutputStream(); - final ByteArrayOutputStream stderr = new ByteArrayOutputStream(); - - Runnable task = new Runnable() { - @Override public void run() { - machine.execScript(ImmutableMap.of("out", stdout, "err", stderr), "test", ImmutableList.of("true")); - }}; - runMany(task, "small-cmd-custom-stdout", 1, 10); - } - - @Test(groups = {"Integration"}) - public void testConcurrentSmallCommands() throws Exception { - runExecManyCommands(ImmutableList.of("true"), "small-cmd", 10, 10); - } - - @Test(groups = {"Integration"}) - public void testConsecutiveBigStdoutCommands() throws Exception { - runExecManyCommands(ImmutableList.of("head -c 100000 /dev/urandom"), "big-stdout", 10); - } - - @Test(groups = {"Integration"}) - public void testConsecutiveBigStdinCommands() throws Exception { - String bigstr = Identifiers.makeRandomId(100000); - runExecManyCommands(ImmutableList.of("echo "+bigstr+" | wc -c"), "big-stdin", 10); - } - - @Test(groups = {"Integration"}) - public void testConsecutiveSmallCommandsWithDifferentProperties() throws Exception { - final Map<String, ?> emptyProperties = Collections.emptyMap(); - final Map<String, ?> customProperties = MutableMap.of( - "address", Networking.getLocalHost(), - SshTool.PROP_SESSION_TIMEOUT.getName(), 20000, - SshTool.PROP_CONNECT_TIMEOUT.getName(), 50000, - SshTool.PROP_SCRIPT_HEADER.getName(), "#!/bin/bash"); - - Runnable task = new Runnable() { - @Override public void run() { - if (Math.random() < 0.5) { - machine.execScript(emptyProperties, "test", ImmutableList.of("true")); - } else { - machine.execScript(customProperties, "test", ImmutableList.of("true")); - } - }}; - runMany(task, "small-cmd-custom-ssh-properties", 1, 10); - } - - private void runExecManyCommands(final List<String> cmds, String context, int iterations) throws Exception { - runExecManyCommands(cmds, context, 1, iterations); - } - - private void runExecManyCommands(final List<String> cmds, String context, int concurrentRuns, int iterations) throws Exception { - Runnable task = new Runnable() { - @Override public void run() { - execScript(cmds); - }}; - runMany(task, context, concurrentRuns, iterations); - } - - private void runMany(final Runnable task, final String context, int concurrentRuns, int iterations) throws Exception { - long preCpuTime = PerformanceTestUtils.getProcessCpuTime(); - Stopwatch stopwatch = Stopwatch.createStarted(); - - for (int i = 0; i < iterations; i++) { - List<ListenableFuture<?>> futures = Lists.newArrayList(); - for (int j = 0; j < concurrentRuns; j++) { - futures.add(executor.submit(new Runnable() { - public void run() { - try { - task.run(); - } catch (Exception e) { - LOG.error("Error for "+context+", executing "+task, e); - throw Throwables.propagate(e); - } - }})); - } - Futures.allAsList(futures).get(); - - long postCpuTime = PerformanceTestUtils.getProcessCpuTime(); - long elapsedTime = stopwatch.elapsed(TimeUnit.MILLISECONDS); - double fractionCpu = (elapsedTime > 0) ? ((double)postCpuTime-preCpuTime) / TimeUnit.MILLISECONDS.toNanos(elapsedTime) : -1; - LOG.info("Executing {}; completed {}; took {}; fraction cpu {}", - new Object[] {context, (i+1), Time.makeTimeStringRounded(elapsedTime), fractionCpu}); - } - } - - private int execScript(List<String> cmds) { - return machine.execScript("mysummary", cmds); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationReuseIntegrationTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationReuseIntegrationTest.java b/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationReuseIntegrationTest.java deleted file mode 100644 index 2b1d8e1..0000000 --- a/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationReuseIntegrationTest.java +++ /dev/null @@ -1,171 +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 org.apache.brooklyn.location.basic; - -import static org.testng.Assert.assertEquals; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; - -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; -import org.apache.brooklyn.api.location.LocationSpec; -import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; -import org.apache.brooklyn.entity.core.Entities; -import org.apache.brooklyn.test.Asserts; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.core.internal.ssh.SshTool; -import org.apache.brooklyn.util.core.internal.ssh.sshj.SshjTool; -import org.apache.brooklyn.util.net.Networking; -import org.apache.brooklyn.util.stream.Streams; -import org.apache.brooklyn.util.time.Duration; - -import com.google.common.collect.ImmutableList; - -/** - * Tests the re-use of SshTools in SshMachineLocation - */ -public class SshMachineLocationReuseIntegrationTest { - - public static class RecordingSshjTool extends SshjTool { - public static final AtomicBoolean forbidden = new AtomicBoolean(false); - public static final AtomicInteger connectionCount = new AtomicInteger(0); - public static final AtomicInteger disconnectionCount = new AtomicInteger(); - - public RecordingSshjTool(Map<String, ?> map) { - super(map); - } - - @Override - public void connect() { - if (forbidden.get()) throw new IllegalStateException("forbidden at this time"); - connectionCount.incrementAndGet(); - super.connect(); - } - - @Override - public void disconnect() { - disconnectionCount.incrementAndGet(); - super.disconnect(); - } - - public static void reset() { - forbidden.set(false); - connectionCount.set(0); - disconnectionCount.set(0); - } - - @Override - public int execCommands(Map<String, ?> props, List<String> commands, Map<String, ?> env) { - if (forbidden.get()) throw new IllegalStateException("forbidden at this time"); - return super.execCommands(props, commands, env); - } - - @Override - public int execScript(Map<String, ?> props, List<String> commands, Map<String, ?> env) { - if (forbidden.get()) throw new IllegalStateException("forbidden at this time"); - return super.execScript(props, commands, env); - } - - @Override - public int execShellDirect(Map<String, ?> props, List<String> commands, Map<String, ?> env) { - if (forbidden.get()) throw new IllegalStateException("forbidden at this time"); - return super.execShellDirect(props, commands, env); - } - } - - private SshMachineLocation host; - private LocalManagementContext managementContext; - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - managementContext = new LocalManagementContext(); - host = managementContext.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .configure("address", Networking.getLocalHost()) - .configure(SshTool.PROP_TOOL_CLASS, RecordingSshjTool.class.getName())); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - if (host != null) Streams.closeQuietly(host); - if (managementContext != null) Entities.destroyAll(managementContext); - RecordingSshjTool.reset(); - } - - @Test(groups = "Integration") - public void testBasicReuse() throws Exception { - host.execScript("mysummary", ImmutableList.of("exit")); - host.execScript("mysummary", ImmutableList.of("exit")); - assertEquals(RecordingSshjTool.connectionCount.get(), 1, "Expected one SSH connection to have been recorded"); - } - - @Test(groups = "Integration") - public void testReuseWithInterestingProps() throws Exception { - host.execScript(customSshConfigKeys(), "mysummary", ImmutableList.of("exit")); - host.execScript(customSshConfigKeys(), "mysummary", ImmutableList.of("exit")); - assertEquals(RecordingSshjTool.connectionCount.get(), 1, "Expected one SSH connection to have been recorded"); - } - - @Test(groups = "Integration") - public void testNewConnectionForDifferentProps() throws Exception { - host.execScript("mysummary", ImmutableList.of("exit")); - host.execScript(customSshConfigKeys(), "mysummary", ImmutableList.of("exit")); - assertEquals(RecordingSshjTool.connectionCount.get(), 2, "Expected two SSH connections to have been recorded"); - } - - @Test(groups = "Integration") - public void testSshToolReusedWhenConfigDiffers() throws Exception { - Map<String, Object> props = customSshConfigKeys(); - host.execScript(props, "mysummary", ImmutableList.of("exit")); - - // Use another output stream for second request - props.put(SshTool.PROP_SCRIPT_HEADER.getName(), "#!/bin/bash -e\n"); - host.execScript(props, "mysummary", ImmutableList.of("exit")); - assertEquals(RecordingSshjTool.connectionCount.get(), 1, "Expected one SSH connection to have been recorded even though out script header differed."); - } - - @Test(groups = "Integration") - public void testSshCacheExpiresEvenIfNotUsed() throws Exception { - SshMachineLocation host2 = managementContext.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .configure("address", InetAddress.getLocalHost()) - .configure(SshMachineLocation.SSH_CACHE_EXPIRY_DURATION, Duration.ONE_SECOND) - .configure(SshTool.PROP_TOOL_CLASS, RecordingSshjTool.class.getName())); - - Map<String, Object> props = customSshConfigKeys(); - host2.execScript(props, "mysummary", ImmutableList.of("exit")); - - Asserts.succeedsEventually(new Runnable() { - @Override public void run() { - assertEquals(RecordingSshjTool.disconnectionCount.get(), 1); - }}); - } - - public Map<String, Object> customSshConfigKeys() throws UnknownHostException { - return MutableMap.<String, Object>of( - "address", Networking.getLocalHost(), - SshTool.PROP_SESSION_TIMEOUT.getName(), 20000, - SshTool.PROP_CONNECT_TIMEOUT.getName(), 50000, - SshTool.PROP_SCRIPT_HEADER.getName(), "#!/bin/bash"); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationTest.java b/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationTest.java deleted file mode 100644 index bbc0a7f..0000000 --- a/core/src/test/java/org/apache/brooklyn/location/basic/SshMachineLocationTest.java +++ /dev/null @@ -1,339 +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 org.apache.brooklyn.location.basic; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.assertSame; -import static org.testng.Assert.assertTrue; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.OutputStream; -import java.net.InetAddress; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Callable; - -import org.apache.brooklyn.api.effector.Effector; -import org.apache.brooklyn.api.entity.EntityInitializer; -import org.apache.brooklyn.api.entity.EntitySpec; -import org.apache.brooklyn.api.internal.EntityLocal; -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.location.LocationSpec; -import org.apache.brooklyn.api.location.MachineDetails; -import org.apache.brooklyn.api.location.MachineLocation; -import org.apache.brooklyn.api.location.PortRange; -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; -import org.apache.brooklyn.core.test.entity.TestApplication; -import org.apache.brooklyn.effector.core.EffectorBody; -import org.apache.brooklyn.effector.core.EffectorTaskTest; -import org.apache.brooklyn.effector.core.Effectors; -import org.apache.brooklyn.entity.core.BrooklynConfigKeys; -import org.apache.brooklyn.entity.core.Entities; -import org.apache.brooklyn.entity.core.EntityInternal; -import org.apache.brooklyn.entity.factory.ApplicationBuilder; -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.file.ArchiveUtils; -import org.apache.brooklyn.util.core.internal.ssh.RecordingSshTool; -import org.apache.brooklyn.util.core.internal.ssh.SshException; -import org.apache.brooklyn.util.core.internal.ssh.SshTool; -import org.apache.brooklyn.util.core.task.BasicExecutionContext; -import org.apache.brooklyn.util.core.task.BasicExecutionManager; -import org.apache.brooklyn.util.guava.Maybe; -import org.apache.brooklyn.util.net.Networking; -import org.apache.brooklyn.util.net.Urls; -import org.apache.brooklyn.util.os.Os; -import org.apache.brooklyn.util.stream.Streams; -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.Charsets; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.io.Files; - -/** - * Test the {@link SshMachineLocation} implementation of the {@link Location} interface. - */ -public class SshMachineLocationTest { - - private SshMachineLocation host; - private ManagementContext mgmt; - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - mgmt = LocalManagementContextForTests.newInstance(); - host = new SshMachineLocation(MutableMap.of("address", Networking.getLocalHost())); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - if (host != null) Streams.closeQuietly(host); - if (mgmt != null) Entities.destroyAll(mgmt); - } - - @Test(groups = "Integration") - public void testGetMachineDetails() throws Exception { - BasicExecutionManager execManager = new BasicExecutionManager("mycontextid"); - BasicExecutionContext execContext = new BasicExecutionContext(execManager); - try { - MachineDetails details = execContext.submit(new Callable<MachineDetails>() { - public MachineDetails call() { - return host.getMachineDetails(); - }}).get(); - assertNotNull(details); - } finally { - execManager.shutdownNow(); - } - } - - @Test - public void testSupplyingMachineDetails() throws Exception { - MachineDetails machineDetails = new BasicMachineDetails(new BasicHardwareDetails(1, 1024), new BasicOsDetails("myname", "myarch", "myversion")); - SshMachineLocation host2 = mgmt.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .configure(SshMachineLocation.MACHINE_DETAILS, machineDetails)); - - assertSame(host2.getMachineDetails(), machineDetails); - } - - @Test - public void testConfigurePrivateAddresses() throws Exception { - SshMachineLocation host2 = mgmt.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .configure("address", Networking.getLocalHost()) - .configure(SshMachineLocation.PRIVATE_ADDRESSES, ImmutableList.of("1.2.3.4")) - .configure(BrooklynConfigKeys.SKIP_ON_BOX_BASE_DIR_RESOLUTION, true)); - - assertEquals(host2.getPrivateAddresses(), ImmutableSet.of("1.2.3.4")); - } - - // Wow, this is hard to test (until I accepted creating the entity + effector)! Code smell? - // Need to call getMachineDetails in a DynamicSequentialTask so that the "innessential" takes effect, - // to not fail its caller. But to get one of those outside of an effector is non-obvious. - @Test(groups = "Integration") - public void testGetMachineIsInessentialOnFailure() throws Exception { - SshMachineLocation host2 = mgmt.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .configure("address", Networking.getLocalHost()) - .configure(SshTool.PROP_TOOL_CLASS, FailingSshTool.class.getName())); - - final Effector<MachineDetails> GET_MACHINE_DETAILS = Effectors.effector(MachineDetails.class, "getMachineDetails") - .impl(new EffectorBody<MachineDetails>() { - public MachineDetails call(ConfigBag parameters) { - Maybe<MachineLocation> machine = Machines.findUniqueMachineLocation(entity().getLocations()); - try { - machine.get().getMachineDetails(); - throw new IllegalStateException("Expected failure in ssh"); - } catch (RuntimeException e) { - return null; - } - }}) - .build(); - - EntitySpec<TestApplication> appSpec = EntitySpec.create(TestApplication.class) - .configure(BrooklynConfigKeys.SKIP_ON_BOX_BASE_DIR_RESOLUTION, true) - .addInitializer(new EntityInitializer() { - public void apply(EntityLocal entity) { - ((EntityInternal)entity).getMutableEntityType().addEffector(EffectorTaskTest.DOUBLE_1); - }}); - - TestApplication app = ApplicationBuilder.newManagedApp(appSpec, mgmt); - - app.start(ImmutableList.of(host2)); - - MachineDetails details = app.invoke(GET_MACHINE_DETAILS, ImmutableMap.<String, Object>of()).get(); - assertNull(details); - } - public static class FailingSshTool extends RecordingSshTool { - public FailingSshTool(Map<?, ?> props) { - super(props); - } - @Override public int execScript(Map<String, ?> props, List<String> commands, Map<String, ?> env) { - throw new RuntimeException("Simulating failure of ssh: cmds="+commands); - } - @Override public int execCommands(Map<String, ?> props, List<String> commands, Map<String, ?> env) { - throw new RuntimeException("Simulating failure of ssh: cmds="+commands); - } - } - - // Note: requires `ssh localhost` to be setup such that no password is required - @Test(groups = "Integration") - public void testSshExecScript() throws Exception { - OutputStream outStream = new ByteArrayOutputStream(); - String expectedName = Os.user(); - host.execScript(MutableMap.of("out", outStream), "mysummary", ImmutableList.of("whoami; exit")); - String outString = outStream.toString(); - - assertTrue(outString.contains(expectedName), outString); - } - - // Note: requires `ssh localhost` to be setup such that no password is required - @Test(groups = "Integration") - public void testSshExecCommands() throws Exception { - OutputStream outStream = new ByteArrayOutputStream(); - String expectedName = Os.user(); - host.execCommands(MutableMap.of("out", outStream), "mysummary", ImmutableList.of("whoami; exit")); - String outString = outStream.toString(); - - assertTrue(outString.contains(expectedName), outString); - } - - // For issue #230 - @Test(groups = "Integration") - public void testOverridingPropertyOnExec() throws Exception { - SshMachineLocation host = new SshMachineLocation(MutableMap.of("address", Networking.getLocalHost(), "sshPrivateKeyData", "wrongdata")); - - OutputStream outStream = new ByteArrayOutputStream(); - String expectedName = Os.user(); - host.execCommands(MutableMap.of("sshPrivateKeyData", null, "out", outStream), "my summary", ImmutableList.of("whoami")); - String outString = outStream.toString(); - - assertTrue(outString.contains(expectedName), "outString="+outString); - } - - @Test(groups = "Integration", expectedExceptions={IllegalStateException.class, SshException.class}) - public void testSshRunWithInvalidUserFails() throws Exception { - SshMachineLocation badHost = new SshMachineLocation(MutableMap.of("user", "doesnotexist", "address", Networking.getLocalHost())); - badHost.execScript("mysummary", ImmutableList.of("whoami; exit")); - } - - // Note: requires `ssh localhost` to be setup such that no password is required - @Test(groups = "Integration") - public void testCopyFileTo() throws Exception { - File dest = Os.newTempFile(getClass(), ".dest.tmp"); - File src = Os.newTempFile(getClass(), ".src.tmp"); - try { - Files.write("abc", src, Charsets.UTF_8); - host.copyTo(src, dest); - assertEquals("abc", Files.readFirstLine(dest, Charsets.UTF_8)); - } finally { - src.delete(); - dest.delete(); - } - } - - // Note: requires `ssh localhost` to be setup such that no password is required - @Test(groups = "Integration") - public void testCopyStreamTo() throws Exception { - String contents = "abc"; - File dest = new File(Os.tmp(), "sssMachineLocationTest_dest.tmp"); - try { - host.copyTo(Streams.newInputStreamWithContents(contents), dest.getAbsolutePath()); - assertEquals("abc", Files.readFirstLine(dest, Charsets.UTF_8)); - } finally { - dest.delete(); - } - } - - @Test(groups = "Integration") - public void testInstallUrlTo() throws Exception { - File dest = new File(Os.tmp(), "sssMachineLocationTest_dir/"); - dest.mkdir(); - try { - int result = host.installTo("https://raw.github.com/brooklyncentral/brooklyn/master/README.md", Urls.mergePaths(dest.getAbsolutePath(), "README.md")); - assertEquals(result, 0); - String contents = ArchiveUtils.readFullyString(new File(dest, "README.md")); - assertTrue(contents.contains("http://brooklyncentral.github.com"), "contents missing expected phrase; contains:\n"+contents); - } finally { - dest.delete(); - } - } - - @Test(groups = "Integration") - public void testInstallClasspathCopyTo() throws Exception { - File dest = new File(Os.tmp(), "sssMachineLocationTest_dir/"); - dest.mkdir(); - try { - int result = host.installTo("classpath://brooklyn/config/sample.properties", Urls.mergePaths(dest.getAbsolutePath(), "sample.properties")); - assertEquals(result, 0); - String contents = ArchiveUtils.readFullyString(new File(dest, "sample.properties")); - assertTrue(contents.contains("Property 1"), "contents missing expected phrase; contains:\n"+contents); - } finally { - dest.delete(); - } - } - - // Note: requires `ssh localhost` to be setup such that no password is required - @Test(groups = "Integration") - public void testIsSshableWhenTrue() throws Exception { - assertTrue(host.isSshable()); - } - - // Note: on some (home/airport) networks, `ssh 123.123.123.123` hangs seemingly forever. - // Make sure we fail, waiting for longer than the 70 second TCP timeout. - // - // Times out in 2m7s on Ubuntu Vivid (syn retries set to 6) - @Test(groups = "Integration") - public void testIsSshableWhenFalse() throws Exception { - byte[] unreachableIp = new byte[] {123,123,123,123}; - final SshMachineLocation unreachableHost = new SshMachineLocation(MutableMap.of("address", InetAddress.getByAddress("unreachablename", unreachableIp))); - Asserts.assertReturnsEventually(new Runnable() { - public void run() { - assertFalse(unreachableHost.isSshable()); - }}, - Duration.minutes(3)); - } - - @Test - public void obtainSpecificPortGivesOutPortOnlyOnce() { - int port = 2345; - assertTrue(host.obtainSpecificPort(port)); - assertFalse(host.obtainSpecificPort(port)); - host.releasePort(port); - assertTrue(host.obtainSpecificPort(port)); - } - - @Test - public void obtainPortInRangeGivesBackRequiredPortOnlyIfAvailable() { - int port = 2345; - assertEquals(host.obtainPort(new PortRanges.LinearPortRange(port, port)), port); - assertEquals(host.obtainPort(new PortRanges.LinearPortRange(port, port)), -1); - host.releasePort(port); - assertEquals(host.obtainPort(new PortRanges.LinearPortRange(port, port)), port); - } - - @Test - public void obtainPortInWideRange() { - int lowerPort = 2345; - int upperPort = 2350; - PortRange range = new PortRanges.LinearPortRange(lowerPort, upperPort); - for (int i = lowerPort; i <= upperPort; i++) { - assertEquals(host.obtainPort(range), i); - } - assertEquals(host.obtainPort(range), -1); - - host.releasePort(lowerPort); - assertEquals(host.obtainPort(range), lowerPort); - assertEquals(host.obtainPort(range), -1); - } - - @Test - public void testObtainPortDoesNotUsePreReservedPorts() { - host = new SshMachineLocation(MutableMap.of("address", Networking.getLocalHost(), "usedPorts", ImmutableSet.of(8000))); - assertEquals(host.obtainPort(PortRanges.fromString("8000")), -1); - assertEquals(host.obtainPort(PortRanges.fromString("8000+")), 8001); - } -}
