Updated Branches: refs/heads/trunk 32481db44 -> 8b36d8973
WHIRR-711. Add security group support for OpenStack. Project: http://git-wip-us.apache.org/repos/asf/whirr/repo Commit: http://git-wip-us.apache.org/repos/asf/whirr/commit/8b36d897 Tree: http://git-wip-us.apache.org/repos/asf/whirr/tree/8b36d897 Diff: http://git-wip-us.apache.org/repos/asf/whirr/diff/8b36d897 Branch: refs/heads/trunk Commit: 8b36d8973e56518ebfe0d4c6f88965d109e279bd Parents: 32481db Author: Andrew Bayer <andrew.ba...@gmail.com> Authored: Sun Mar 24 15:03:53 2013 -0700 Committer: Andrew Bayer <andrew.ba...@gmail.com> Committed: Mon Mar 25 09:11:18 2013 -0700 ---------------------------------------------------------------------- CHANGES.txt | 2 + .../org/apache/whirr/service/FirewallManager.java | 44 +++++++++++++++ 2 files changed, 46 insertions(+), 0 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/whirr/blob/8b36d897/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index a465421..171098a 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,8 @@ Release 0.8.2 (unreleased changes) IMPROVEMENTS + WHIRR-711. Add security group support for OpenStack. (abayer) + WHIRR-681. Enhance puppet service with an ability to export cluster topology to the puppet code. (Roman Shaposhnik via abayer) http://git-wip-us.apache.org/repos/asf/whirr/blob/8b36d897/core/src/main/java/org/apache/whirr/service/FirewallManager.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/whirr/service/FirewallManager.java b/core/src/main/java/org/apache/whirr/service/FirewallManager.java index 27b7705..0599e43 100644 --- a/core/src/main/java/org/apache/whirr/service/FirewallManager.java +++ b/core/src/main/java/org/apache/whirr/service/FirewallManager.java @@ -36,12 +36,17 @@ import org.jclouds.compute.ComputeServiceContext; import org.jclouds.ec2.EC2ApiMetadata; import org.jclouds.ec2.EC2Client; import org.jclouds.ec2.domain.IpProtocol; +import org.jclouds.openstack.nova.v2_0.NovaApiMetadata; +import org.jclouds.openstack.nova.v2_0.domain.Ingress; +import org.jclouds.openstack.nova.v2_0.domain.SecurityGroup; +import org.jclouds.openstack.nova.v2_0.extensions.SecurityGroupApi; import org.jclouds.javax.annotation.Nullable; import org.jclouds.scriptbuilder.domain.Statement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Function; +import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -298,6 +303,45 @@ public class FirewallManager { } } } + } else if (NovaApiMetadata.CONTEXT_TOKEN.isAssignableFrom(computeServiceContext.getBackendType())) { + // This code (or something like it) may be added to jclouds (see + // http://code.google.com/p/jclouds/issues/detail?id=336). + // Until then we need this temporary workaround. + Optional<? extends SecurityGroupApi> securityGroupApi = computeServiceContext.unwrap(NovaApiMetadata.CONTEXT_TOKEN) + .getApi() + .getSecurityGroupExtensionForZone(clusterSpec.getTemplate().getLocationId()); + + if (securityGroupApi.isPresent()) { + final String groupName = "jclouds-" + clusterSpec.getClusterName(); + Optional<? extends SecurityGroup> group = securityGroupApi.get().list().firstMatch(new Predicate<SecurityGroup>() { + @Override + public boolean apply(SecurityGroup secGrp) { + return secGrp.getName().equals(groupName); + } + }); + + if (group.isPresent()) { + for (String cidr : cidrs) { + for (int port : ports) { + try { + securityGroupApi.get().createRuleAllowingCidrBlock(group.get().getId(), + Ingress.builder() + .ipProtocol(org.jclouds.openstack.nova.v2_0.domain.IpProtocol.TCP) + .fromPort(port).toPort(port).build(), + cidr); + + } catch(IllegalStateException e) { + LOG.warn(e.getMessage()); + /* ignore, it means that this permission was already granted */ + } + } + } + } else { + LOG.warn("Expected security group " + groupName + " does not exist."); + } + } else { + LOG.warn("OpenStack security group extension not available for this cloud."); + } } } }