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";
+   }
+}

Reply via email to