From: marios <[email protected]>

---
 server/deltacloud.rb                             |    1 +
 server/lib/deltacloud/base_driver/base_driver.rb |   17 ++++
 server/lib/deltacloud/base_driver/features.rb    |    6 ++
 server/server.rb                                 |   86 ++++++++++++++++++++--
 server/views/api/show.html.haml                  |    2 +
 5 files changed, 104 insertions(+), 8 deletions(-)

diff --git a/server/deltacloud.rb b/server/deltacloud.rb
index 1c19a5d..dd23ef0 100644
--- a/server/deltacloud.rb
+++ b/server/deltacloud.rb
@@ -12,3 +12,4 @@ require 'deltacloud/models/instance'
 require 'deltacloud/models/instance_profile'
 require 'deltacloud/models/storage_snapshot'
 require 'deltacloud/models/storage_volume'
+require 'deltacloud/models/access_rule'
diff --git a/server/lib/deltacloud/base_driver/base_driver.rb 
b/server/lib/deltacloud/base_driver/base_driver.rb
index a2b3bbe..daa58c1 100644
--- a/server/lib/deltacloud/base_driver/base_driver.rb
+++ b/server/lib/deltacloud/base_driver/base_driver.rb
@@ -154,6 +154,23 @@ module Deltacloud
     def reboot_instance(credentials, id)
     end
 
+
+    def access_rules(credentials, opts)
+      []
+    end
+ 
+    def access_rule(credentials, opts)
+      rules = access_rules(credentials, opts)
+      return rules.first unless rules.empty?
+      nil
+    end
+
+    def create_access_rule(credentials, opts)
+    end
+    def delete_access_rule(credentials, opts)
+    end
+
+
     def storage_volume(credentials, opts)
       volumes = storage_volumes(credentials, opts)
       return volumes.first unless volumes.empty?
diff --git a/server/lib/deltacloud/base_driver/features.rb 
b/server/lib/deltacloud/base_driver/features.rb
index 8ad354a..9fac444 100644
--- a/server/lib/deltacloud/base_driver/features.rb
+++ b/server/lib/deltacloud/base_driver/features.rb
@@ -155,5 +155,11 @@ module Deltacloud
       description "Size instances according to changes to a hardware profile"
       # The parameters are filled in from the hardware profiles
     end
+    
+    declare_feature :access_rules, :show do
+      operation :index do
+        
+      end
+    end
   end
 end
diff --git a/server/server.rb b/server/server.rb
index b5bdfac..4844746 100644
--- a/server/server.rb
+++ b/server/server.rb
@@ -65,6 +65,8 @@ def show(model)
 end
 
 
+
+
 #
 # Error handlers
 #
@@ -108,7 +110,58 @@ get '/api\/?' do
     end
 end
 
+get '/api/access_rules/:id/destroy' do
+  method = "delete_access_rule"
+  not_found unless driver.respond_to?(method)
+  opts = {}
+  opts[:id] = params[:id]
+  driver.send(method, credentials, opts)
+  redirect access_rules_url
+end
+
+get '/api/access_rules/new' do
+  respond_to do |format|
+    format.html { haml :"access_rules/new" }
+  end
+end
+
+
+def delete_access_rule(service_id)
+  driver.send(delete_access_rule, credentials, {:id => params[:id]})
+end
+
 # Rabbit DSL
+collection :access_rules do
+
+  description "Allow user to expose a public IP address/port and map these 
onto an internal IP address/port. eg expose ssh access [port 22, tcp]."
+  operation :index do
+    description 'Show all available network services'
+    control { filter_all(:access_rules) }
+  end
+
+  operation :show do
+    description 'Show a access rule identified by its id'
+    param :id,            :string, :required
+    control { show(:access_rule) }
+  end
+  
+  operation :create do
+    description 'Create a new access rule'
+    param :protocol,  :string, :required
+    param :port,     :string, :required
+    param :instance_group, :string, :required
+   control do
+      driver.create_access_rule(credentials, params )
+      filter_all(:access_rules)
+    end
+  end
+    
+  operation :destroy, :method => :post do
+    description 'destroy given access rule'
+    param :id,            :string, :required
+    control { delete_access_rule(:id) }
+  end
+end
 
 collection :realms do
   description "Within a cloud provider a realm represents a boundary 
containing resources. The exact definition of a realm is left to the cloud 
provider. In some cases, a realm may represent different datacenters, different 
continents, or different pools of resources within a single datacenter. A cloud 
provider may insist that resources must all exist within a single realm in 
order to cooperate. For instance, storage volumes may only be allowed to be 
mounted to instances within the same realm."
@@ -186,6 +239,22 @@ collection :instance_states do
   end
 end
 
+# Special instance get operations that we only allow for HTML
+get "/api/instances/:id/:action" do
+   meth = :"#{params[:action]}_instance"
+   not_found unless driver.respond_to?(meth)
+   respond_to do |format|
+     format.html do
+       driver.send(meth, credentials, params[:id])
+       if ( (params[:action] == 'destroy') or (params[:action] == 'stop') )
+         redirect instances_url
+       else
+         redirect instance_url(params[:id])
+       end
+     end
+   end
+end
+
 get "/api/instances/new" do
   @instance = Instance.new( { :id=>params[:id], :image_id=>params[:image_id] } 
)
   @image   = driver.image( credentials, :id => params[:image_id] )
@@ -197,14 +266,15 @@ get "/api/instances/new" do
 end
 
 def instance_action(name)
-  @instance = driver.send(:"#{name}_instance", credentials, params["id"])
-
-  return redirect(instances_url) if name.eql?(:destroy) or 
@instance.class!=Instance
-
-  respond_to do |format|
-    format.html { haml :"instances/show" }
-    format.xml { haml :"instances/show" }
-    format.json {convert_to_json(:instance, @instance) }
+  @instance = driver.send(:"#{name}_instance", credentials, params[:id])
+  if name==:destroy or name==:stop 
+    redirect instances_url
+  else
+    respond_to do |format|
+      format.html { haml :"instances/show" }
+      format.xml { haml :"instances/show" }
+      format.json {convert_to_json(:instance, @instance) }
+    end
   end
 end
 
diff --git a/server/views/api/show.html.haml b/server/views/api/show.html.haml
index 455e919..19d2af7 100644
--- a/server/views/api/show.html.haml
+++ b/server/views/api/show.html.haml
@@ -4,6 +4,8 @@
 %ul
   - collections.keys.sort_by { |k| k.to_s }.each do |key|
     %li
+      - if key == :access_rules 
+        - next if driver.features(key).empty?
       = link_to key.to_s.gsub('_', ' ').titlecase, url_for("/api/#{key}")
       %dl
         - collections[key].operations.each_key do |op|
-- 
1.6.6.1

_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel

Reply via email to