From: Sang-Min Park <[email protected]>

---
 .../drivers/eucalyptus/eucalyptus_driver.rb        |   38 +++++++++++++++++++-
 1 files changed, 37 insertions(+), 1 deletions(-)

diff --git a/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb 
b/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb
index 4413f6b..ec93e87 100644
--- a/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb
+++ b/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb
@@ -22,7 +22,7 @@ module Deltacloud
       class EucalyptusDriver < EC2::EC2Driver
 
         def supported_collections
-          DEFAULT_COLLECTIONS + [ :keys, :buckets, :addresses ]
+          DEFAULT_COLLECTIONS + [ :keys, :buckets, :addresses, :firewalls ]
         end
 
         feature :instances, :user_data
@@ -122,6 +122,42 @@ module Deltacloud
                   "Loadbalancer not supported in Eucalyptus", "")
         end
 
+       # override EC2 implementation; Eucalyptus implements the older 
definition of EC2 security group;
+       # 
http://docs.amazonwebservices.com/AWSEC2/2009-07-15/APIReference/index.html?ApiReference-query-AuthorizeSecurityGroupIngress.html
+        # if the rule specifies a source group, port&protocol will be ignored. 
And source group and cidr range can't be mixed in a request
+       def create_firewall_rule(credentials, opts={})
+         # only either source groups or cidr IP range can be given, not both;
+         if !(opts['groups'].nil?) && opts['groups'].length>0
+           ec2 = new_client(credentials)
+           opts['groups'].each do |group,owner|  
+             safely do
+               ec2.authorize_security_group_named_ingress(opts['id'], owner, 
group)
+             end
+           end
+         elsif !(opts['addresses'].nil?) && opts['addresses'].length>0 
+           ec2 = new_client(credentials)
+           opts['addresses'].each do |ip|
+               ec2.authorize_security_group_IP_ingress(opts['id'], 
opts['from_port'], opts['to_port'], opts['protocol'], ip) 
+           end
+         end
+       end
+
+       def delete_firewall_rule(credentials, opts={})
+           ec2 = new_client(credentials)
+           firewall = opts[:id]
+            protocol, from_port, to_port, addresses, groups = 
firewall_rule_params(opts[:rule_id])
+           unless groups.nil? 
+              groups.each_index do |i|
+                  ec2.revoke_security_group_named_ingress(firewall, 
groups[i]['owner'], groups[i]['group_name'])
+              end 
+            end
+            unless addresses.nil?
+               addresses.each do |ip|
+                 ec2.revoke_security_group_IP_ingress(firewall, from_port, 
to_port, protocol, ip )
+              end
+           end
+       end
+       
         def new_client(credentials, type = :ec2)
           klass = case type
                   when :ec2 then Aws::Ec2
-- 
1.7.4.1

Reply via email to