You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltacloud.apache.org by mf...@redhat.com on 2010/12/08 13:34:24 UTC

[PATCH core 3/4] Added support for Addresses collection to API

From: Michal Fojtik <mf...@redhat.com>

---
 server/server.rb                       |   80 ++++++++++++++++++++++++++++++++
 server/views/addresses/index.html.haml |   26 ++++++++++
 server/views/addresses/index.xml.haml  |    4 ++
 server/views/addresses/show.html.haml  |   26 ++++++++++
 server/views/addresses/show.xml.haml   |   14 ++++++
 5 files changed, 150 insertions(+), 0 deletions(-)
 create mode 100644 server/views/addresses/index.html.haml
 create mode 100644 server/views/addresses/index.xml.haml
 create mode 100644 server/views/addresses/show.html.haml
 create mode 100644 server/views/addresses/show.xml.haml

diff --git a/server/server.rb b/server/server.rb
index 9585f9b..4a7f05f 100644
--- a/server/server.rb
+++ b/server/server.rb
@@ -486,6 +486,86 @@ collection :keys do
 
 end
 
+collection :addresses do
+  description "Manage IP addresses"
+
+  operation :index do
+    description "List all IP addresses provided by backend cloud"
+    with_capability :addresses
+    control do
+      filter_all :addresses
+    end
+  end
+
+  operation :show do
+    description "Show details about specific IP address"
+    with_capability :address
+    control do
+      show :address
+    end
+  end
+
+  operation :create do
+    description "Allocate a new IP address if provider support that"
+    with_capability :create_address
+    param :instance_id, :string, :optional, "Associate IP to instance after create"
+    control do
+      @address = driver.create_address(credentials, params)
+      respond_to do |format|
+        format.html { haml :"addresses/show" }
+        format.xml { haml :"addresses/show" }
+      end
+    end
+  end
+
+  operation :destroy do
+    description "Deallocate IP address if provider support that"
+    with_capability :destroy_address
+    control do
+      retval = driver.destroy_address(credentials, params)
+      respond_to do |format|
+        format.html do
+          if retval
+            redirect addresses_url
+          end
+        end
+        format.xml { status 410 }
+        format.json { status 410 }
+      end
+    end
+  end
+
+  operation :associate, :member => true, :method => :put do
+    description "Associate IP address to instance"
+    with_capability :associate_address
+    param :id, :string,  :required
+    param :instance_id, :string,  :required
+    control do
+      driver.associate_address(credentials, params)
+      respond_to do |format|
+        format.html { redirect address_url(params[:id]) }
+        format.xml { redirect address_url(params[:id]) }
+        format.json { redirect address_url(params[:id]) }
+      end
+    end
+  end
+
+  operation :release, :member => true, :method => :post do
+    description "Release instance from address"
+    with_capability :release_address
+    param :id,  :string,  :required
+    control do
+      driver.release_address(credentials, params)
+      respond_to do |format|
+        format.html { redirect address_url(params[:id]) }
+        format.xml { redirect address_url(params[:id]) }
+        format.json { redirect address_url(params[:id]) }
+      end
+    end
+  end
+
+end
+
 #get html form for creating a new blob
 get '/api/buckets/:bucket/new_blob' do
   @bucket_id = params[:bucket]
diff --git a/server/views/addresses/index.html.haml b/server/views/addresses/index.html.haml
new file mode 100644
index 0000000..9cc16ff
--- /dev/null
+++ b/server/views/addresses/index.html.haml
@@ -0,0 +1,26 @@
+%h1 Addresses
+
+%table.display
+  %thead
+    %tr
+      %th ID
+      %th Instance
+      %th Visibility
+      %th Actions
+  %tbody
+    - @elements.each do |address|
+      %tr
+        %td
+          = link_to address.id, address_url( address.id )
+        %td
+          = link_to(address.instance_id, instance_url(address.instance_id)) if address.instance_id
+        %td
+          = address.is_public? ? "PUBLIC" : "PRIVATE"
+        %td
+          - if driver.respond_to?(:destroy_address)
+            =link_to_action 'Destroy', destroy_address_url(address.id), :delete
+  %tfoot
+    - if driver.respond_to?(:create_address)
+      %tr
+        %td{:colspan => 4, :style => "text-align:right;"}
+          =link_to_action 'Create', addresses_url, :post
diff --git a/server/views/addresses/index.xml.haml b/server/views/addresses/index.xml.haml
new file mode 100644
index 0000000..abf83b7
--- /dev/null
+++ b/server/views/addresses/index.xml.haml
@@ -0,0 +1,4 @@
+!!!XML
+%addresses
+  - @elements.each do |c|
+    = haml :'addresses/show', :locals => { :@address => c, :partial => true }
diff --git a/server/views/addresses/show.html.haml b/server/views/addresses/show.html.haml
new file mode 100644
index 0000000..6cb28a1
--- /dev/null
+++ b/server/views/addresses/show.html.haml
@@ -0,0 +1,26 @@
+%h1
+  = @address.id
+
+%dl
+  %di
+    %dt Address visibility
+    %dd
+      = @address.is_public? ? "PUBLIC" : "PRIVATE"
+  %di
+    %dt Associated instance
+    %dd
+      = @address.instance_id ? @address.instance_id : "No instance"
+  - unless @address.instance_id
+    %di
+      %dt 
+        Associate Instance:
+      %dd
+        %form{ :action => associate_address_url(@address.id), :method => :post}
+          %input{ :type => :hidden, :name => '_method', :value => :put }
+          %input{ :type => :text, :name => 'instance_id', :value => ''}
+          %input{ :type => :submit, :value => "Associate" }
+  - else
+    %di
+      %dt
+        Release Instance:
+        = link_to_action "Release", release_address_url(@address.id), :post
diff --git a/server/views/addresses/show.xml.haml b/server/views/addresses/show.xml.haml
new file mode 100644
index 0000000..a33648b
--- /dev/null
+++ b/server/views/addresses/show.xml.haml
@@ -0,0 +1,14 @@
+- unless defined?(partial)
+  !!! XML
+%address{ :href => address_url(@address.id), :id => @address.id }
+  %actions
+    - if driver.respond_to?(:destroy_address)
+      %link{ :href => destroy_address_url(@address.id), :rel => "destroy", :method => :delete }
+    - if driver.respond_to?(:associate_address)
+      - if @address.instance_id
+        %link{ :href => release_address_url(@address.id), :rel => "release", :method => :post }
+  %visibility<
+    =@address.is_public? ? "PUBLIC" : "PRIVATE"
+  - if @address.instance_id
+    %instance{ :href => instance_url(@address.instance_id), :rel => "instance", :id => @address.instance_id}
+  
-- 
1.7.3.2