deltacloud-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mfoj...@redhat.com
Subject [PATCH core 7/7] CIMI: Added database support for managing AddressTemplate
Date Wed, 02 Jan 2013 12:23:57 GMT
From: Michal Fojtik <mfojtik@redhat.com>


Signed-off-by: Michal fojtik <mfojtik@redhat.com>
---
 server/lib/cimi/collections/address_templates.rb | 30 ++++++++-
 server/lib/cimi/models/address_template.rb       | 79 +++++++++++++++++++++++-
 server/support/cimi/address_template.xml         | 12 ++++
 3 files changed, 115 insertions(+), 6 deletions(-)
 create mode 100644 server/support/cimi/address_template.xml

diff --git a/server/lib/cimi/collections/address_templates.rb b/server/lib/cimi/collections/address_templates.rb
index 2b55e63..338d0f4 100644
--- a/server/lib/cimi/collections/address_templates.rb
+++ b/server/lib/cimi/collections/address_templates.rb
@@ -16,11 +16,11 @@
 module CIMI::Collections
   class AddressTemplates < Base
 
-    set :capability, lambda { |m| driver.respond_to? m }
+    set :capability, lambda { |t| true }
 
     collection :address_templates do
 
-      operation :index, :with_capability => :address_templates do
+      operation :index do
         description 'List all AddressTemplates in the AddressTemplateCollection'
         control do
           address_templates = AddressTemplate.list(self).filter_by(params['$select'])
@@ -31,7 +31,7 @@ module CIMI::Collections
         end
       end
 
-      operation :show, :with_capability => :address_templates do
+      operation :show do
         description 'Show a specific AddressTemplate'
         control do
           address_template = CIMI::Model::AddressTemplate.find(params[:id], self)
@@ -42,6 +42,30 @@ module CIMI::Collections
         end
       end
 
+      operation :create do
+        description "Create new AddressTemplate"
+        control do
+          if grab_content_type(request.content_type, request.body) == :json
+            new_address_template = CIMI::Model::AddressTemplate.create_from_json(request.body.read,
self)
+          else
+            new_address_template = CIMI::Model::AddressTemplate.create_from_xml(request.body.read,
self)
+          end
+          headers_for_create new_address_template
+          respond_to do |format|
+            format.json { new_address_template.to_json }
+            format.xml { new_address_template.to_xml }
+          end
+        end
+      end
+
+      operation :destroy do
+        description "Delete a specified machine template"
+        control do
+          CIMI::Model::MachineTemplate.delete!(params[:id], self)
+          no_content_with_status(200)
+        end
+      end
+
     end
 
   end
diff --git a/server/lib/cimi/models/address_template.rb b/server/lib/cimi/models/address_template.rb
index 5ca6850..a1d4789 100644
--- a/server/lib/cimi/models/address_template.rb
+++ b/server/lib/cimi/models/address_template.rb
@@ -39,16 +39,89 @@ class CIMI::Model::AddressTemplate < CIMI::Model::Base
 
   def self.find(id, context)
     if id==:all
-      context.driver.address_templates(context.credentials, {:env=>context})
+      if context.driver.respond_to? :address_templates
+        context.driver.address_templates(context.credentials, {:env=>context})
+      else
+        Deltacloud::Database::AddressTemplate.all(
+          'provider.driver' => driver_symbol.to_s,
+          'provider.url' => current_provider
+        ).map { |t| from_db(t, context) }
+      end
     else
-      context.driver.address_templates(context.credentials, {:id=>id, :env=>context})
+      if context.driver.respond_to? :address_template
+        context.driver.address_template(context.credentials, id, :env=>context)
+      else
+        template = Deltacloud::Database::AddressTemplate.first(
+          'provider.driver' => driver_symbol.to_s,
+          'provider.url' => current_provider,
+          :id => id
+        )
+        raise CIMI::Model::NotFound unless template
+        from_db(template, context)
+      end
     end
   end
 
-  def self.create(request_body, context, type)
+  def self.create_from_json(body, context)
+    json = JSON.parse(body)
+    new_template = current_db.address_templates.new(
+      :name => json['name'],
+      :description => json['description'],
+      :ip => json['ip'],
+      :allocation => json['allocation'],
+      :default_gateway => json['default_gateway'],
+      :dns => json['dns'],
+      :protocol => json['protocol'],
+      :mask => json['mask'],
+      :ent_properties => json['properties'].to_json,
+      :be_kind => 'address_template',
+      :be_id => ''
+    )
+    new_template.save!
+    from_db(new_template, context)
+  end
+
+  def self.create_from_xml(body, context)
+    xml = XmlSimple.xml_in(body)
+    new_template = current_db.address_templates.new(
+      :name => xml['name'].first,
+      :description => xml['description'].first,
+      :ip => xml['ip'].first,
+      :allocation => xml['allocation'].first,
+      :default_gateway => xml['default_gateway'].first,
+      :dns => xml['dns'].first,
+      :protocol => xml['protocol'].nil? ? nil : xml['protocol'].first,
+      :mask => xml['mask'].first,
+      :ent_properties => xml['property'].inject({}) { |r, p| r[p['key']]=p['content'];
r },
+      :be_kind => 'machine_template',
+      :be_id => ''
+    )
+    new_template.save!
+    from_db(new_template, context)
   end
 
   def self.delete!(id, context)
+    current_db.address_templates.first(:id => id).destroy
+  end
+
+  private
+
+  def self.from_db(model, context)
+    self.new(
+      :id => context.address_template_url(model.id),
+      :name => model.name,
+      :description => model.description,
+      :ip => model.ip,
+      :allocation => model.allocation,
+      :default_gateway => model.default_gateway,
+      :dns => model.dns,
+      :protocol => model.protocol,
+      :mask => model.mask,
+      :property => model.ent_properties,
+      :operations => [
+        { :href => context.destroy_address_template_url(model.id), :rel => 'http://schemas.dmtf.org/cimi/1/action/delete'
}
+      ]
+    )
   end
 
 end
diff --git a/server/support/cimi/address_template.xml b/server/support/cimi/address_template.xml
new file mode 100644
index 0000000..6c8d548
--- /dev/null
+++ b/server/support/cimi/address_template.xml
@@ -0,0 +1,12 @@
+<AddressTemplateCreate>
+  <name>myAddressTemplate</name>
+  <ip>10.0.0.1</ip>
+  <allocation>static</allocation>
+  <default_gateway>10.0.0.250</default_gateway>
+  <dns>8.8.8.8</dns>
+  <mask>255.255.255.0</mask>
+  <protocol>ipv4</protocol>
+  <description>A new awesome Address Template</description>
+  <property key="address_template_test">value_address_template</property>
+  <property key="foo">bar</property>
+</AddressTemplateCreate>
-- 
1.8.0.2


Mime
View raw message