You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltacloud.apache.org by mf...@apache.org on 2011/05/03 16:10:57 UTC

svn commit: r1099064 - in /incubator/deltacloud/trunk: server/ server/lib/deltacloud/core_ext/ server/lib/deltacloud/drivers/ec2/ server/lib/deltacloud/models/ server/views/addresses/ tests/ec2/

Author: mfojtik
Date: Tue May  3 14:10:56 2011
New Revision: 1099064

URL: http://svn.apache.org/viewvc?rev=1099064&view=rev
Log:
Added basic IP address managment support (for EC2)

Added:
    incubator/deltacloud/trunk/server/lib/deltacloud/models/address.rb
    incubator/deltacloud/trunk/server/views/addresses/
    incubator/deltacloud/trunk/server/views/addresses/associate.html.haml
    incubator/deltacloud/trunk/server/views/addresses/index.html.haml
    incubator/deltacloud/trunk/server/views/addresses/index.xml.haml
    incubator/deltacloud/trunk/server/views/addresses/show.html.haml
    incubator/deltacloud/trunk/server/views/addresses/show.xml.haml
Modified:
    incubator/deltacloud/trunk/server/deltacloud.rb
    incubator/deltacloud/trunk/server/lib/deltacloud/core_ext/string.rb
    incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
    incubator/deltacloud/trunk/server/server.rb
    incubator/deltacloud/trunk/tests/ec2/api.feature

Modified: incubator/deltacloud/trunk/server/deltacloud.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/deltacloud.rb?rev=1099064&r1=1099063&r2=1099064&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/deltacloud.rb (original)
+++ incubator/deltacloud/trunk/server/deltacloud.rb Tue May  3 14:10:56 2011
@@ -29,6 +29,7 @@ require 'deltacloud/models/realm'
 require 'deltacloud/models/image'
 require 'deltacloud/models/instance'
 require 'deltacloud/models/key'
+require 'deltacloud/models/address'
 require 'deltacloud/models/instance_profile'
 require 'deltacloud/models/storage_snapshot'
 require 'deltacloud/models/storage_volume'

Modified: incubator/deltacloud/trunk/server/lib/deltacloud/core_ext/string.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/core_ext/string.rb?rev=1099064&r1=1099063&r2=1099064&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/core_ext/string.rb (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/core_ext/string.rb Tue May  3 14:10:56 2011
@@ -33,10 +33,12 @@ class String
   end
 
   def pluralize
+    return self + 'es' if self =~ /ess$/
     self + "s"
   end
 
   def singularize
+    return self.gsub(/es$/, '') if self =~ /sses$/
     self.gsub(/s$/, '')
   end
 

Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb?rev=1099064&r1=1099063&r2=1099064&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb Tue May  3 14:10:56 2011
@@ -33,7 +33,7 @@ module Deltacloud
       class EC2Driver < Deltacloud::BaseDriver
 
         def supported_collections
-          DEFAULT_COLLECTIONS + [ :keys, :buckets, :load_balancers ]
+          DEFAULT_COLLECTIONS + [ :keys, :buckets, :load_balancers, :addresses ]
         end
 
         feature :instances, :user_data
@@ -509,6 +509,61 @@ module Deltacloud
           end
         end
 
+        def addresses(credentials, opts={})
+          ec2 = new_client(credentials)
+          address_id = (opts and opts[:id]) ? [opts[:id]] : []
+          safely do
+            begin
+              ec2.describe_addresses(address_id).collect do |address|
+                Address.new(:id => address[:public_ip], :instance_id => address[:instance_id])
+              end
+            rescue Exception => e
+              return [] if e.message =~ /InvalidAddress\.NotFound:/
+              raise e
+            end
+          end
+        end
+
+        def address(credentials, opts={})
+          addresses(credentials, :id => opts[:id]).first
+        end
+
+        def create_address(credentials, opts={})
+          ec2 = new_client(credentials)
+          safely do
+            Address.new(:id => ec2.allocate_address)
+          end
+        end
+
+        def destroy_address(credentials, opts={})
+          ec2 = new_client(credentials)
+          safely do
+            ec2.release_address(opts[:id])
+          end
+        end
+
+        def associate_address(credentials, opts={})
+          ec2 = new_client(credentials)
+          safely do
+            if ec2.associate_address(opts[:instance_id], opts[:id])
+              Address.new(:id => opts[:id], :instance_id => opts[:instance_id])
+            else
+              raise "ERROR: Cannot associate IP address to an Instance"
+            end
+          end
+        end
+
+        def disassociate_address(credentials, opts={})
+          ec2 = new_client(credentials)
+          safely do
+            if ec2.disassociate_address(opts[:id])
+              Address.new(:id => opts[:id])
+            else
+              raise "ERROR: Cannot disassociate an IP address from the Instance"
+            end
+          end
+        end
+
         def valid_credentials?(credentials)
           retval = true
           begin

Added: incubator/deltacloud/trunk/server/lib/deltacloud/models/address.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/models/address.rb?rev=1099064&view=auto
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/models/address.rb (added)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/models/address.rb Tue May  3 14:10:56 2011
@@ -0,0 +1,28 @@
+#
+# 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.
+
+class Address < BaseModel
+  attr_accessor :instance_id
+
+  def initialize(init=nil)
+    super(init)
+  end
+
+  def associated?
+    true unless self.instance_id.nil?
+  end
+
+end

Modified: incubator/deltacloud/trunk/server/server.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/server.rb?rev=1099064&r1=1099063&r2=1099064&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/server.rb (original)
+++ incubator/deltacloud/trunk/server/server.rb Tue May  3 14:10:56 2011
@@ -858,3 +858,90 @@ collection :buckets do
   end
 
 end
+
+get '/api/addresses/:id/associate' do
+  @instances = driver.instances(credentials)
+  @address = Address::new(:id => params[:id])
+  respond_to do |format|
+    format.html { haml :"addresses/associate" }
+  end
+end
+
+collection :addresses do
+  description "Manage IP addresses"
+
+  operation :index do
+    description "List IP addresses assigned to your account."
+    with_capability :addresses
+    control do
+      filter_all :addresses
+    end
+  end
+
+  operation :show do
+    description "Show details about IP addresses specified by given ID"
+    with_capability :address
+    param :id,  :string,  :required
+    control { show :address }
+  end
+
+  operation :create do
+    description "Acquire a new IP address for use with your account."
+    with_capability :create_address
+    control do
+      @address = driver.create_address(credentials, {})
+      respond_to do |format|
+        format.html { haml :"addresses/show" }
+        format.xml do
+          response.status = 201  # Created
+          response['Location'] = address_url(@address.id)
+          haml :"addresses/show", :ugly => true
+        end
+      end
+    end
+  end
+
+  operation :destroy do
+    description "Release an IP address associated with your account"
+    with_capability :destroy_address
+    param :id,  :string,  :required
+    control do
+      driver.destroy_address(credentials, { :id => params[:id]})
+      respond_to do |format|
+        format.xml { 204 }
+        format.json { 204 }
+        format.html { redirect(addresses_url) }
+      end
+    end
+  end
+
+  operation :associate, :method => :post, :member => true do
+    description "Associate an IP address to an instance"
+    with_capability :associate_address
+    param :id, :string, :required
+    param :instance_id, :string, :required
+    control do
+      driver.associate_address(credentials, { :id => params[:id], :instance_id => params[:instance_id]})
+      respond_to do |format|
+        format.xml { 202 }  # Accepted
+        format.json { 202 }
+        format.html { redirect(address_url(params[:id])) }
+      end
+    end
+  end
+
+  operation :disassociate, :method => :post, :member => true do
+    description "Disassociate an IP address from an instance"
+    with_capability :associate_address
+    param :id, :string, :required
+    control do
+      driver.disassociate_address(credentials, { :id => params[:id] })
+      respond_to do |format|
+        format.xml { 202 }  # Accepted
+        format.json { 202 }
+        format.html { redirect(address_url(params[:id])) }
+      end
+    end
+  end
+
+end

Added: incubator/deltacloud/trunk/server/views/addresses/associate.html.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/addresses/associate.html.haml?rev=1099064&view=auto
==============================================================================
--- incubator/deltacloud/trunk/server/views/addresses/associate.html.haml (added)
+++ incubator/deltacloud/trunk/server/views/addresses/associate.html.haml Tue May  3 14:10:56 2011
@@ -0,0 +1,8 @@
+%h1 Associate #{@address.id} to an instance
+
+%form{ :action => associate_address_url(@address.id), :method => :post, :class => :new_instance }
+  %select{:name => 'instance_id'}
+    %option
+    - @instances.each do |inst|
+      %option{ :value => inst.id } #{inst.id} - #{inst.name}
+    %input{ :type => :submit, :name => "commit", :value => "Associate" }/

Added: incubator/deltacloud/trunk/server/views/addresses/index.html.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/addresses/index.html.haml?rev=1099064&view=auto
==============================================================================
--- incubator/deltacloud/trunk/server/views/addresses/index.html.haml (added)
+++ incubator/deltacloud/trunk/server/views/addresses/index.html.haml Tue May  3 14:10:56 2011
@@ -0,0 +1,28 @@
+%h1 Addresses
+
+%table.display
+  %thead
+    %tr
+      %th ID
+      %th Instance
+      %th Actions
+  %tbody
+    - @elements.each do |address|
+      %tr
+        %td
+          = link_to address.id, address_url( address.id )
+        %td
+          - if address.instance_id
+            = link_to address.instance_id, instance_url( address.instance_id )
+        %td
+          - if driver.respond_to?(:destroy_address)
+            =link_to_action 'Destroy', destroy_address_url(address.id), :delete
+          - if driver.respond_to?(:associate_address) and not address.associated?
+            =link_to_action 'Associate', associate_address_url(address.id), :get
+          - if driver.respond_to?(:disassociate_address)
+            =link_to_action 'Disassociate', disassociate_address_url(address.id), :post
+  %tfoot
+    - if driver.respond_to?(:create_address)
+      %tr
+        %td{:colspan => 3, :style => "text-align:right;"}
+          =link_to_action "Create", create_address_url, :post

Added: incubator/deltacloud/trunk/server/views/addresses/index.xml.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/addresses/index.xml.haml?rev=1099064&view=auto
==============================================================================
--- incubator/deltacloud/trunk/server/views/addresses/index.xml.haml (added)
+++ incubator/deltacloud/trunk/server/views/addresses/index.xml.haml Tue May  3 14:10:56 2011
@@ -0,0 +1,4 @@
+!!!XML
+%addresses
+  - @elements.each do |c|
+    = haml :'addresses/show', :locals => { :@address => c, :partial => true }

Added: incubator/deltacloud/trunk/server/views/addresses/show.html.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/addresses/show.html.haml?rev=1099064&view=auto
==============================================================================
--- incubator/deltacloud/trunk/server/views/addresses/show.html.haml (added)
+++ incubator/deltacloud/trunk/server/views/addresses/show.html.haml Tue May  3 14:10:56 2011
@@ -0,0 +1,22 @@
+%h1 Address
+
+%dl
+  %di
+    %dt Address
+    %dd=@address.id
+  %di
+    %dt Instance
+    %dd
+      - if @address.associated?
+        =link_to @address.instance_id, instance_url(@address.instance_id)
+        =link_to_action 'Disassociate', disassociate_address_url(@address.id), :post
+      - else
+        - if driver.respond_to?(:associate_address)
+          =link_to_action 'Associate', associate_address_url(@address.id), :get
+
+  %di
+    %dt Actions
+    %dd
+    - if driver.respond_to?(:destroy_address)
+      =link_to_action 'Destroy', destroy_address_url(@address.id), :delete
+

Added: incubator/deltacloud/trunk/server/views/addresses/show.xml.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/addresses/show.xml.haml?rev=1099064&view=auto
==============================================================================
--- incubator/deltacloud/trunk/server/views/addresses/show.xml.haml (added)
+++ incubator/deltacloud/trunk/server/views/addresses/show.xml.haml Tue May  3 14:10:56 2011
@@ -0,0 +1,14 @@
+- unless defined?(partial)
+  !!! XML
+%address{ :href => address_url(@address.id), :id => @address.id }
+  %ip<
+    =@address.id
+  %actions
+    - if driver.respond_to?(:destroy_address)
+      %link{ :rel => "destroy", :method => "delete", :href => destroy_address_url(@address.id)}
+    - if driver.respond_to?(:associate_address) and not @address.instance_id
+      %link{ :rel => "associate", :method => "post", :href => associate_address_url(@address.id)}
+    - if driver.respond_to?(:disassociate_address) and @address.instance_id
+      %link{ :rel => "disassociate", :method => "post", :href => disassociate_address_url(@address.id)}
+  - if @address.instance_id
+    %instance{ :href => instance_url(@address.instance_id), :id => @address.instance_id}

Modified: incubator/deltacloud/trunk/tests/ec2/api.feature
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/tests/ec2/api.feature?rev=1099064&r1=1099063&r2=1099064&view=diff
==============================================================================
--- incubator/deltacloud/trunk/tests/ec2/api.feature (original)
+++ incubator/deltacloud/trunk/tests/ec2/api.feature Tue May  3 14:10:56 2011
@@ -24,6 +24,7 @@ Feature: Accessing API entry points
     | hardware_profiles  |
     | storage_snapshots  |
     | storage_volumes    |
+    | addresses |
     And this URI should be available in XML, JSON, HTML format
 
   Scenario: Following entry points
@@ -42,6 +43,7 @@ Feature: Accessing API entry points
     | hardware_profiles  |
     | storage_snapshots  |
     | storage_volumes    |
+    | addresses |
     And each link should have 'rel' attribute with valid name
     And each link should have 'href' attribute with valid URL
     When client follow this attribute