You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltacloud.apache.org by ma...@apache.org on 2013/04/26 17:47:11 UTC

[14/14] git commit: Network API rev 3 - EC2 Driver implementation

Network API rev 3 - EC2 Driver implementation


Project: http://git-wip-us.apache.org/repos/asf/deltacloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltacloud/commit/9c094964
Tree: http://git-wip-us.apache.org/repos/asf/deltacloud/tree/9c094964
Diff: http://git-wip-us.apache.org/repos/asf/deltacloud/diff/9c094964

Branch: refs/heads/master
Commit: 9c094964b0cc285d98496f6a797bc4f649badece
Parents: c1c84bc
Author: marios <ma...@redhat.com>
Authored: Fri Apr 26 18:28:33 2013 +0300
Committer: marios <ma...@redhat.com>
Committed: Fri Apr 26 18:28:33 2013 +0300

----------------------------------------------------------------------
 server/lib/deltacloud/drivers/ec2/ec2_driver.rb |  130 ++++++++++++++++--
 1 files changed, 119 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltacloud/blob/9c094964/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
index 62c72cc..f258dfb 100644
--- a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
+++ b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
@@ -268,14 +268,8 @@ module Deltacloud
           if opts[:metrics] and !opts[:metrics].empty?
             instance_options[:monitoring_enabled] = true
           end
-          if opts[:realm_id]
-            az, sn = opts[:realm_id].split(":")
-            if sn
-              instance_options[:subnet_id] = sn
-            else
-              instance_options[:availability_zone] = az
-            end
-          end
+          instance_options[:availability_zone] = opts[:realm_id] if opts[:realm_id]
+          instance_options[:subnet_id] = opts[:subnet_id] if opts[:subnet_id] #FIXME should we fail if no :network_id ? don't need it but need consistency in API...
           instance_options[:key_name] = opts[:keyname] if opts[:keyname]
           instance_options[:instance_type] = opts[:hwp_id] if opts[:hwp_id] && opts[:hwp_id].length > 0
           firewalls = opts.inject([]){|res, (k,v)| res << v if k =~ /firewalls\d+$/; res}
@@ -835,6 +829,91 @@ module Deltacloud
           end
         end
 
+        #Deltacloud Networks == Amazon VPC
+        def networks(credentials, opts={})
+          ec2 = new_client(credentials)
+          networks = []
+          safely do
+            subnets = subnets(credentials) #get all subnets once
+            (opts[:id] ? ec2.describe_vpcs(opts[:id]) : ec2.describe_subnets).each do |vpc|
+              vpc_subnets = subnets.inject([]){|res,cur| res<<cur if cur.network==vpc[:vpc_id]  ;res} #collect subnets for this.network
+              networks << convert_vpc(vpc, vpc_subnets)
+            end
+          end
+          networks = filter_on(networks, :id, opts)
+        end
+
+        def create_network(credentials, opts={})
+          ec2 = new_client(credentials)
+          safely do
+            network = ec2.create_vpc(opts[:address_block]).first
+            convert_vpc(network)
+          end
+        end
+
+        def destroy_network(credentials, network_id)
+          ec2 = new_client(credentials)
+          safely do
+            ec2.delete_vpc(network_id)
+          end
+        end
+
+        def subnets(credentials, opts={})
+          ec2 = new_client(credentials)
+          subnets = []
+          safely do
+            (opts[:id] ? ec2.describe_subnets(opts[:id]) : ec2.describe_subnets).each do |sn|
+              subnets << convert_subnet(sn)
+            end
+          end
+          subnets = filter_on(subnets, :id, opts)
+        end
+
+        def create_subnet(credentials, opts={})
+          ec2 = new_client(credentials)
+          safely do
+            subnet = ec2.create_subnet(opts[:network_id], opts[:address_block]).first
+            convert_subnet(subnet)
+          end
+        end
+
+        def destroy_subnet(credentials, subnet_id)
+          ec2 = new_client(credentials)
+          safely do
+            ec2.delete_subnet(subnet_id)
+          end
+        end
+
+        def network_interfaces(credentials, opts={})
+          ec2 = new_client(credentials)
+          nics = []
+          safely do
+            (opts[:id] ? ec2.describe_network_interfaces(opts[:id]) : ec2.describe_network_interfaces).each do |nic|
+              nics << convert_nic(nic)
+            end
+          end
+          filter_on(nics, :id, opts)
+        end
+
+        def create_network_interface(credentials, opts={})
+          ec2 = new_client(credentials)
+          safely do
+            #create a nic:
+            nic = ec2.create_network_interface(opts[:network])
+            #retrieve the instance to determine appropriate device_index?
+            #attach it:
+            ec2.attach_network_interface(nic[:network_interface_id], opts[:instance], 0)
+            convert_nic(nic)
+          end
+        end
+
+        def destroy_network_interface(credentials, nic_id)
+          client = new_client(credentials)
+          safely do
+            client.delete_network_interface(nic_id)
+          end
+        end
+
         def providers(credentials, opts={})
           ec2 = new_client(credentials)
           @providers ||= ec2.describe_regions.map{|r| Provider.new( {:id=>r, :name=>r,
@@ -966,7 +1045,7 @@ module Deltacloud
           unless instance[:subnet_id].empty?
             realm_id = "#{realm_id}:#{instance[:subnet_id]}"
           end
-         Instance.new(
+          inst_params = {
             :id => instance[:aws_instance_id],
             :name => instance[:aws_image_id],
             :state => convert_state(instance[:aws_state]),
@@ -981,8 +1060,11 @@ module Deltacloud
             :private_addresses => [InstanceAddress.new(instance[:private_dns_name], :type => :hostname)],
             :firewalls => instance[:aws_groups],
             :storage_volumes => instance[:block_device_mappings].map{|vol| {vol.values.first=>vol.keys.first } },
-            :create_image => can_create_image
-          )
+            :create_image => can_create_image }
+#          if instance[:vpc_id]
+#            inst_params.merge!(:network_bindings => [{:network=>instance[:vpc_id], :subnet=>instance[:subnet_id], :ip_address=> instance[:aws_private_ip_address]}])
+#          end
+          Instance.new(inst_params)
         end
 
         def convert_key(key)
@@ -1159,6 +1241,32 @@ module Deltacloud
           end
         end
 
+        def convert_vpc(vpc, subnets=[])
+          addr_blocks = subnets.inject([]){|res,cur| res << cur.address_block  ; res}
+          Network.new({ :id => vpc[:vpc_id],
+                        :name => vpc[:vpc_id],
+                        :state=> (vpc[:state] == "available" ? "UP" : "DOWN"),
+                        :subnets => subnets.inject([]){|res,cur| res << cur.id  ;res},
+                        :address_blocks=> (addr_blocks.empty? ? [vpc[:cidr_block]] : addr_blocks)  })
+        end
+
+        def convert_subnet(subnet)
+          Subnet.new({  :id => subnet[:subnet_id],
+                        :name => subnet[:subnet_id],
+                        :network =>subnet[:vpc_id],
+                        :address_block => subnet[:cidr_block],
+                        :state => (subnet[:state] == "available" ? "UP" : "DOWN" )})
+        end
+
+        def convert_nic(nic, instance_id=nil)
+          instance = instance_id || (nic[:attachment] ? nic[:attachment][:instance_id] : nil)
+          NetworkInterface.new({  :id => nic[:network_interface_id],
+                                  :name => nic[:network_interface_id],
+                                  :instance => instance,
+                                  :ip_address => nic[:private_ip_address]
+                                })
+        end
+
         exceptions do
 
           on /root device is not supported for the instance/ do