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 2012/12/13 12:46:14 UTC

[3/4] git commit: Core: Added .to_hash method to all Deltacloud models

Core: Added .to_hash method to all Deltacloud models

* .to_hash produce Ruby Hash that can be converted to JSON
* This patch makes 'crack' library obsolete
* NOTE: This patch might break JSON backward compatibility.


Project: http://git-wip-us.apache.org/repos/asf/deltacloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltacloud/commit/f7b3079e
Tree: http://git-wip-us.apache.org/repos/asf/deltacloud/tree/f7b3079e
Diff: http://git-wip-us.apache.org/repos/asf/deltacloud/diff/f7b3079e

Branch: refs/heads/master
Commit: f7b3079ef48620f5ba9f17075f3d27e61ac70375
Parents: 87c1fb6
Author: Michal Fojtik <mf...@redhat.com>
Authored: Mon Oct 29 20:16:04 2012 +0100
Committer: Michal fojtik <mf...@redhat.com>
Committed: Thu Dec 13 12:45:52 2012 +0100

----------------------------------------------------------------------
 server/deltacloud-core.gemspec                     |    1 -
 server/lib/cimi/server.rb                          |    1 -
 server/lib/deltacloud/collections/addresses.rb     |    2 +-
 server/lib/deltacloud/collections/buckets.rb       |   14 +++---
 server/lib/deltacloud/collections/firewalls.rb     |    4 +-
 server/lib/deltacloud/collections/images.rb        |    2 +-
 server/lib/deltacloud/collections/instances.rb     |    8 +++-
 server/lib/deltacloud/collections/keys.rb          |    2 +-
 .../lib/deltacloud/collections/load_balancers.rb   |    8 ++--
 .../lib/deltacloud/collections/storage_volumes.rb  |    6 +-
 server/lib/deltacloud/helpers/deltacloud_helper.rb |   38 +++++++++-----
 server/lib/deltacloud/models/address.rb            |    9 +++
 server/lib/deltacloud/models/blob.rb               |   12 +++++
 server/lib/deltacloud/models/bucket.rb             |    9 +++
 server/lib/deltacloud/models/firewall.rb           |   14 +++++-
 server/lib/deltacloud/models/firewall_rule.rb      |   14 +++++
 server/lib/deltacloud/models/hardware_profile.rb   |   13 +++++
 server/lib/deltacloud/models/image.rb              |   14 +++++
 server/lib/deltacloud/models/instance.rb           |   39 ++++++++++++++-
 server/lib/deltacloud/models/instance_address.rb   |    9 +++
 server/lib/deltacloud/models/key.rb                |   15 ++++++
 server/lib/deltacloud/models/load_balancer.rb      |   20 ++++++++
 server/lib/deltacloud/models/metric.rb             |   15 ++++++
 server/lib/deltacloud/models/provider.rb           |    8 +++
 server/lib/deltacloud/models/realm.rb              |    8 +++
 server/lib/deltacloud/models/storage_snapshot.rb   |    9 +++
 server/lib/deltacloud/models/storage_volume.rb     |   18 +++++++
 server/lib/deltacloud/server.rb                    |    3 +-
 server/lib/deltacloud_rack.rb                      |    1 -
 server/tests/deltacloud/deltacloud_helper_test.rb  |    4 --
 server/tests/deltacloud/server_test.rb             |    1 +
 31 files changed, 277 insertions(+), 44 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/deltacloud-core.gemspec
----------------------------------------------------------------------
diff --git a/server/deltacloud-core.gemspec b/server/deltacloud-core.gemspec
index ff57683..1c36e2f 100644
--- a/server/deltacloud-core.gemspec
+++ b/server/deltacloud-core.gemspec
@@ -70,7 +70,6 @@ Gem::Specification.new do |s|
   s.add_dependency('haml', '>= 2.2.17')
   s.add_dependency('sinatra', '>= 1.3.0')
   s.add_dependency('sinatra-rabbit', '>= 1.0.11')
-  s.add_dependency('crack')
   s.add_dependency('rack', '>= 1.0.0')
   s.add_dependency('rack-accept')
   s.add_dependency('json', '>= 1.1.9')

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/cimi/server.rb
----------------------------------------------------------------------
diff --git a/server/lib/cimi/server.rb b/server/lib/cimi/server.rb
index 02891c5..41c8bd6 100644
--- a/server/lib/cimi/server.rb
+++ b/server/lib/cimi/server.rb
@@ -14,7 +14,6 @@
 # under the License.
 
 require 'rubygems'
-require 'crack'
 require 'yaml'
 require 'haml'
 require 'sinatra/base'

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/collections/addresses.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/collections/addresses.rb b/server/lib/deltacloud/collections/addresses.rb
index aa51abe..fabbb59 100644
--- a/server/lib/deltacloud/collections/addresses.rb
+++ b/server/lib/deltacloud/collections/addresses.rb
@@ -41,7 +41,7 @@ module Deltacloud::Collections
           respond_to do |format|
             format.xml  { haml :"addresses/show", :ugly => true }
             format.html { haml :"addresses/_address", :layout => false }
-            format.json { xml_to_json("addresses/show") }
+            format.json { JSON::dump(:address => @address.to_hash(self)) }
           end
         end
       end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/collections/buckets.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/collections/buckets.rb b/server/lib/deltacloud/collections/buckets.rb
index 90f2306..eb3830d 100644
--- a/server/lib/deltacloud/collections/buckets.rb
+++ b/server/lib/deltacloud/collections/buckets.rb
@@ -91,7 +91,7 @@ module Deltacloud::Collections
         respond_to do |format|
           format.xml { haml :"blobs/show" }
           format.html { haml :"blobs/show" }
-          format.json { xml_to_json 'blobs/show' }
+          format.json { JSON::dump(:blob => @blob.to_hash(self) ) }
         end
       elsif(env["BLOB_FAIL"])
         report_error(500) #OK?
@@ -110,7 +110,7 @@ module Deltacloud::Collections
         respond_to do |format|
           format.xml { haml :"blobs/show" }
           format.html { haml :"blobs/show" }
-          format.json { xml_to_json 'blobs/show' }
+          format.json { JSON::dump(:blob => @blob.to_hash(self)) }
         end
       end
     end
@@ -129,7 +129,7 @@ module Deltacloud::Collections
           response['Location'] = bucket_url(@bucket.id)
           respond_to do |format|
             format.xml  { haml :"buckets/show" }
-            format.json { xml_to_json('buckets/show') }
+            format.json { JSON::dump(:bucket => @bucket.to_hash(self)) }
             format.html do
               redirect bucket_url(@bucket.id) if @bucket and @bucket.id
               redirect buckets_url
@@ -160,7 +160,7 @@ module Deltacloud::Collections
               respond_to do |format|
                 format.xml { haml :"blobs/show" }
                 format.html { haml :"blobs/show" }
-                format.json { xml_to_json 'blobs/show' }
+                format.json { JSON::dump(:blob => @blob.to_hash(self)) }
               end
             else
               report_error(404)
@@ -194,7 +194,7 @@ module Deltacloud::Collections
             respond_to do |format|
               format.xml { haml :"blobs/show" }
               format.html { haml :"blobs/show"}
-              format.json { xml_to_json 'blobs/show' }
+              format.json { JSON::dump(:blob => @blob.to_hash(self)) }
             end
           end
         end
@@ -227,7 +227,7 @@ module Deltacloud::Collections
               respond_to do |format|
                 format.xml { haml :"blobs/show" }
                 format.html { haml :"blobs/show" }
-                format.json { xml_to_json 'blobs/show' }
+                format.json { JSON::dump(@blob.to_hash(self)) }
               end
             elsif(env["BLOB_FAIL"])
               report_error(500) #OK?
@@ -246,7 +246,7 @@ module Deltacloud::Collections
               respond_to do |format|
                 format.xml { haml :"blobs/show" }
                 format.html { haml :"blobs/show" }
-                format.json { xml_to_json 'blobs/show' }
+                format.json { JSON::dump(@blob.to_hash(self)) }
               end
             end
           end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/collections/firewalls.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/collections/firewalls.rb b/server/lib/deltacloud/collections/firewalls.rb
index 3066c1b..1f35c58 100644
--- a/server/lib/deltacloud/collections/firewalls.rb
+++ b/server/lib/deltacloud/collections/firewalls.rb
@@ -66,7 +66,7 @@ module Deltacloud::Collections
           respond_to do |format|
             format.xml  { haml :"firewalls/show" }
             format.html { haml :"firewalls/show" }
-            format.json { xml_to_json("firewalls/show") }
+            format.json { JSON::dump(:firewall => @firewall.to_hash(self)) }
           end
         end
       end
@@ -109,7 +109,7 @@ module Deltacloud::Collections
           respond_to do |format|
             format.xml  { haml :"firewalls/show" }
             format.html { haml :"firewalls/show" }
-            format.json { xml_to_json("firewalls/show") }
+            format.json { JSON::dump(:firewall => @firewall.to_hash(self) ) }
           end
         end
       end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/collections/images.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/collections/images.rb b/server/lib/deltacloud/collections/images.rb
index 827e5d4..dbdbdfa 100644
--- a/server/lib/deltacloud/collections/images.rb
+++ b/server/lib/deltacloud/collections/images.rb
@@ -50,7 +50,7 @@ module Deltacloud::Collections
           response['Location'] = image_url(@image.id)
           respond_to do |format|
             format.xml  { haml :"images/show" }
-            format.json { xml_to_json('images/show') }
+            format.json { JSON::dump(:image => @image.to_hash(self)) }
             format.html { haml :"images/show" }
           end
         end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/collections/instances.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/collections/instances.rb b/server/lib/deltacloud/collections/instances.rb
index ce536ce..ffdf09d 100644
--- a/server/lib/deltacloud/collections/instances.rb
+++ b/server/lib/deltacloud/collections/instances.rb
@@ -60,7 +60,13 @@ module Deltacloud::Collections
           status 201  # Created
           respond_to do |format|
             format.xml  { haml :"instances/#{action_handler}" }
-            format.json { xml_to_json("instances/#{action_handler}") }
+            format.json do
+              if @elements
+                JSON::dump(:instances => @elements.map { |i| i.to_hash(self) })
+              elsif @instance and @instance.id
+                JSON::dump(:instance => @instance.to_hash(self))
+              end
+            end
             format.html do
               if @elements
                 haml :"instances/index"

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/collections/keys.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/collections/keys.rb b/server/lib/deltacloud/collections/keys.rb
index fa1b3e0..8d5c460 100644
--- a/server/lib/deltacloud/collections/keys.rb
+++ b/server/lib/deltacloud/collections/keys.rb
@@ -42,7 +42,7 @@ module Deltacloud::Collections
           respond_to do |format|
             format.xml  { haml :"keys/show", :ugly => true }
             format.html { haml :"keys/show" }
-            format.json { xml_to_json("keys/show")}
+            format.json { JSON::dump(:key => @key.to_hash(self)) }
           end
         end
       end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/collections/load_balancers.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/collections/load_balancers.rb b/server/lib/deltacloud/collections/load_balancers.rb
index e13ccec..92c7a36 100644
--- a/server/lib/deltacloud/collections/load_balancers.rb
+++ b/server/lib/deltacloud/collections/load_balancers.rb
@@ -41,7 +41,7 @@ module Deltacloud::Collections
           @unregistered_instances = all_instances - @registered_instances
           respond_to do |format|
             format.xml { haml :'load_balancers/show' }
-            format.json { xml_to_json('load_balancers/show') }
+            format.json { JSON::dump(:load_balancer => @load_balancer.to_hash(self)) }
             format.html { haml :'load_balancers/show' }
           end
         end
@@ -59,7 +59,7 @@ module Deltacloud::Collections
           response['Location'] = load_balancer_url(@load_balancer.id)
           respond_to do |format|
             format.xml  { haml :"load_balancers/show" }
-            format.json { xml_to_json("load_balancers/show")}
+            format.json { JSON::dump(:load_balancer => @load_balancer.to_hash(self)) }
             format.html { redirect load_balancer_url(@load_balancer.id)}
           end
         end
@@ -73,7 +73,7 @@ module Deltacloud::Collections
           @load_balancer = driver.load_balancer(credentials, :id => params[:id])
           respond_to do |format|
             format.xml { haml :'load_balancers/show' }
-            format.json { xml_to_json('load_balancers/show') }
+            format.json { JSON::dump(:load_balancer => @load_balancer.to_hash(self) ) }
             format.html { redirect load_balancer_url(@load_balancer.id)}
           end
         end
@@ -87,7 +87,7 @@ module Deltacloud::Collections
           @load_balancer = driver.load_balancer(credentials, :id => params[:id])
           respond_to do |format|
             format.xml { haml :'load_balancers/show' }
-            format.json { xml_to_json('load_balancers/show')}
+            format.json { JSON::dump(:load_balancer => @load_balancer.to_hash(self)) }
             format.html { redirect load_balancer_url(@load_balancer.id) }
           end
         end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/collections/storage_volumes.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/collections/storage_volumes.rb b/server/lib/deltacloud/collections/storage_volumes.rb
index bc505cb..3af8015 100644
--- a/server/lib/deltacloud/collections/storage_volumes.rb
+++ b/server/lib/deltacloud/collections/storage_volumes.rb
@@ -48,7 +48,7 @@ module Deltacloud::Collections
           respond_to do |format|
             format.xml  { haml :"storage_volumes/show" }
             format.html { haml :"storage_volumes/show" }
-            format.json { xml_to_json("storage_volumes/show") }
+            format.json { JSON::dump(:storage_volume => @storage_volume.to_hash(self)) }
           end
         end
       end
@@ -63,7 +63,7 @@ module Deltacloud::Collections
           respond_to do |format|
             format.html { redirect(storage_volume_url(params[:id]))}
             format.xml  { haml :"storage_volumes/show" }
-            format.json { xml_to_json("storage_volumes/show")}
+            format.json { JSON::dump(:storage_volume => @storage_volume.to_hash(self)) }
           end
         end
       end
@@ -79,7 +79,7 @@ module Deltacloud::Collections
           respond_to do |format|
             format.html { redirect(storage_volume_url(params[:id]))}
             format.xml  { haml :"storage_volumes/show" }
-            format.json {  xml_to_json("storage_volumes/show") }
+            format.json { JSON::dump(:storage_volume => @storage_volume.to_hash(self)) }
           end
         end
       end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/helpers/deltacloud_helper.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/helpers/deltacloud_helper.rb b/server/lib/deltacloud/helpers/deltacloud_helper.rb
index 34519c0..b3db12f 100644
--- a/server/lib/deltacloud/helpers/deltacloud_helper.rb
+++ b/server/lib/deltacloud/helpers/deltacloud_helper.rb
@@ -18,6 +18,27 @@ module Deltacloud::Helpers
 
     require 'benchmark'
 
+    def collections_to_json(collections)
+      r = {
+        :version => settings.version,
+        :driver => driver_symbol,
+        :provider => Thread.current[:provider] || ENV['API_PROVIDER'],
+        :links => collections.map { |c|
+          {
+            :rel => c.collection_name,
+            :href => self.send(:"#{c.collection_name}_url"),
+            :features => c.features.select { |f| driver.class.has_feature?(c.collection_name, f.name) }.map { |f|
+              f.operations.map { |o|
+                { :name => f.name, :rel => o.name, :params => o.params_array }
+              }
+            }
+          }
+        }
+      }
+      r[:provider] ||= 'default'
+      JSON::dump(:api => r)
+    end
+
     def request_headers
       env.inject({}){|acc, (k,v)| acc[$1.downcase] = v if k =~ /^http_(.*)/i; acc}
     end
@@ -48,22 +69,13 @@ module Deltacloud::Helpers
         respond_to do |format|
           format.html { haml :"#{model}/index" }
           format.xml { haml :"#{model}/index" }
-          format.json { @media_type=:xml; to_json(haml(:"#{model}/index")) }
+          format.json { JSON::dump({ model => @elements.map { |el| el.to_hash(self) }}) }
         end
       else
         report_error(@exception.respond_to?(:code) ? @exception.code : 500)
       end
     end
 
-    def xml_to_json(model)
-      @media_type = :xml
-      to_json(haml(:"#{model}"))
-    end
-
-    def to_json(xml)
-      Crack::XML.parse(xml).to_json
-    end
-
     def show(model)
       @benchmark = Benchmark.measure do
         @element = driver.send(model, credentials, { :id => params[:id]} )
@@ -74,7 +86,7 @@ module Deltacloud::Helpers
         respond_to do |format|
           format.html { haml :"#{model.to_s.pluralize}/show" }
           format.xml { haml :"#{model.to_s.pluralize}/show" }
-          format.json { @media_type=:xml; to_json(haml(:"#{model.to_s.pluralize}/show")) }
+          format.json { JSON::dump(model => @element.to_hash(self)) }
         end
       else
         report_error(404)
@@ -109,7 +121,7 @@ module Deltacloud::Helpers
 
       respond_to do |format|
         format.xml {  haml :"errors/#{@code || @error.code}", :layout => false }
-        format.json { xml_to_json("errors/#{@code || @error.code}") }
+        format.json { JSON::dump({ :code => @code || @error.code, :message => message, :error => @error.class.name }) }
         format.html {
           begin
             haml :"errors/#{@code || @error.code}", :layout => :error
@@ -151,7 +163,7 @@ module Deltacloud::Helpers
         response = respond_to do |format|
           format.xml { haml :"instances/show" }
           format.html { haml :"instances/show" }
-          format.json { xml_to_json("instances/show") }
+          format.json { JSON::dump(@instance.to_hash(self)) }
         end
         halt 202, response
       end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/address.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/address.rb b/server/lib/deltacloud/models/address.rb
index 7054a77..f91b856 100644
--- a/server/lib/deltacloud/models/address.rb
+++ b/server/lib/deltacloud/models/address.rb
@@ -25,4 +25,13 @@ class Address < BaseModel
     !self.instance_id.nil?
   end
 
+  def to_hash(context)
+    r = {
+      :id => self.id,
+      :associated => associated?
+    }
+    r[:instance_id] = instance_id if associated?
+    r
+  end
+
 end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/blob.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/blob.rb b/server/lib/deltacloud/models/blob.rb
index 7dd08b3..a785d6a 100644
--- a/server/lib/deltacloud/models/blob.rb
+++ b/server/lib/deltacloud/models/blob.rb
@@ -24,4 +24,16 @@ class Blob < BaseModel
   attr_accessor :content
   attr_accessor :user_metadata
 
+  def to_hash(context)
+    {
+      :id => self.id,
+      :bucket => { :rel => :bucket, :href => context.bucket_url(bucket), :id => bucket },
+      :content_length => content_length,
+      :content_type => content_type,
+      :last_modified => last_modified,
+      :content => content,
+      :user_metadata => user_metadata
+    }
+  end
+
 end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/bucket.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/bucket.rb b/server/lib/deltacloud/models/bucket.rb
index 0309628..eab4a69 100644
--- a/server/lib/deltacloud/models/bucket.rb
+++ b/server/lib/deltacloud/models/bucket.rb
@@ -24,4 +24,13 @@ class Bucket < BaseModel
     @blob_list || []
   end
 
+  def to_hash(context)
+    {
+      :id => self.id,
+      :name => name,
+      :size => size,
+      :blob_list => blob_list.map { |b| { :rel => :blob, :href => context.url("/buckets/#{self.id}/#{b}"), :id => b }}
+    }
+  end
+
 end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/firewall.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/firewall.rb b/server/lib/deltacloud/models/firewall.rb
index dc0ae3d..c7003b8 100644
--- a/server/lib/deltacloud/models/firewall.rb
+++ b/server/lib/deltacloud/models/firewall.rb
@@ -19,4 +19,16 @@ class Firewall < BaseModel
   attr_accessor :description
   attr_accessor :owner_id
   attr_accessor :rules
-end
\ No newline at end of file
+
+  def to_hash(context)
+    r = {
+      :id => self.id,
+      :name => name,
+      :description => description,
+      :owner_id => owner_id,
+      :rules => []
+    }
+    r[:rules] = rules.map { |rule| rule.to_hash(context) } if rules and !rules.empty?
+    r
+  end
+end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/firewall_rule.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/firewall_rule.rb b/server/lib/deltacloud/models/firewall_rule.rb
index 32e8085..078cf74 100644
--- a/server/lib/deltacloud/models/firewall_rule.rb
+++ b/server/lib/deltacloud/models/firewall_rule.rb
@@ -22,4 +22,18 @@ class FirewallRule < BaseModel
   attr_accessor :direction #ingress egress
   attr_accessor :rule_action #Accept/Deny - initially added for FGCP
   attr_accessor :log_rule #log when rule triggered true/false - added for FGCP
+
+  def to_hash(context)
+    {
+      :id => self.id,
+      :allow_protocol => allow_protocol,
+      :port_from => port_from,
+      :port_to => port_to,
+      :sources => sources,
+      :direction => direction,
+      :rule_action => rule_action,
+      :log_rule => log_rule
+    }.delete_if { |k, v| v.nil? }
+  end
+
 end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/hardware_profile.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/hardware_profile.rb b/server/lib/deltacloud/models/hardware_profile.rb
index 6b6370b..f2aa937 100644
--- a/server/lib/deltacloud/models/hardware_profile.rb
+++ b/server/lib/deltacloud/models/hardware_profile.rb
@@ -84,6 +84,15 @@ module Deltacloud
       }.compact
     end
 
+    def to_hash(context)
+      r = {
+        :id => self.id,
+        :name => name,
+      }
+      r.merge!({:properties => @properties}) if !@properties.empty?
+      r
+    end
+
     class Property
       attr_reader :name, :kind, :default
       # kind == :range
@@ -112,6 +121,10 @@ module Deltacloud
         @default = opts[:default] if opts[:default]
       end
 
+      def to_s
+        "#{@default}"
+      end
+
       def unit
         HardwareProfile.unit(name)
       end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/image.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/image.rb b/server/lib/deltacloud/models/image.rb
index 6d6bc9b..11e5a22 100644
--- a/server/lib/deltacloud/models/image.rb
+++ b/server/lib/deltacloud/models/image.rb
@@ -25,4 +25,18 @@ class Image < BaseModel
   attr_accessor :hardware_profiles
   attr_accessor :creation_time
 
+  def to_hash(context)
+    {
+      :id => self.id,
+      :name => name,
+      :description => description,
+      :owner_id => owner_id,
+      :architecture => architecture,
+      :state => state,
+      :hardware_profiles => hardware_profiles.map { |p|
+        { :id => p.id, :href => context.hardware_profile_url(p.id), :rel => :hardware_profile }
+      }
+    }
+  end
+
 end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/instance.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/instance.rb b/server/lib/deltacloud/models/instance.rb
index f65b9b8..87bbb1b 100644
--- a/server/lib/deltacloud/models/instance.rb
+++ b/server/lib/deltacloud/models/instance.rb
@@ -38,6 +38,43 @@ class Instance < BaseModel
   attr_accessor :firewalls
   attr_accessor :storage_volumes
 
+  def to_hash(context)
+    r = {
+      :id => self.id,
+      :name => name,
+      :state => state,
+      :image => { :href => context.image_url(image_id), :id => image_id, :rel => :image },
+      :realm => { :href => context.realm_url(realm_id), :id => realm_id, :rel => :realm },
+      :actions => actions.compact.map { |a|
+        {
+          :href => context.send("#{a}_instance_url", self.id),
+          :rel => "#{a}",
+          :method => context.instance_action_method(a)
+        }
+      },
+      :hardware_profile => {
+        :id => instance_profile.id,
+        :href => context.hardware_profile_url(instance_profile.id),
+        :rel => :hardware_profile,
+        :properties => instance_profile.overrides
+      },
+      :public_addresses => public_addresses.map { |addr| addr.to_hash(context) },
+      :private_addresses => private_addresses.map { |addr| addr.to_hash(context) }
+    }
+    r.merge!(:launch_time => launch_time) if !launch_time.nil?
+    r.merge!(:firewalls => firewalls.map { |f| { :id => f.id, :href => context.firewall_url(f.id), :rel => :firewall }}) if firewalls
+    if storage_volumes
+      r.merge!(:storage_volumes => storage_volumes.map { |f| { :id => f.id, :href => context.storage_volume_url(f.id), :rel => :storage_volume }})
+    end
+    if context.driver.class.has_feature?(:instances, :authentication_key)
+      r.merge!(:authentication => { :keyname => keyname }) if keyname
+    end
+    if context.driver.class.has_feature?(:instances, :authentication_password)
+      r.merge!(:authentication => { :user => username, :password => password }) if user
+    end
+    r
+  end
+
   def storage_volumes
     @storage_volumes || []
   end
@@ -51,7 +88,7 @@ class Instance < BaseModel
   end
 
   def hardware_profile=(profile)
-    instance_profile = profile
+    @instance_profile = profile
   end
 
   def initialize(init=nil)

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/instance_address.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/instance_address.rb b/server/lib/deltacloud/models/instance_address.rb
index b5c50e3..b0ea9fc 100644
--- a/server/lib/deltacloud/models/instance_address.rb
+++ b/server/lib/deltacloud/models/instance_address.rb
@@ -37,6 +37,15 @@ class InstanceAddress
     address
   end
 
+  def to_hash(context)
+    r = {
+      :address => address,
+      :type => address_type
+    }
+    r.merge!(:port => port) if !port.nil?
+    r
+  end
+
   def is_mac?
     address_type == :mac
   end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/key.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/key.rb b/server/lib/deltacloud/models/key.rb
index 388c14a..f69ee68 100644
--- a/server/lib/deltacloud/models/key.rb
+++ b/server/lib/deltacloud/models/key.rb
@@ -51,4 +51,19 @@ class Key < BaseModel
     "-----BEGIN RSA PRIVATE KEY-----\n"+pem_material+"-----END RSA PRIVATE KEY-----"
   end
 
+  def to_hash(context)
+    r = {
+      :id => self.id,
+      :credential_type => credential_type,
+      :username => username,
+      :password => password,
+      :state => state
+    }
+    r[:pem_rsa_key] = pem_rsa_key if pem_rsa_key
+    r[:fingerprint] = fingerprint if fingerprint
+    r[:username] = username if username
+    r[:password] = password if password
+    r
+  end
+
 end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/load_balancer.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/load_balancer.rb b/server/lib/deltacloud/models/load_balancer.rb
index a57e00a..dfd6ae0 100644
--- a/server/lib/deltacloud/models/load_balancer.rb
+++ b/server/lib/deltacloud/models/load_balancer.rb
@@ -27,10 +27,30 @@ class LoadBalancer < BaseModel
     @listeners << Listener.new(opts)
   end
 
+  def to_hash(context)
+    {
+      :id => self.id,
+      :realms => realms,
+      :listeners => listeners.map { |l| l.to_hash(context) },
+      :instances => instances.map { |i| i.to_hash(context) },
+      :public_addresses => public_addresses,
+      :created_at => created_at
+    }
+  end
+
   class Listener < BaseModel
     attr_accessor :protocol
     attr_accessor :load_balancer_port
     attr_accessor :instance_port
+
+    def to_hash(context)
+      {
+        :id => self.id,
+        :protocol => protocol,
+        :load_balancer_port => load_balancer_port,
+        :instance_port => instance_port
+      }
+    end
   end
 
 end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/metric.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/metric.rb b/server/lib/deltacloud/models/metric.rb
index f6f3822..05609d3 100644
--- a/server/lib/deltacloud/models/metric.rb
+++ b/server/lib/deltacloud/models/metric.rb
@@ -29,12 +29,27 @@ class Metric < BaseModel
     self
   end
 
+  def to_hash(context)
+    {
+      :id => self.id,
+      :entity => entity,
+      :properties => properties.map { |p| p.to_hash(context) }
+    }
+  end
+
   class Property
     attr_accessor :name, :values
 
     def initialize(name, values=nil)
       @name, @values = name, values
     end
+
+    def to_hash(context)
+      {
+        :name => name,
+        :values => values
+      }
+    end
   end
 
 end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/provider.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/provider.rb b/server/lib/deltacloud/models/provider.rb
index 1fc2c7d..fcbc81d 100644
--- a/server/lib/deltacloud/models/provider.rb
+++ b/server/lib/deltacloud/models/provider.rb
@@ -24,4 +24,12 @@ class Provider < BaseModel
     super(opts)
   end
 
+  def to_hash(context)
+    {
+      :id => self.id,
+      :name => name,
+      :url => url
+    }
+  end
+
 end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/realm.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/realm.rb b/server/lib/deltacloud/models/realm.rb
index cfad348..75bebed 100644
--- a/server/lib/deltacloud/models/realm.rb
+++ b/server/lib/deltacloud/models/realm.rb
@@ -21,4 +21,12 @@ class Realm < BaseModel
   attr_accessor :limit
   attr_accessor :state
 
+  def to_hash(context)
+    {
+      :id => self.id,
+      :name => name,
+      :state => state
+    }
+  end
+
 end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/storage_snapshot.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/storage_snapshot.rb b/server/lib/deltacloud/models/storage_snapshot.rb
index ee7e4b8..6af8d47 100644
--- a/server/lib/deltacloud/models/storage_snapshot.rb
+++ b/server/lib/deltacloud/models/storage_snapshot.rb
@@ -26,4 +26,13 @@ class StorageSnapshot < BaseModel
     state == 'completed'
   end
 
+  def to_hash(context)
+    {
+      :id => self.id,
+      :state => state,
+      :storage_volume => { :id => storage_volume_id, :href => context.storage_volume_url(storage_volume_id), :rel => :storage_volume },
+      :created => created
+    }
+  end
+
 end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/models/storage_volume.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/storage_volume.rb b/server/lib/deltacloud/models/storage_volume.rb
index 7aa00a9..345df11 100644
--- a/server/lib/deltacloud/models/storage_volume.rb
+++ b/server/lib/deltacloud/models/storage_volume.rb
@@ -28,4 +28,22 @@ class StorageVolume < BaseModel
   attr_accessor :kind
   attr_accessor :description # openstack volumes have a display_description attr
 
+  def to_hash(context)
+    r = {
+      :id => self.id,
+      :name => name,
+      :state => state,
+      :created => created,
+      :realm => { :id => realm_id, :href => context.realm_url(realm_id), :rel => :realm },
+      :device => device,
+      :kind => kind,
+    }
+    r[:actions] = actions.map { |a|
+      { :href => context.send("#{a}_storage_volume", self.id), :rel => a }
+    } if actions
+    r[:instance] = { :id => instance_id, :href => context.instance_url(instance_id), :rel => :instance } if instance_id
+    r.delete_if { |k, v| v.nil? }
+    r
+  end
+
 end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud/server.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/server.rb b/server/lib/deltacloud/server.rb
index 7510dba..7c2b7bf 100644
--- a/server/lib/deltacloud/server.rb
+++ b/server/lib/deltacloud/server.rb
@@ -14,7 +14,6 @@
 # under the License.
 
 require 'rubygems'
-require 'crack'
 require 'yaml'
 require 'haml'
 require 'sinatra/base'
@@ -51,7 +50,7 @@ module Deltacloud
       @collections = driver.supported_collections(credentials)
       respond_to do |format|
         format.xml { haml :"api/show" }
-        format.json { xml_to_json :"api/show" }
+        format.json { collections_to_json(@collections) }
         format.html { haml :"api/show" }
       end
     end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/lib/deltacloud_rack.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud_rack.rb b/server/lib/deltacloud_rack.rb
index b918566..8ddcb41 100644
--- a/server/lib/deltacloud_rack.rb
+++ b/server/lib/deltacloud_rack.rb
@@ -72,7 +72,6 @@ module Deltacloud
       respond_to do |format|
         format.xml { haml :'index', :layout => false }
         format.html { haml :'index', :layout => false }
-        format.json { xml_to_json "index" }
       end
     end
   end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/tests/deltacloud/deltacloud_helper_test.rb
----------------------------------------------------------------------
diff --git a/server/tests/deltacloud/deltacloud_helper_test.rb b/server/tests/deltacloud/deltacloud_helper_test.rb
index c0d1d23..095ffc9 100644
--- a/server/tests/deltacloud/deltacloud_helper_test.rb
+++ b/server/tests/deltacloud/deltacloud_helper_test.rb
@@ -27,10 +27,6 @@ describe Deltacloud::Helpers::Application do
     @helper.instance_action_method(:destroy).must_equal :delete
   end
 
-  it 'provide helper to parse from XML to JSON' do
-    @helper.to_json('<xml>1</xml>').must_equal '{"xml":"1"}'
-  end
-
   it 'provide helper for wrapping text nodes with CDATA' do
     @helper.render_cdata('test').must_equal '<![CDATA[test]]>'
     @helper.render_cdata('').must_equal '<![CDATA[]]>'

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/f7b3079e/server/tests/deltacloud/server_test.rb
----------------------------------------------------------------------
diff --git a/server/tests/deltacloud/server_test.rb b/server/tests/deltacloud/server_test.rb
index 0f02272..5a7e660 100644
--- a/server/tests/deltacloud/server_test.rb
+++ b/server/tests/deltacloud/server_test.rb
@@ -120,6 +120,7 @@ describe Deltacloud::API do
     get root_url
     status.must_equal 200
     headers['Content-Type'].must_equal 'application/json'
+    p response_body.inspect
     JSON::parse(response_body).must_be_kind_of Hash
     JSON::parse(response_body)['api'].must_be_kind_of Hash
   end