Adding EC2 SecurityGroup -> compute SecurityGroup converter
Project: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/commit/5b5d1b88 Tree: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/tree/5b5d1b88 Diff: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/diff/5b5d1b88 Branch: refs/heads/jclouds-101 Commit: 5b5d1b88b6e8acaef2fa1efbc7fe4f6d8ff21c4f Parents: 382393b Author: Andrew Bayer <[email protected]> Authored: Thu Jun 13 11:21:25 2013 -0700 Committer: Andrew Bayer <[email protected]> Committed: Thu Jun 13 11:21:25 2013 -0700 ---------------------------------------------------------------------- .../EC2ComputeServiceDependenciesModule.java | 4 + .../EC2SecurityGroupToSecurityGroup.java | 94 ++++++++++++++++++++ .../EC2SecurityGroupToSecurityGroupTest.java | 84 +++++++++++++++++ .../jclouds/compute/domain/SecurityGroup.java | 2 +- 4 files changed, 183 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5b5d1b88/apis/ec2/src/main/java/org/jclouds/ec2/compute/config/EC2ComputeServiceDependenciesModule.java ---------------------------------------------------------------------- diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/config/EC2ComputeServiceDependenciesModule.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/config/EC2ComputeServiceDependenciesModule.java index 06b524f..32b1d01 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/config/EC2ComputeServiceDependenciesModule.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/config/EC2ComputeServiceDependenciesModule.java @@ -29,6 +29,7 @@ import org.jclouds.compute.ComputeService; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadata.Status; +import org.jclouds.compute.domain.SecurityGroup; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.extensions.ImageExtension; import org.jclouds.compute.options.TemplateOptions; @@ -41,6 +42,7 @@ import org.jclouds.ec2.compute.functions.AddElasticIpsToNodemetadata; import org.jclouds.ec2.compute.functions.CreateUniqueKeyPair; import org.jclouds.ec2.compute.functions.CredentialsForInstance; import org.jclouds.ec2.compute.functions.EC2ImageParser; +import org.jclouds.ec2.compute.functions.EC2SecurityGroupToSecurityGroup; import org.jclouds.ec2.compute.functions.PasswordCredentialsFromWindowsInstance; import org.jclouds.ec2.compute.functions.RunningInstanceToNodeMetadata; import org.jclouds.ec2.compute.functions.WindowsLoginCredentialsFromEncryptedData; @@ -129,6 +131,8 @@ public class EC2ComputeServiceDependenciesModule extends AbstractModule { }).to(PasswordCredentialsFromWindowsInstance.class); bind(new TypeLiteral<Function<org.jclouds.ec2.domain.Image, Image>>() { }).to(EC2ImageParser.class); + bind(new TypeLiteral<Function<org.jclouds.ec2.domain.SecurityGroup, SecurityGroup>>() { + }).to(EC2SecurityGroupToSecurityGroup.class); bind(new TypeLiteral<ImageExtension>() { }).to(EC2ImageExtension.class); } http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5b5d1b88/apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/EC2SecurityGroupToSecurityGroup.java ---------------------------------------------------------------------- diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/EC2SecurityGroupToSecurityGroup.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/EC2SecurityGroupToSecurityGroup.java new file mode 100644 index 0000000..3ff4469 --- /dev/null +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/EC2SecurityGroupToSecurityGroup.java @@ -0,0 +1,94 @@ +/* + * 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.ec2.compute.functions; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.NoSuchElementException; +import java.util.Set; + +import javax.annotation.Resource; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.collect.Memoized; +import org.jclouds.compute.domain.SecurityGroup; +import org.jclouds.compute.domain.SecurityGroupBuilder; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.domain.Location; +import org.jclouds.logging.Logger; +import org.jclouds.net.domain.IpPermission; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; +import com.google.inject.Inject; + + +/** + * A function for transforming an EC2-specific SecurityGroup into a generic + * SecurityGroup object. + * + * @author Andrew Bayer + */ +@Singleton +public class EC2SecurityGroupToSecurityGroup implements Function<org.jclouds.ec2.domain.SecurityGroup, SecurityGroup> { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + protected final Supplier<Set<? extends Location>> locations; + + @Inject + public EC2SecurityGroupToSecurityGroup(@Memoized Supplier<Set<? extends Location>> locations) { + this.locations = checkNotNull(locations, "locations"); + } + + @Override + public SecurityGroup apply(org.jclouds.ec2.domain.SecurityGroup group) { + SecurityGroupBuilder builder = new SecurityGroupBuilder(); + Location location = findLocationWithId(group.getRegion()); + builder.location(location); + builder.id(group.getId()); + builder.providerId(group.getId()); + builder.name(group.getName()); + builder.ipPermissions(group); + + return builder.build(); + } + + private Location findLocationWithId(final String locationId) { + if (locationId == null) + return null; + try { + Location location = Iterables.find(locations.get(), new Predicate<Location>() { + + @Override + public boolean apply(Location input) { + return input.getId().equals(locationId); + } + + }); + return location; + + } catch (NoSuchElementException e) { + logger.debug("couldn't match instance location %s in: %s", locationId, locations.get()); + return null; + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5b5d1b88/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/EC2SecurityGroupToSecurityGroupTest.java ---------------------------------------------------------------------- diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/EC2SecurityGroupToSecurityGroupTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/EC2SecurityGroupToSecurityGroupTest.java new file mode 100644 index 0000000..4a16e2e --- /dev/null +++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/EC2SecurityGroupToSecurityGroupTest.java @@ -0,0 +1,84 @@ +/* + * 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.ec2.compute.functions; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import java.util.Set; + +import org.jclouds.compute.domain.SecurityGroup; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; +import org.jclouds.domain.LocationScope; +import org.jclouds.ec2.util.IpPermissions; +import org.jclouds.net.domain.IpPermission; +import org.testng.annotations.Test; + +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableSet; + +/** + * @author Andrew Bayer + */ +@Test(groups = "unit", testName = "EC2SecurityGroupToSecurityGroupTest") +public class EC2SecurityGroupToSecurityGroupTest { + + static Location provider = new LocationBuilder().scope(LocationScope.REGION).id("us-east-1") + .description("us-east-1").build(); + + @Test + public void testApply() { + IpPermissions authorization = IpPermissions.permitAnyProtocol(); + + org.jclouds.ec2.domain.SecurityGroup origGroup = org.jclouds.ec2.domain.SecurityGroup.builder() + .region("us-east-1") + .id("some-id") + .name("some-group") + .ownerId("some-owner") + .description("some-description") + .ipPermission(authorization) + .build(); + + EC2SecurityGroupToSecurityGroup parser = createGroupParser(ImmutableSet.of(provider)); + + SecurityGroup group = parser.apply(origGroup); + + assertEquals(group.getLocation(), provider); + assertEquals(group.getId(), origGroup.getId()); + assertEquals(group.getProviderId(), origGroup.getId()); + assertEquals(group.getName(), origGroup.getName()); + assertEquals(group.getIpPermissions(), (Set<IpPermission>)origGroup); + } + + private EC2SecurityGroupToSecurityGroup createGroupParser(final ImmutableSet<Location> locations) { + Supplier<Set<? extends Location>> locationSupplier = new Supplier<Set<? extends Location>>() { + + @Override + public Set<? extends Location> get() { + return locations; + } + + }; + + EC2SecurityGroupToSecurityGroup parser = new EC2SecurityGroupToSecurityGroup(locationSupplier); + + return parser; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/5b5d1b88/compute/src/main/java/org/jclouds/compute/domain/SecurityGroup.java ---------------------------------------------------------------------- diff --git a/compute/src/main/java/org/jclouds/compute/domain/SecurityGroup.java b/compute/src/main/java/org/jclouds/compute/domain/SecurityGroup.java index a7b6ccd..78d44bd 100644 --- a/compute/src/main/java/org/jclouds/compute/domain/SecurityGroup.java +++ b/compute/src/main/java/org/jclouds/compute/domain/SecurityGroup.java @@ -35,7 +35,7 @@ import com.google.common.collect.ComparisonChain; import com.google.common.collect.ImmutableSet; /** - * Describes a security group containing a set of @{link SecurityGroupRule}s + * Describes a security group containing a set of @{link IpPermission}s * * @author Andrew Bayer */
