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