Updated Branches:
  refs/heads/master e017b8904 -> 46b8fd0ee

Fix OpenStack Nova SecurityGroupExtension based on live tests

So there were a few problems, but the core ugly one is that what you
pass in for creating a rule allowing groups' access is not the same
thing you get back from a group with such a rule, which makes mapping
between the arguments and the output insanely painful. So now, well,
we do some insanely painful stuff.


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

Branch: refs/heads/master
Commit: 46b8fd0eee67031a930c8f25737d54c01b6683c7
Parents: e017b89
Author: Andrew Bayer <[email protected]>
Authored: Thu Oct 3 17:51:54 2013 -0700
Committer: Andrew Bayer <[email protected]>
Committed: Mon Oct 7 17:50:53 2013 -0700

----------------------------------------------------------------------
 .../extensions/NovaSecurityGroupExtension.java  | 98 +++++---------------
 .../NovaSecurityGroupInZoneToSecurityGroup.java |  2 +
 .../SecurityGroupRuleToIpPermission.java        | 50 +++++++++-
 .../NovaSecurityGroupExtensionExpectTest.java   | 48 ++++++----
 ...aSecurityGroupInZoneToSecurityGroupTest.java | 13 +--
 .../NovaSecurityGroupToSecurityGroupTest.java   | 42 ++++++++-
 .../SecurityGroupRuleToIpPermissionTest.java    | 13 +--
 .../securitygroup_details_extension.json        |  4 +-
 .../resources/securitygroup_list_extension.json |  8 +-
 .../BaseSecurityGroupExtensionLiveTest.java     |  5 +-
 ...udComputeSecurityGroupExtensionLiveTest.java | 41 ++++++++
 11 files changed, 199 insertions(+), 125 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/46b8fd0e/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/extensions/NovaSecurityGroupExtension.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/extensions/NovaSecurityGroupExtension.java
 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/extensions/NovaSecurityGroupExtension.java
index 71d3032..8b36fc9 100644
--- 
a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/extensions/NovaSecurityGroupExtension.java
+++ 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/extensions/NovaSecurityGroupExtension.java
@@ -59,7 +59,6 @@ import com.google.common.base.Optional;
 import com.google.common.base.Supplier;
 import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Multimap;
 import com.google.common.util.concurrent.ListeningExecutorService;
 
@@ -204,8 +203,8 @@ public class NovaSecurityGroupExtension implements 
SecurityGroupExtension {
    @Override
    public SecurityGroup addIpPermission(IpPermission ipPermission, 
SecurityGroup group) {
       String zone = group.getLocation().getId();
-      String id = group.getId();
-
+      ZoneAndId groupZoneAndId = ZoneAndId.fromSlashEncoded(group.getId());
+      String id = groupZoneAndId.getId();
       Optional<? extends SecurityGroupApi> sgApi = 
api.getSecurityGroupExtensionForZone(zone);
 
       if (!sgApi.isPresent()) {
@@ -246,48 +245,22 @@ public class NovaSecurityGroupExtension implements 
SecurityGroupExtension {
                                         Multimap<String, String> 
tenantIdGroupNamePairs,
                                         Iterable<String> ipRanges,
                                         Iterable<String> groupIds, 
SecurityGroup group) {
-      String zone = group.getLocation().getId();
-      String id = group.getId();
-
-      Optional<? extends SecurityGroupApi> sgApi = 
api.getSecurityGroupExtensionForZone(zone);
-
-      if (!sgApi.isPresent()) {
-         return null;
-      }
-
-      if (Iterables.size(ipRanges) > 0) {
-         for (String cidr : ipRanges) {
-            sgApi.get().createRuleAllowingCidrBlock(id,
-                    Ingress.builder()
-                            .ipProtocol(protocol)
-                            .fromPort(startPort)
-                            .toPort(endPort)
-                            .build(),
-                    cidr);
-         }
-      }
-
-      if (Iterables.size(groupIds) > 0) {
-         for (String zoneAndGroupRaw : groupIds) {
-            ZoneAndId zoneAndId = ZoneAndId.fromSlashEncoded(zoneAndGroupRaw);
-            String groupId = zoneAndId.getId();
-            sgApi.get().createRuleAllowingSecurityGroupId(id,
-                    Ingress.builder()
-                            .ipProtocol(protocol)
-                            .fromPort(startPort)
-                            .toPort(endPort)
-                            .build(),
-                    groupId);
-         }
-      }
-
-      return getSecurityGroupById(ZoneAndId.fromZoneAndId(zone, 
id).slashEncode());
+      IpPermission.Builder permBuilder = IpPermission.builder();
+      permBuilder.ipProtocol(protocol);
+      permBuilder.fromPort(startPort);
+      permBuilder.toPort(endPort);
+      permBuilder.tenantIdGroupNamePairs(tenantIdGroupNamePairs);
+      permBuilder.cidrBlocks(ipRanges);
+      permBuilder.groupIds(groupIds);
+
+      return addIpPermission(permBuilder.build(), group);
    }
 
    @Override
    public SecurityGroup removeIpPermission(IpPermission ipPermission, 
SecurityGroup group) {
       String zone = group.getLocation().getId();
-      String id = group.getId();
+      ZoneAndId groupZoneAndId = ZoneAndId.fromSlashEncoded(group.getId());
+      String id = groupZoneAndId.getId();
 
       Optional<? extends SecurityGroupApi> sgApi = 
api.getSecurityGroupExtensionForZone(zone);
 
@@ -328,42 +301,15 @@ public class NovaSecurityGroupExtension implements 
SecurityGroupExtension {
                                            Multimap<String, String> 
tenantIdGroupNamePairs,
                                            Iterable<String> ipRanges,
                                            Iterable<String> groupIds, 
SecurityGroup group) {
-      String zone = group.getLocation().getId();
-      String id = group.getId();
-
-      Optional<? extends SecurityGroupApi> sgApi = 
api.getSecurityGroupExtensionForZone(zone);
-
-      if (!sgApi.isPresent()) {
-         return null;
-      }
-
-      org.jclouds.openstack.nova.v2_0.domain.SecurityGroup securityGroup = 
sgApi.get().get(id);
-
-      if (Iterables.size(ipRanges) > 0) {
-         for (String cidr : ipRanges) {
-            for (SecurityGroupRule rule : filter(securityGroup.getRules(),
-                    and(ruleCidr(cidr),
-                            ruleProtocol(protocol),
-                            ruleStartPort(startPort),
-                            ruleEndPort(endPort)))) {
-               sgApi.get().deleteRule(rule.getId());
-            }
-         }
-      }
-
-      if (Iterables.size(groupIds) > 0) {
-         for (String groupId : groupIds) {
-            for (SecurityGroupRule rule : filter(securityGroup.getRules(),
-                    and(ruleGroup(groupId),
-                            ruleProtocol(protocol),
-                            ruleStartPort(startPort),
-                            ruleEndPort(endPort)))) {
-               sgApi.get().deleteRule(rule.getId());
-            }
-         }
-      }
-
-      return getSecurityGroupById(ZoneAndId.fromZoneAndId(zone, 
id).slashEncode());
+      IpPermission.Builder permBuilder = IpPermission.builder();
+      permBuilder.ipProtocol(protocol);
+      permBuilder.fromPort(startPort);
+      permBuilder.toPort(endPort);
+      permBuilder.tenantIdGroupNamePairs(tenantIdGroupNamePairs);
+      permBuilder.cidrBlocks(ipRanges);
+      permBuilder.groupIds(groupIds);
+
+      return removeIpPermission(permBuilder.build(), group);
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/46b8fd0e/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupInZoneToSecurityGroup.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupInZoneToSecurityGroup.java
 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupInZoneToSecurityGroup.java
index 124cd65..fc772df 100644
--- 
a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupInZoneToSecurityGroup.java
+++ 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupInZoneToSecurityGroup.java
@@ -68,6 +68,8 @@ public class NovaSecurityGroupInZoneToSecurityGroup 
implements Function<Security
 
       builder.location(zone);
 
+      builder.id(group.getZone() + "/" + group.getSecurityGroup().getId());
+
       return builder.build();
    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/46b8fd0e/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/SecurityGroupRuleToIpPermission.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/SecurityGroupRuleToIpPermission.java
 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/SecurityGroupRuleToIpPermission.java
index b5ea3e6..a98a62b 100644
--- 
a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/SecurityGroupRuleToIpPermission.java
+++ 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/SecurityGroupRuleToIpPermission.java
@@ -16,15 +16,30 @@
  */
 package org.jclouds.openstack.nova.v2_0.compute.functions;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.getFirst;
+
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+
 import javax.annotation.Resource;
+import javax.inject.Inject;
 import javax.inject.Named;
 
 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.openstack.nova.v2_0.domain.SecurityGroupRule;
+import org.jclouds.openstack.nova.v2_0.domain.zonescoped.SecurityGroupInZone;
+import org.jclouds.openstack.nova.v2_0.domain.zonescoped.ZoneAndName;
 
 import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.cache.LoadingCache;
+import com.google.common.util.concurrent.Atomics;
 
 
 /**
@@ -37,8 +52,18 @@ public class SecurityGroupRuleToIpPermission implements 
Function<SecurityGroupRu
    @Resource
    @Named(ComputeServiceConstants.COMPUTE_LOGGER)
    protected Logger logger = Logger.NULL;
-   
-   public SecurityGroupRuleToIpPermission() {
+   protected final Predicate<AtomicReference<ZoneAndName>> 
returnSecurityGroupExistsInZone;
+   protected final Supplier<Map<String, Location>> locationIndex;
+   LoadingCache<ZoneAndName, SecurityGroupInZone> groupMap;
+
+   @Inject
+   public SecurityGroupRuleToIpPermission(@Named("SECURITYGROUP_PRESENT") 
Predicate<AtomicReference<ZoneAndName>> returnSecurityGroupExistsInZone,
+                                          Supplier<Map<String, Location>> 
locationIndex,
+                                          LoadingCache<ZoneAndName, 
SecurityGroupInZone> groupMap) {
+      this.returnSecurityGroupExistsInZone = 
checkNotNull(returnSecurityGroupExistsInZone,
+              "returnSecurityGroupExistsInZone");
+      this.locationIndex = checkNotNull(locationIndex, "locationIndex");
+      this.groupMap = checkNotNull(groupMap, "groupMap");
    }
 
    @Override
@@ -47,11 +72,28 @@ public class SecurityGroupRuleToIpPermission implements 
Function<SecurityGroupRu
       builder.ipProtocol(rule.getIpProtocol());
       builder.fromPort(rule.getFromPort());
       builder.toPort(rule.getToPort());
-      if (rule.getGroup() != null) 
-         builder.tenantIdGroupNamePair(rule.getGroup().getTenantId(), 
rule.getGroup().getName());
+      if (rule.getGroup() != null) {
+         String zone = getFirst(filter(locationIndex.get().keySet(), 
isSecurityGroupInZone(rule.getGroup().getName())),
+                 null);
+         if (zone != null) {
+            SecurityGroupInZone group = 
groupMap.getUnchecked(ZoneAndName.fromZoneAndName(zone, 
rule.getGroup().getName()));
+            builder.groupId(zone + "/" + group.getSecurityGroup().getId());
+         }
+      }
       if (rule.getIpRange() != null)
          builder.cidrBlock(rule.getIpRange());
       
       return builder.build();
    }
+
+   protected Predicate<String> isSecurityGroupInZone(final String groupName) {
+      return new Predicate<String>() {
+
+         @Override
+         public boolean apply(String zone) {
+            AtomicReference<ZoneAndName> securityGroupInZoneRef = 
Atomics.newReference(ZoneAndName.fromZoneAndName(zone, groupName));
+            return 
returnSecurityGroupExistsInZone.apply(securityGroupInZoneRef);
+         }
+      };
+   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/46b8fd0e/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/extensions/NovaSecurityGroupExtensionExpectTest.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/extensions/NovaSecurityGroupExtensionExpectTest.java
 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/extensions/NovaSecurityGroupExtensionExpectTest.java
index b80351e..809b4da 100644
--- 
a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/extensions/NovaSecurityGroupExtensionExpectTest.java
+++ 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/extensions/NovaSecurityGroupExtensionExpectTest.java
@@ -52,6 +52,13 @@ import com.google.common.collect.Sets;
 public class NovaSecurityGroupExtensionExpectTest extends 
BaseNovaComputeServiceExpectTest {
 
    protected String zone = "az-1.region-a.geo-1";
+   protected HttpRequest list = HttpRequest.builder().method("GET").endpoint(
+           
URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups";)).headers(
+           ImmutableMultimap.<String, String> builder().put("Accept", 
"application/json").put("X-Auth-Token",
+                   authToken).build()).build();
+
+   protected HttpResponse listResponse = 
HttpResponse.builder().statusCode(200).payload(
+           payloadFromResource("/securitygroup_list_extension.json")).build();
 
    @Override
    protected Properties setupProperties() {
@@ -61,13 +68,6 @@ public class NovaSecurityGroupExtensionExpectTest extends 
BaseNovaComputeService
    }
 
    public void testListSecurityGroups() {
-      HttpRequest list = HttpRequest.builder().method("GET").endpoint(
-              
URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups";)).headers(
-              ImmutableMultimap.<String, String> builder().put("Accept", 
"application/json").put("X-Auth-Token",
-                      authToken).build()).build();
-
-      HttpResponse listResponse = 
HttpResponse.builder().statusCode(200).payload(
-              payloadFromResource("/securitygroup_list.json")).build();
 
 
       Builder<HttpRequest, HttpResponse> requestResponseMap = 
ImmutableMap.<HttpRequest, HttpResponse> builder();
@@ -149,15 +149,24 @@ public class NovaSecurityGroupExtensionExpectTest extends 
BaseNovaComputeService
       Builder<HttpRequest, HttpResponse> requestResponseMap = 
ImmutableMap.<HttpRequest, HttpResponse> builder();
       requestResponseMap.put(keystoneAuthWithUsernameAndPasswordAndTenantName, 
responseWithKeystoneAccess);
       requestResponseMap.put(extensionsOfNovaRequest, 
extensionsOfNovaResponse);
-      requestResponseMap.put(getSecurityGroup, 
getSecurityGroupResponse).build();
+      requestResponseMap.put(getSecurityGroup, getSecurityGroupResponse);
+      requestResponseMap.put(list, listResponse).build();
 
       SecurityGroupExtension extension = 
requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get();
 
       SecurityGroup group = extension.getSecurityGroupById(zone + "/160");
-      assertEquals(group.getId(), "160");
+      assertEquals(group.getId(), zone + "/160");
    }
 
    public void testCreateSecurityGroup() {
+      HttpRequest getSecurityGroup = 
HttpRequest.builder().method("GET").endpoint(
+              
URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups/160";)).headers(
+              ImmutableMultimap.<String, String> builder().put("Accept", 
"application/json").put("X-Auth-Token",
+                      authToken).build()).build();
+
+      HttpResponse getSecurityGroupResponse = 
HttpResponse.builder().statusCode(200).payload(
+              
payloadFromResource("/securitygroup_details_extension.json")).build();
+
       HttpRequest create = HttpRequest.builder().method("POST").endpoint(
               
URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-security-groups";)).headers(
               ImmutableMultimap.<String, String> builder().put("Accept", 
"application/json").put("X-Auth-Token",
@@ -182,7 +191,8 @@ public class NovaSecurityGroupExtensionExpectTest extends 
BaseNovaComputeService
       requestResponseMap.put(keystoneAuthWithUsernameAndPasswordAndTenantName, 
responseWithKeystoneAccess);
       requestResponseMap.put(extensionsOfNovaRequest, 
extensionsOfNovaResponse);
       requestResponseMap.put(create, createResponse);
-      requestResponseMap.put(list, listResponse).build();
+      requestResponseMap.put(list, listResponse);
+      requestResponseMap.put(getSecurityGroup, 
getSecurityGroupResponse).build();
 
       SecurityGroupExtension extension = 
requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get();
 
@@ -191,7 +201,7 @@ public class NovaSecurityGroupExtensionExpectTest extends 
BaseNovaComputeService
               .id(zone)
               .description("zone")
               .build());
-      assertEquals(group.getId(), "160");
+      assertEquals(group.getId(), zone + "/160");
    }
 
    public void testRemoveSecurityGroup() {
@@ -250,9 +260,9 @@ public class NovaSecurityGroupExtensionExpectTest extends 
BaseNovaComputeService
 
 
       SecurityGroupExtension extension = 
orderedRequestsSendResponses(ImmutableList.of(keystoneAuthWithUsernameAndPasswordAndTenantName,
-              extensionsOfNovaRequest, getSecurityGroup, createRule, 
getSecurityGroup),
+              extensionsOfNovaRequest, getSecurityGroup, createRule, 
getSecurityGroup, list, list),
               ImmutableList.of(responseWithKeystoneAccess, 
extensionsOfNovaResponse, getSecurityGroupNoRulesResponse,
-                      createRuleResponse, 
getSecurityGroupResponse)).getSecurityGroupExtension().get();
+                      createRuleResponse, getSecurityGroupResponse, 
listResponse, listResponse)).getSecurityGroupExtension().get();
 
       IpPermission.Builder builder = IpPermission.builder();
 
@@ -299,9 +309,9 @@ public class NovaSecurityGroupExtensionExpectTest extends 
BaseNovaComputeService
 
 
       SecurityGroupExtension extension = 
orderedRequestsSendResponses(ImmutableList.of(keystoneAuthWithUsernameAndPasswordAndTenantName,
-              extensionsOfNovaRequest, getSecurityGroup, createRule, 
getSecurityGroup),
+              extensionsOfNovaRequest, getSecurityGroup, createRule, 
getSecurityGroup, list, list),
               ImmutableList.of(responseWithKeystoneAccess, 
extensionsOfNovaResponse, getSecurityGroupNoRulesResponse,
-                      createRuleResponse, 
getSecurityGroupResponse)).getSecurityGroupExtension().get();
+                      createRuleResponse, getSecurityGroupResponse, 
listResponse, listResponse)).getSecurityGroupExtension().get();
 
       SecurityGroup origGroup = extension.getSecurityGroupById(zone + "/160");
 
@@ -345,9 +355,9 @@ public class NovaSecurityGroupExtensionExpectTest extends 
BaseNovaComputeService
 
 
       SecurityGroupExtension extension = 
orderedRequestsSendResponses(ImmutableList.of(keystoneAuthWithUsernameAndPasswordAndTenantName,
-              extensionsOfNovaRequest, getSecurityGroup, createRule, 
getSecurityGroup),
+              extensionsOfNovaRequest, getSecurityGroup, createRule, 
getSecurityGroup, list, list),
               ImmutableList.of(responseWithKeystoneAccess, 
extensionsOfNovaResponse, getSecurityGroupNoRulesResponse,
-                      createRuleResponse, 
getSecurityGroupResponse)).getSecurityGroupExtension().get();
+                      createRuleResponse, getSecurityGroupResponse, 
listResponse, listResponse)).getSecurityGroupExtension().get();
 
       IpPermission.Builder builder = IpPermission.builder();
 
@@ -394,9 +404,9 @@ public class NovaSecurityGroupExtensionExpectTest extends 
BaseNovaComputeService
 
 
       SecurityGroupExtension extension = 
orderedRequestsSendResponses(ImmutableList.of(keystoneAuthWithUsernameAndPasswordAndTenantName,
-              extensionsOfNovaRequest, getSecurityGroup, createRule, 
getSecurityGroup),
+              extensionsOfNovaRequest, getSecurityGroup, createRule, 
getSecurityGroup, list, list),
               ImmutableList.of(responseWithKeystoneAccess, 
extensionsOfNovaResponse, getSecurityGroupNoRulesResponse,
-                      createRuleResponse, 
getSecurityGroupResponse)).getSecurityGroupExtension().get();
+                      createRuleResponse, getSecurityGroupResponse, 
listResponse, listResponse)).getSecurityGroupExtension().get();
 
       SecurityGroup origGroup = extension.getSecurityGroupById(zone + "/160");
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/46b8fd0e/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupInZoneToSecurityGroupTest.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupInZoneToSecurityGroupTest.java
 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupInZoneToSecurityGroupTest.java
index 7c588ad..c884987 100644
--- 
a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupInZoneToSecurityGroupTest.java
+++ 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupInZoneToSecurityGroupTest.java
@@ -41,7 +41,6 @@ import com.google.common.collect.ImmutableSet;
 @Test(groups = "unit", testName = "NovaSecurityGroupInZoneToSecurityGroupTest")
 public class NovaSecurityGroupInZoneToSecurityGroupTest {
 
-   private static final SecurityGroupRuleToIpPermission ruleConverter = new 
SecurityGroupRuleToIpPermission();
    Location provider = new 
LocationBuilder().scope(LocationScope.PROVIDER).id("openstack-nova")
            .description("openstack-nova").build();
    Location zone = new 
LocationBuilder().id("az-1.region-a.geo-1").description("az-1.region-a.geo-1")
@@ -58,11 +57,12 @@ public class NovaSecurityGroupInZoneToSecurityGroupTest {
 
       SecurityGroup newGroup = parser.apply(origGroup);
 
-      assertEquals(newGroup.getId(), origGroup.getSecurityGroup().getId());
+      assertEquals(newGroup.getId(), origGroup.getZone() + "/" + 
origGroup.getSecurityGroup().getId());
       assertEquals(newGroup.getProviderId(), 
origGroup.getSecurityGroup().getId());
       assertEquals(newGroup.getName(), origGroup.getSecurityGroup().getName());
       assertEquals(newGroup.getOwnerId(), 
origGroup.getSecurityGroup().getTenantId());
-      assertEquals(newGroup.getIpPermissions(), 
ImmutableSet.copyOf(transform(origGroup.getSecurityGroup().getRules(), 
ruleConverter)));
+      assertEquals(newGroup.getIpPermissions(), 
ImmutableSet.copyOf(transform(origGroup.getSecurityGroup().getRules(),
+              NovaSecurityGroupToSecurityGroupTest.ruleConverter)));
       assertEquals(newGroup.getLocation().getId(), origGroup.getZone());
    }
 
@@ -75,16 +75,17 @@ public class NovaSecurityGroupInZoneToSecurityGroupTest {
 
       SecurityGroup newGroup = parser.apply(origGroup);
 
-      assertEquals(newGroup.getId(), origGroup.getSecurityGroup().getId());
+      assertEquals(newGroup.getId(), origGroup.getZone() + "/" + 
origGroup.getSecurityGroup().getId());
       assertEquals(newGroup.getProviderId(), 
origGroup.getSecurityGroup().getId());
       assertEquals(newGroup.getName(), origGroup.getSecurityGroup().getName());
       assertEquals(newGroup.getOwnerId(), 
origGroup.getSecurityGroup().getTenantId());
-      assertEquals(newGroup.getIpPermissions(), 
ImmutableSet.copyOf(transform(origGroup.getSecurityGroup().getRules(), 
ruleConverter)));
+      assertEquals(newGroup.getIpPermissions(), 
ImmutableSet.copyOf(transform(origGroup.getSecurityGroup().getRules(),
+              NovaSecurityGroupToSecurityGroupTest.ruleConverter)));
       assertEquals(newGroup.getLocation().getId(), origGroup.getZone());
    }
 
    private NovaSecurityGroupInZoneToSecurityGroup createGroupParser() {
-      NovaSecurityGroupToSecurityGroup baseParser = new 
NovaSecurityGroupToSecurityGroup(ruleConverter);
+      NovaSecurityGroupToSecurityGroup baseParser = new 
NovaSecurityGroupToSecurityGroup(NovaSecurityGroupToSecurityGroupTest.ruleConverter);
 
       NovaSecurityGroupInZoneToSecurityGroup parser = new 
NovaSecurityGroupInZoneToSecurityGroup(baseParser, locationIndex);
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/46b8fd0e/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupToSecurityGroupTest.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupToSecurityGroupTest.java
 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupToSecurityGroupTest.java
index 16d01d3..6754087 100644
--- 
a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupToSecurityGroupTest.java
+++ 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/NovaSecurityGroupToSecurityGroupTest.java
@@ -19,12 +19,29 @@ package org.jclouds.openstack.nova.v2_0.compute.functions;
 import static com.google.common.collect.Iterables.transform;
 import static org.testng.Assert.assertEquals;
 
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.jclouds.compute.domain.SecurityGroup;
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
 import org.jclouds.net.domain.IpProtocol;
 import org.jclouds.openstack.nova.v2_0.domain.SecurityGroupRule;
 import org.jclouds.openstack.nova.v2_0.domain.TenantIdAndName;
+import org.jclouds.openstack.nova.v2_0.domain.zonescoped.SecurityGroupInZone;
+import org.jclouds.openstack.nova.v2_0.domain.zonescoped.ZoneAndName;
 import org.testng.annotations.Test;
 
+import com.google.common.base.Functions;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 
 /**
@@ -33,10 +50,29 @@ import com.google.common.collect.ImmutableSet;
 @Test(groups = "unit", testName = "NovaSecurityGroupToSecurityGroupTest")
 public class NovaSecurityGroupToSecurityGroupTest {
 
-   private static final SecurityGroupRuleToIpPermission ruleConverter = new 
SecurityGroupRuleToIpPermission();
+   private static final Location provider = new 
LocationBuilder().scope(LocationScope.PROVIDER).id("openstack-nova")
+           .description("openstack-nova").build();
+   private static final Location zone = new 
LocationBuilder().id("az-1.region-a.geo-1").description("az-1.region-a.geo-1")
+           .scope(LocationScope.ZONE).parent(provider).build();
+   private static final Supplier<Map<String, Location>> locationIndex = 
Suppliers.<Map<String, Location>> ofInstance(ImmutableMap
+           .<String, Location>of("az-1.region-a.geo-1", zone));
+
+
+   private static final Predicate<AtomicReference<ZoneAndName>> 
returnSecurityGroupExistsInZone = Predicates.alwaysTrue();
+
+   private static final Map<ZoneAndName, SecurityGroupInZone> groupMap = 
ImmutableMap.of(
+           ZoneAndName.fromZoneAndName("az-1.region-a.geo-1", "some-group"), 
new SecurityGroupInZone(securityGroupWithGroup(), "az-1.region-a.geo-1"),
+           ZoneAndName.fromZoneAndName("az-1.region-a.geo-1", 
"some-other-group"), new SecurityGroupInZone(securityGroupWithCidr(), 
"az-1.region-a.geo-1"));
+
+   // weird compilation error means have to declare extra generics for call to 
build() - see https://bugs.eclipse.org/bugs/show_bug.cgi?id=365818
+   private static final Supplier <LoadingCache<ZoneAndName, 
SecurityGroupInZone>> groupCache = 
Suppliers.<LoadingCache<ZoneAndName,SecurityGroupInZone>> ofInstance(
+           CacheBuilder.newBuilder().<ZoneAndName, 
SecurityGroupInZone>build(CacheLoader.from(Functions.forMap(groupMap))));
+
+   public static final SecurityGroupRuleToIpPermission ruleConverter = new 
SecurityGroupRuleToIpPermission(returnSecurityGroupExistsInZone, locationIndex,
+           groupCache.get());
 
    public static org.jclouds.openstack.nova.v2_0.domain.SecurityGroup 
securityGroupWithGroup() {
-      TenantIdAndName group = 
TenantIdAndName.builder().tenantId("tenant").name("name").build();
+      TenantIdAndName group = 
TenantIdAndName.builder().tenantId("tenant").name("some-other-group").build();
 
       SecurityGroupRule ruleToConvert = SecurityGroupRule.builder()
               .id("some-id")
@@ -71,7 +107,7 @@ public class NovaSecurityGroupToSecurityGroupTest {
       org.jclouds.openstack.nova.v2_0.domain.SecurityGroup origGroup = 
org.jclouds.openstack.nova.v2_0.domain.SecurityGroup.builder()
               .tenantId("tenant")
               .id("some-id")
-              .name("some-group")
+              .name("some-other-group")
               .description("some-description")
               .rules(ruleToConvert)
               .build();

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/46b8fd0e/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/SecurityGroupRuleToIpPermissionTest.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/SecurityGroupRuleToIpPermissionTest.java
 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/SecurityGroupRuleToIpPermissionTest.java
index 1702a13..59c59d0 100644
--- 
a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/SecurityGroupRuleToIpPermissionTest.java
+++ 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/SecurityGroupRuleToIpPermissionTest.java
@@ -39,7 +39,7 @@ public class SecurityGroupRuleToIpPermissionTest {
    @Test
    public void testApplyWithGroup() {
 
-      TenantIdAndName group = 
TenantIdAndName.builder().tenantId("tenant").name("name").build();
+      TenantIdAndName group = 
TenantIdAndName.builder().tenantId("tenant").name("some-group").build();
       
       SecurityGroupRule ruleToConvert = SecurityGroupRule.builder()
          .id("some-id")
@@ -50,15 +50,12 @@ public class SecurityGroupRuleToIpPermissionTest {
          .parentGroupId("some-other-id")
          .build();
 
-      SecurityGroupRuleToIpPermission converter = new 
SecurityGroupRuleToIpPermission();
-
-      IpPermission convertedPerm = converter.apply(ruleToConvert);
+      IpPermission convertedPerm = 
NovaSecurityGroupToSecurityGroupTest.ruleConverter.apply(ruleToConvert);
 
       assertEquals(convertedPerm.getIpProtocol(), 
ruleToConvert.getIpProtocol());
       assertEquals(convertedPerm.getFromPort(), ruleToConvert.getFromPort());
       assertEquals(convertedPerm.getToPort(), ruleToConvert.getToPort());
-      
assertTrue(convertedPerm.getTenantIdGroupNamePairs().containsKey(group.getTenantId()));
-      
assertTrue(convertedPerm.getTenantIdGroupNamePairs().containsValue(group.getName()));
+      
assertTrue(convertedPerm.getGroupIds().contains("az-1.region-a.geo-1/some-id"));
       assertTrue(convertedPerm.getCidrBlocks().size() == 0);
    }
 
@@ -73,9 +70,7 @@ public class SecurityGroupRuleToIpPermissionTest {
          .parentGroupId("some-other-id")
          .build();
 
-      SecurityGroupRuleToIpPermission converter = new 
SecurityGroupRuleToIpPermission();
-
-      IpPermission convertedPerm = converter.apply(ruleToConvert);
+      IpPermission convertedPerm = 
NovaSecurityGroupToSecurityGroupTest.ruleConverter.apply(ruleToConvert);
 
       assertEquals(convertedPerm.getIpProtocol(), 
ruleToConvert.getIpProtocol());
       assertEquals(convertedPerm.getFromPort(), ruleToConvert.getFromPort());

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/46b8fd0e/apis/openstack-nova/src/test/resources/securitygroup_details_extension.json
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/test/resources/securitygroup_details_extension.json 
b/apis/openstack-nova/src/test/resources/securitygroup_details_extension.json
index a644296..0c5b316 100644
--- 
a/apis/openstack-nova/src/test/resources/securitygroup_details_extension.json
+++ 
b/apis/openstack-nova/src/test/resources/securitygroup_details_extension.json
@@ -16,8 +16,8 @@
               {
                  "from_port": 22,
                  "group": {
-                     "tenant_id": "admin",
-                     "name": "11111"
+                     "tenant_id": "tenant0",
+                     "name": "name0"
                   },
                   "ip_protocol": "tcp",
                   "to_port": 22,

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/46b8fd0e/apis/openstack-nova/src/test/resources/securitygroup_list_extension.json
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/test/resources/securitygroup_list_extension.json 
b/apis/openstack-nova/src/test/resources/securitygroup_list_extension.json
index 14866e3..4a19a36 100644
--- a/apis/openstack-nova/src/test/resources/securitygroup_list_extension.json
+++ b/apis/openstack-nova/src/test/resources/securitygroup_list_extension.json
@@ -42,10 +42,10 @@
           "id":119
         }
       ],
-      "tenant_id":"dev_16767499955063",
-      "id":160,
-      "name":"jclouds-test",
-      "description":"jclouds-test"
+        "tenant_id": "tenant0",
+        "id": 160,
+        "name": "name0",
+        "description": "description0"
     }
   ]
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/46b8fd0e/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
index e6227b7..efc8e61 100644
--- 
a/compute/src/test/java/org/jclouds/compute/extensions/internal/BaseSecurityGroupExtensionLiveTest.java
+++ 
b/compute/src/test/java/org/jclouds/compute/extensions/internal/BaseSecurityGroupExtensionLiveTest.java
@@ -244,8 +244,9 @@ public abstract class BaseSecurityGroupExtensionLiveTest 
extends BaseComputeServ
                                                                                
      emptyStringSet(),
                                                                                
      ImmutableSet.of(group.getId()),
                                                                                
      newGroup);
-         
-         assertTrue(secondNewGroup.getIpPermissions().contains(secondPerm)); 
+
+         assertTrue(secondNewGroup.getIpPermissions().contains(secondPerm), 
"permissions for second group should contain "
+                 + secondPerm + " but do not: " + 
secondNewGroup.getIpPermissions());
       }
 
       if (securityGroupExtension.get().supportsTenantIdGroupNamePairs()

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/46b8fd0e/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/compute/extensions/HPCloudComputeSecurityGroupExtensionLiveTest.java
----------------------------------------------------------------------
diff --git 
a/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/compute/extensions/HPCloudComputeSecurityGroupExtensionLiveTest.java
 
b/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/compute/extensions/HPCloudComputeSecurityGroupExtensionLiveTest.java
new file mode 100644
index 0000000..6a22c3e
--- /dev/null
+++ 
b/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/compute/extensions/HPCloudComputeSecurityGroupExtensionLiveTest.java
@@ -0,0 +1,41 @@
+/*
+ * 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.hpcloud.compute.compute.extensions;
+
+import 
org.jclouds.compute.extensions.internal.BaseSecurityGroupExtensionLiveTest;
+import org.jclouds.sshj.config.SshjSshClientModule;
+import org.testng.annotations.Test;
+
+import com.google.inject.Module;
+
+/**
+ * 
+ * @author Andrew Bayer
+ * 
+ */
+@Test(groups = "live", singleThreaded = true, testName = 
"HPCloudComputeImageExtensionLiveTest")
+public class HPCloudComputeSecurityGroupExtensionLiveTest extends 
BaseSecurityGroupExtensionLiveTest {
+
+   public HPCloudComputeSecurityGroupExtensionLiveTest() {
+      provider = "hpcloud-compute";
+   }
+
+   @Override
+   protected Module getSshModule() {
+      return new SshjSshClientModule();
+   }
+}

Reply via email to