Adding initial integration/live test for SecurityGroupExtension
Project: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/commit/23f24cdd Tree: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/tree/23f24cdd Diff: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/diff/23f24cdd Branch: refs/heads/jclouds-101 Commit: 23f24cdd5857779e80e651f2fd90e2a5d59b59fb Parents: 7caa60e Author: Andrew Bayer <[email protected]> Authored: Tue Jun 11 16:46:58 2013 -0700 Committer: Andrew Bayer <[email protected]> Committed: Tue Jun 11 16:46:58 2013 -0700 ---------------------------------------------------------------------- .../extensions/SecurityGroupExtension.java | 20 +- .../extensions/StubSecurityGroupExtension.java | 20 +- .../BaseSecurityGroupExtensionLiveTest.java | 242 +++++++++++++++++++ ...ubSecurityGroupExtensionIntegrationTest.java | 60 +++++ 4 files changed, 340 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/23f24cdd/compute/src/main/java/org/jclouds/compute/extensions/SecurityGroupExtension.java ---------------------------------------------------------------------- diff --git a/compute/src/main/java/org/jclouds/compute/extensions/SecurityGroupExtension.java b/compute/src/main/java/org/jclouds/compute/extensions/SecurityGroupExtension.java index 5abfcaa..24e162f 100644 --- a/compute/src/main/java/org/jclouds/compute/extensions/SecurityGroupExtension.java +++ b/compute/src/main/java/org/jclouds/compute/extensions/SecurityGroupExtension.java @@ -16,6 +16,8 @@ */ package org.jclouds.compute.extensions; +import java.util.Set; + import org.jclouds.compute.domain.SecurityGroup; import org.jclouds.domain.Location; import org.jclouds.net.domain.IpPermission; @@ -33,6 +35,20 @@ import com.google.common.util.concurrent.ListenableFuture; public interface SecurityGroupExtension { /** + * List security groups. + * + * @return The set of @{link SecurityGroup}s we have access to. + */ + Set<SecurityGroup> listSecurityGroups(); + + /** + * List security groups in a given @{link Location}. + * + * @return The set of @{link SecurityGroup}s we have access to in the given location. + */ + Set<SecurityGroup> listSecurityGroupsInLocation(Location location); + + /** * Create a new @{link SecurityGroup} from the parameters given. * * @param name @@ -49,8 +65,10 @@ public interface SecurityGroupExtension { * * @param id * The id of the SecurityGroup to delete. + * + * @return true if we were able to remove the group, false otherwise. */ - void removeSecurityGroup(String id); + boolean removeSecurityGroup(String id); /** * Add a @{link IpPermission} to an existing @{link SecurityGroup}. Applies the permission to the http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/23f24cdd/compute/src/main/java/org/jclouds/compute/stub/extensions/StubSecurityGroupExtension.java ---------------------------------------------------------------------- diff --git a/compute/src/main/java/org/jclouds/compute/stub/extensions/StubSecurityGroupExtension.java b/compute/src/main/java/org/jclouds/compute/stub/extensions/StubSecurityGroupExtension.java index 797dbd5..f61cb84 100644 --- a/compute/src/main/java/org/jclouds/compute/stub/extensions/StubSecurityGroupExtension.java +++ b/compute/src/main/java/org/jclouds/compute/stub/extensions/StubSecurityGroupExtension.java @@ -37,6 +37,7 @@ import org.jclouds.location.suppliers.all.JustProvider; import org.jclouds.net.domain.IpPermission; import org.jclouds.net.domain.IpProtocol; +import com.google.common.base.Predicate; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; @@ -71,6 +72,21 @@ public class StubSecurityGroupExtension implements SecurityGroupExtension { this.idProvider = idProvider; this.locationSupplier = locationSupplier; } + + @Override + public Set<SecurityGroup> listSecurityGroups() { + return ImmutableSet.copyOf(groups.values()); + } + + @Override + public Set<SecurityGroup> listSecurityGroupsInLocation(final Location location) { + return ImmutableSet.copyOf(filter(groups.values(), new Predicate<SecurityGroup>() { + @Override + public boolean apply(SecurityGroup group) { + return group.getLocation().equals(location); + } + })); + } @Override public SecurityGroup createSecurityGroup(String name, Location location) { @@ -89,10 +105,12 @@ public class StubSecurityGroupExtension implements SecurityGroupExtension { } @Override - public void removeSecurityGroup(String id) { + public boolean removeSecurityGroup(String id) { if (groups.containsKey(id)) { groups.remove(id); + return true; } + return false; } @Override http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/23f24cdd/compute/src/test/java/org/jclouds/compute/extensions/internal/BaseSecurityGroupExtensionLiveTest.java ---------------------------------------------------------------------- diff --git a/compute/src/test/java/org/jclouds/compute/extensions/internal/BaseSecurityGroupExtensionLiveTest.java b/compute/src/test/java/org/jclouds/compute/extensions/internal/BaseSecurityGroupExtensionLiveTest.java new file mode 100644 index 0000000..ebb2a1a --- /dev/null +++ b/compute/src/test/java/org/jclouds/compute/extensions/internal/BaseSecurityGroupExtensionLiveTest.java @@ -0,0 +1,242 @@ +/* + * 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.jclouds.compute.extensions.internal; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static com.google.common.base.Predicates.equalTo; +import static com.google.common.base.Predicates.not; +import static com.google.common.collect.Iterables.filter; +import static org.jclouds.util.Predicates2.retry; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import java.util.Set; +import java.util.concurrent.ExecutionException; + +import javax.annotation.Resource; +import javax.inject.Named; + +import org.jclouds.compute.ComputeService; +import org.jclouds.compute.RunNodesException; +import org.jclouds.compute.domain.SecurityGroup; +import org.jclouds.compute.domain.SecurityGroupBuilder; +import org.jclouds.compute.domain.Template; +import org.jclouds.compute.extensions.SecurityGroupExtension; +import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.domain.Location; +import org.jclouds.logging.Logger; +import org.jclouds.net.domain.IpPermission; +import org.jclouds.net.domain.IpProtocol; +import org.jclouds.ssh.SshClient; +import org.testng.annotations.Test; + +import com.google.common.base.Optional; +import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; + + +/** + * Base test for {@link SecurityGroupExtension} implementations. + * + * @author David Alves + * + */ +public abstract class BaseSecurityGroupExtensionLiveTest extends BaseComputeServiceContextLiveTest { + + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + protected String groupId; + + /** + * Returns the template for the base node, override to test different templates. + * + * @return + */ + public Template getNodeTemplate() { + return view.getComputeService().templateBuilder().build(); + } + + @Test(groups = { "integration", "live" }, singleThreaded = true) + public void testCreateSecurityGroup() throws RunNodesException, InterruptedException, ExecutionException { + + ComputeService computeService = view.getComputeService(); + + Location location = getNodeTemplate().getLocation(); + + Optional<SecurityGroupExtension> securityGroupExtension = computeService.getSecurityGroupExtension(); + + assertTrue(securityGroupExtension.isPresent(), "security extension was not present"); + + SecurityGroup group = securityGroupExtension.get().createSecurityGroup("test-create-security-group", location); + + logger.info("Group created: %s", group); + + assertEquals("test-create-security-group", group.getName()); + + groupId = group.getId(); + } + + @Test(groups = { "integration", "live" }, singleThreaded = true, dependsOnMethods = "testCreateSecurityGroup") + public void testAddIpPermission() { + + ComputeService computeService = view.getComputeService(); + + Optional<SecurityGroupExtension> securityGroupExtension = computeService.getSecurityGroupExtension(); + assertTrue(securityGroupExtension.isPresent(), "security group extension was not present"); + + Optional<SecurityGroup> optGroup = getGroup(securityGroupExtension.get()); + + assertTrue(optGroup.isPresent()); + + SecurityGroup group = optGroup.get(); + + IpPermission.Builder builder = IpPermission.builder(); + + builder.ipProtocol(IpProtocol.TCP); + builder.fromPort(10); + builder.toPort(20); + builder.cidrBlock("0.0.0.0/0"); + + IpPermission perm = builder.build(); + + SecurityGroup newGroup = securityGroupExtension.get().addIpPermission(perm, group); + + assertEquals(perm, Iterables.getOnlyElement(newGroup.getIpPermissions())); + } + + @Test(groups = { "integration", "live" }, singleThreaded = true, dependsOnMethods = "testAddIpPermission") + public void testRemoveIpPermission() { + + ComputeService computeService = view.getComputeService(); + + Optional<SecurityGroupExtension> securityGroupExtension = computeService.getSecurityGroupExtension(); + assertTrue(securityGroupExtension.isPresent(), "security group extension was not present"); + + Optional<SecurityGroup> optGroup = getGroup(securityGroupExtension.get()); + + assertTrue(optGroup.isPresent()); + + SecurityGroup group = optGroup.get(); + + IpPermission.Builder builder = IpPermission.builder(); + + builder.ipProtocol(IpProtocol.TCP); + builder.fromPort(10); + builder.toPort(20); + builder.cidrBlock("0.0.0.0/0"); + + IpPermission perm = builder.build(); + + SecurityGroup newGroup = securityGroupExtension.get().removeIpPermission(perm, group); + + assertEquals(0, Iterables.size(newGroup.getIpPermissions())); + } + + @Test(groups = { "integration", "live" }, singleThreaded = true, dependsOnMethods = "testRemoveIpPermission") + public void testAddIpPermissionsFromSpec() { + + ComputeService computeService = view.getComputeService(); + + Optional<SecurityGroupExtension> securityGroupExtension = computeService.getSecurityGroupExtension(); + assertTrue(securityGroupExtension.isPresent(), "security group extension was not present"); + + Optional<SecurityGroup> optGroup = getGroup(securityGroupExtension.get()); + + assertTrue(optGroup.isPresent()); + + SecurityGroup group = optGroup.get(); + + IpPermission.Builder builder = IpPermission.builder(); + + builder.ipProtocol(IpProtocol.TCP); + builder.fromPort(10); + builder.toPort(20); + builder.cidrBlock("0.0.0.0/0"); + + IpPermission perm = builder.build(); + + IpPermission.Builder secondBuilder = IpPermission.builder(); + + secondBuilder.ipProtocol(IpProtocol.TCP); + secondBuilder.fromPort(50); + secondBuilder.toPort(100); + secondBuilder.groupId("abc-123"); + + IpPermission secondPerm = secondBuilder.build(); + + SecurityGroup newGroup = securityGroupExtension.get().addIpPermission(IpProtocol.TCP, + 10, + 20, + emptyMultimap(), + ImmutableSet.of("0.0.0.0/0"), + emptyStringSet(), + group); + + assertTrue(newGroup.getIpPermissions().contains(perm)); + + SecurityGroup secondNewGroup = securityGroupExtension.get().addIpPermission(IpProtocol.TCP, + 50, + 100, + emptyMultimap(), + emptyStringSet(), + ImmutableSet.of("abc-123"), + newGroup); + + assertTrue(secondNewGroup.getIpPermissions().contains(secondPerm)); + } + + @Test(groups = { "integration", "live" }, singleThreaded = true, dependsOnMethods = "testAddIpPermissionsFromSpec") + public void testDeleteSecurityGroup() { + + ComputeService computeService = view.getComputeService(); + + Optional<SecurityGroupExtension> securityGroupExtension = computeService.getSecurityGroupExtension(); + assertTrue(securityGroupExtension.isPresent(), "security group extension was not present"); + + Optional<SecurityGroup> optGroup = getGroup(securityGroupExtension.get()); + + assertTrue(optGroup.isPresent()); + + SecurityGroup group = optGroup.get(); + + assertTrue(securityGroupExtension.get().removeSecurityGroup(group.getId())); + } + + private Multimap<String, String> emptyMultimap() { + return LinkedHashMultimap.create(); + } + + private Set<String> emptyStringSet() { + return Sets.newLinkedHashSet(); + } + + private Optional<SecurityGroup> getGroup(SecurityGroupExtension ext) { + return Iterables.tryFind(ext.listSecurityGroups(), new Predicate<SecurityGroup>() { + @Override + public boolean apply(SecurityGroup input) { + return input.getId().equals(groupId); + } + }); + } +} http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/23f24cdd/compute/src/test/java/org/jclouds/compute/stub/extensions/StubSecurityGroupExtensionIntegrationTest.java ---------------------------------------------------------------------- diff --git a/compute/src/test/java/org/jclouds/compute/stub/extensions/StubSecurityGroupExtensionIntegrationTest.java b/compute/src/test/java/org/jclouds/compute/stub/extensions/StubSecurityGroupExtensionIntegrationTest.java new file mode 100644 index 0000000..2266886 --- /dev/null +++ b/compute/src/test/java/org/jclouds/compute/stub/extensions/StubSecurityGroupExtensionIntegrationTest.java @@ -0,0 +1,60 @@ +/* + * 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.jclouds.compute.extensions.internal; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.jclouds.util.Predicates2.retry; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import java.util.concurrent.ExecutionException; + +import javax.annotation.Resource; +import javax.inject.Named; + +import org.jclouds.compute.ComputeService; +import org.jclouds.compute.RunNodesException; +import org.jclouds.compute.domain.SecurityGroup; +import org.jclouds.compute.domain.SecurityGroupBuilder; +import org.jclouds.compute.domain.Template; +import org.jclouds.compute.extensions.SecurityGroupExtension; +import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.domain.Location; +import org.jclouds.logging.Logger; +import org.jclouds.net.domain.IpPermission; +import org.jclouds.ssh.SshClient; +import org.testng.annotations.Test; + +import com.google.common.base.Optional; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; + + +/** + * Base test for {@link SecurityGroupExtension} implementations. + * + * @author David Alves + * + */ +@Test(groups = { "integration", "live" }, testName="StubSecurityGroupExtensionIntegrationTest") +public class StubSecurityGroupExtensionIntegrationTest extends BaseSecurityGroupExtensionLiveTest { + + public StubSecurityGroupExtensionIntegrationTest() { + provider = "stub"; + } +}
