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 2012/04/17 15:39:53 UTC

[PATCH core 14/32] Core: Updated drivers to remove base_driver require and added autoloading of driver

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


Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 server/lib/deltacloud/drivers.rb                   |   48 +------
 .../lib/deltacloud/drivers/azure/azure_driver.rb   |    4 -
 .../lib/deltacloud/drivers/condor/condor_driver.rb |    9 +-
 server/lib/deltacloud/drivers/ec2/ec2_driver.rb    |   18 +--
 .../drivers/eucalyptus/eucalyptus_driver.rb        |    4 -
 server/lib/deltacloud/drivers/features.rb          |  111 ++++++++++++++++
 .../lib/deltacloud/drivers/gogrid/gogrid_driver.rb |    6 -
 .../lib/deltacloud/drivers/google/google_driver.rb |    3 -
 server/lib/deltacloud/drivers/mock/mock_client.rb  |   11 --
 server/lib/deltacloud/drivers/mock/mock_driver.rb  |   21 +--
 .../drivers/mock/mock_driver_cimi_methods.rb       |  139 --------------------
 .../drivers/opennebula/opennebula_driver.rb        |    8 +-
 .../drivers/openstack/openstack_driver.rb          |   12 +-
 .../drivers/rackspace/rackspace_driver.rb          |    9 +-
 .../lib/deltacloud/drivers/rhevm/rhevm_driver.rb   |   17 +--
 .../drivers/rimuhosting/rimuhosting_client.rb      |   17 ++-
 .../drivers/rimuhosting/rimuhosting_driver.rb      |   11 +-
 .../drivers/terremark/terremark_driver.rb          |    7 +-
 .../deltacloud/drivers/vsphere/vsphere_driver.rb   |   15 +--
 19 files changed, 160 insertions(+), 310 deletions(-)
 create mode 100644 server/lib/deltacloud/drivers/features.rb

diff --git a/server/lib/deltacloud/drivers.rb b/server/lib/deltacloud/drivers.rb
index dfc998d..14e7ee0 100644
--- a/server/lib/deltacloud/drivers.rb
+++ b/server/lib/deltacloud/drivers.rb
@@ -13,25 +13,15 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-module Deltacloud
+require_relative 'drivers/exceptions'
+require_relative 'drivers/base_driver'
+require_relative 'drivers/features'
+require 'yaml'
 
+module Deltacloud
   module Drivers
 
-    require 'yaml'
-
-    DEFAULT_COLLECTIONS = [
-      :hardware_profiles,
-      :images,
-      :instances,
-      :instance_states,
-      :realms,
-      :storage_volumes,
-      :storage_snapshots
-    ]
-
-    DRIVER=ENV['API_DRIVER'] ? ENV['API_DRIVER'].to_sym : :mock
-
-    def driver_config
+    def self.driver_config
       if Thread::current[:drivers].nil?
         Thread::current[:drivers] = {}
         top_srcdir = File.join(File.dirname(__FILE__), '..', '..')
@@ -42,31 +32,5 @@ module Deltacloud
       Thread::current[:drivers]
     end
 
-    def driver_symbol
-      (Thread.current[:driver] || DRIVER).to_sym
-    end
-
-    def driver_name
-      driver_config[:"#{driver_symbol}"][:name]
-    end
-
-    def driver_class
-      basename = driver_config[:"#{driver_symbol}"][:class] || "#{driver_name}Driver"
-      Deltacloud::Drivers.const_get(driver_name).const_get(basename)
-    end
-
-    def driver_source_name
-      File.join("deltacloud", "drivers", "#{driver_symbol}", "#{driver_symbol}_driver.rb")
-    end
-
-    def driver_mock_source_name
-      return File.join('deltacloud', 'drivers', "#{driver_symbol}",
-		       "#{driver_symbol}_driver.rb") if driver_name.eql? 'Mock'
-    end
-
-    def driver
-      require driver_source_name
-      @driver ||= driver_class.new
-    end
   end
 end
diff --git a/server/lib/deltacloud/drivers/azure/azure_driver.rb b/server/lib/deltacloud/drivers/azure/azure_driver.rb
index 24feeb7..db2b6c6 100644
--- a/server/lib/deltacloud/drivers/azure/azure_driver.rb
+++ b/server/lib/deltacloud/drivers/azure/azure_driver.rb
@@ -15,7 +15,6 @@
 # under the License.
 
 #Windows Azure (WAZ) gem at http://github.com/johnnyhalife/waz-storage
-require 'deltacloud/base_driver'
 require 'waz-blobs'
 
 module Deltacloud
@@ -24,9 +23,6 @@ module Deltacloud
 
 class AzureDriver < Deltacloud::BaseDriver
 
-  def supported_collections; [:buckets]
-  end
-
 #--
 # Buckets
 #--
diff --git a/server/lib/deltacloud/drivers/condor/condor_driver.rb b/server/lib/deltacloud/drivers/condor/condor_driver.rb
index f5cb741..c139b62 100644
--- a/server/lib/deltacloud/drivers/condor/condor_driver.rb
+++ b/server/lib/deltacloud/drivers/condor/condor_driver.rb
@@ -14,9 +14,6 @@
 # under the License.
 #
 
-require 'deltacloud/base_driver'
-
-
 class Instance
   def self.convert_condor_state(state_id)
     case state_id
@@ -44,10 +41,6 @@ module Deltacloud
         feature :instances, :user_data
         feature :instances, :authentication_password
 
-        def supported_collections
-          DEFAULT_COLLECTIONS - [ :storage_volumes, :storage_snapshots ]
-        end
-
         CONDOR_MAPPER_DIR = ENV['CONDOR_MAPPER_DIR'] || '/var/tmp'
 
         def hardware_profiles(credentials, opts={})
@@ -175,7 +168,7 @@ module Deltacloud
           pending.to( :running )        .automatically
           pending.to( :finish )         .on(:destroy)
           running.to( :running )        .on( :reboot )
-          running.to( :stopping )       .on( :destroy )
+          running.to( :shutting_down )  .on( :destroy )
           pending.to( :finish )         .automatically
         end
 
diff --git a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
index 60e86e8..01b76b4 100644
--- a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
+++ b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
@@ -14,7 +14,6 @@
 # under the License.
 #
 
-require 'deltacloud/base_driver'
 require 'aws'
 
 class Instance
@@ -29,13 +28,8 @@ end
 
 module Deltacloud
   module Drivers
-    module EC2
-      class EC2Driver < Deltacloud::BaseDriver
-
-        def supported_collections
-
-          DEFAULT_COLLECTIONS + [ :keys, :buckets, :load_balancers, :addresses, :firewalls ]
-        end
+    module Ec2
+      class Ec2Driver < Deltacloud::BaseDriver
 
         feature :instances, :user_data
         feature :instances, :authentication_key
@@ -127,8 +121,7 @@ module Deltacloud
           stopped.to( :running )        .on( :start )
           running.to( :running )        .on( :reboot )
           running.to( :stopping )       .on( :stop )
-          stopping.to(:stopped)         .automatically
-          stopping.to(:finish)          .automatically
+          shutting_down.to( :stopped )  .automatically
           stopped.to( :finish )         .automatically
         end
 
@@ -413,9 +406,7 @@ module Deltacloud
           safely do
             s3_bucket = s3_client.bucket(opts['bucket'])
             if(opts[:id])
-              s3_key = s3_bucket.key(opts[:id], true)
-              raise "Blob #{opts[:id]} in Bucket #{opts['bucket']} NotFound" unless s3_key.exists?
-              blobs << convert_object(s3_key)
+              blobs << convert_object(s3_bucket.key(opts[:id], true))
             else
               s3_bucket.keys({}, true).each do |s3_object|
                 blobs << convert_object(s3_object)
@@ -471,7 +462,6 @@ module Deltacloud
           blob_meta = {}
           safely do
             the_blob = s3_client.bucket(opts['bucket']).key(opts[:id], true)
-            raise "Blob #{opts[:id]} in Bucket #{opts['bucket']} NotFound" unless the_blob.exists?
             blob_meta = the_blob.meta_headers
           end
         end
diff --git a/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb b/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb
index 2270178..54c1eed 100644
--- a/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb
+++ b/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb
@@ -21,10 +21,6 @@ module Deltacloud
     module Eucalyptus
       class EucalyptusDriver < EC2::EC2Driver
 
-        def supported_collections
-          DEFAULT_COLLECTIONS + [ :keys, :buckets, :addresses, :firewalls ]
-        end
-
         feature :instances, :user_data
         feature :instances, :authentication_key
         feature :instances, :firewalls
diff --git a/server/lib/deltacloud/drivers/features.rb b/server/lib/deltacloud/drivers/features.rb
new file mode 100644
index 0000000..01d8656
--- /dev/null
+++ b/server/lib/deltacloud/drivers/features.rb
@@ -0,0 +1,111 @@
+# 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.
+
+module Deltacloud
+  module InstanceFeatures
+
+    def self.included(k)
+      current_features = features
+      k.instance_eval do
+        features(&current_features)
+      end
+    end
+
+    def self.features(&block)
+      block_given? ? @features = block : @features || Proc.new{}
+    end
+
+    features do
+
+      feature :user_name, :for => :instances do
+        description "Allow to set user-defined name for the instance"
+        operation :create do
+          param :name, :string, :optional
+        end
+      end
+
+      feature :user_data, :for => :instances do
+        description "Allow to pass user-defined data into the instance"
+        operation :create do
+          param :user_data, :string, :optional
+        end
+      end
+
+      feature :user_iso, :for => :instances do
+        description  "Base64 encoded gzipped ISO file will be accessible as CD-ROM drive in instance"
+        operation :create do
+          param :user_iso, :string, :optional
+        end
+      end
+
+      feature :firewalls, :for => :instances do
+        description "Put instance in one or more firewalls (security groups) on launch"
+        operation :create do
+          param :firewalls, :array, :optional, nil, "Array of firewall ID strings"
+          "Array of firewall (security group) id"
+        end
+      end
+
+      feature :authentication_key, :for => :instances do
+        operation :create do
+          param :keyname, :string,  :optional, [], "Key authentification method"
+        end
+        operation :show do
+        end
+      end
+
+      feature :authentication_password, :for => :instances do
+        operation :create do
+          param :password, :string, :optional
+        end
+      end
+
+      feature :hardware_profiles, :for => :instances do
+        description "Size instances according to changes to a hardware profile"
+        # The parameters are filled in from the hardware profiles
+      end
+
+      feature :register_to_load_balancer, :for => :instances do
+        description "Register instance to load balancer"
+        operation :create do
+          param :load_balancer_id, :string, :optional
+        end
+      end
+
+      feature :instance_count, :for => :instances do
+        description "Number of instances to be launch with at once"
+        operation :create do
+          param :instance_count,  :string,  :optional
+        end
+      end
+
+      feature :attach_snapshot, :for => :instances do
+        description "Attach an snapshot to instance on create"
+        operation :create do
+          param :snapshot_id,  :string,  :optional
+          param :device_name,  :string,  :optional
+        end
+      end
+
+      feature :sandboxing, :for => :instances do
+        description "Allow lanuching sandbox images"
+        operation :create do
+          param :sandbox, :string,  :optional
+        end
+      end
+    end
+
+  end
+end
diff --git a/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb b/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
index 285f58f..2a83c24 100644
--- a/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
+++ b/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
@@ -14,7 +14,6 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-require 'deltacloud/base_driver'
 require 'deltacloud/drivers/gogrid/gogrid_client'
 
 class Instance
@@ -61,11 +60,6 @@ class GogridDriver < Deltacloud::BaseDriver
     @hardware_profiles
   end
 
-  def supported_collections
-    DEFAULT_COLLECTIONS.reject! { |c| [ :storage_volumes, :storage_snapshots ].include?(c) }
-    DEFAULT_COLLECTIONS + [ :keys, :load_balancers ]
-  end
-
   def images(credentials, opts=nil)
     imgs = []
     if opts and opts[:id]
diff --git a/server/lib/deltacloud/drivers/google/google_driver.rb b/server/lib/deltacloud/drivers/google/google_driver.rb
index 2ffb5f8..8bc6f25 100644
--- a/server/lib/deltacloud/drivers/google/google_driver.rb
+++ b/server/lib/deltacloud/drivers/google/google_driver.rb
@@ -21,9 +21,6 @@ module Deltacloud
 
 class GoogleDriver < Deltacloud::BaseDriver
 
-  def supported_collections; [:buckets]
-  end
-
   feature :buckets, :bucket_location
 
 #--
diff --git a/server/lib/deltacloud/drivers/mock/mock_client.rb b/server/lib/deltacloud/drivers/mock/mock_client.rb
index 94c56af..248cc49 100644
--- a/server/lib/deltacloud/drivers/mock/mock_client.rb
+++ b/server/lib/deltacloud/drivers/mock/mock_client.rb
@@ -91,17 +91,6 @@ module Deltacloud::Drivers::Mock
       FileUtils.rm(fname) if File::exists?(fname)
     end
 
-    def store_cimi(collection, obj)
-      raise "Why no obj.name?" unless obj.name
-      File::open(cimi_file(collection, obj.name), "w") { |f| f.write(obj.to_json) }
-    end
-
-    def destroy_cimi(collection, id)
-      fname = cimi_file(collection, id)
-      raise "No such object: #{id} in #{collection} collection" unless File::exists?(fname)
-      FileUtils.rm(fname)
-    end
-
     def load_all_cimi(model_name)
         model_files = Dir[File::join(cimi_dir(model_name), "*.json")]
         model_files.map{|f| File.read(f)}
diff --git a/server/lib/deltacloud/drivers/mock/mock_driver.rb b/server/lib/deltacloud/drivers/mock/mock_driver.rb
index b58872c..15f06fb 100644
--- a/server/lib/deltacloud/drivers/mock/mock_driver.rb
+++ b/server/lib/deltacloud/drivers/mock/mock_driver.rb
@@ -14,28 +14,16 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-
 require 'yaml'
 require 'base64'
 require 'etc'
-require 'deltacloud/base_driver'
-require 'deltacloud/drivers/mock/mock_client'
-require 'deltacloud/drivers/mock/mock_driver_cimi_methods'
+require_relative 'mock_client'
+require_relative 'mock_driver_cimi_methods'
 
 module Deltacloud::Drivers::Mock
 
   class MockDriver < Deltacloud::BaseDriver
 
-    # If the provider is set to storage, pretend to be a storage-only
-    # driver
-    def supported_collections
-      if api_provider == 'storage'
-        [:buckets]
-      else
-        DEFAULT_COLLECTIONS + [:buckets, :keys]
-      end
-    end
-
     ( REALMS = [
       Realm.new({
         :id=>'us',
@@ -299,11 +287,6 @@ module Deltacloud::Drivers::Mock
       snapshots
     end
 
-    def destroy_storage_snapshot(credentials, opts={})
-      check_credentials(credentials)
-      @client.destroy(:storage_snapshots, opts[:id])
-    end
-
     def keys(credentials, opts={})
       check_credentials(credentials)
       result = @client.build_all(Key)
diff --git a/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb b/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
index 2dec66b..bebc45c 100644
--- a/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
+++ b/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
@@ -32,49 +32,6 @@ module Deltacloud::Drivers::Mock
       end
     end
 
-    def create_network(credentials, opts={})
-      check_credentials(credentials)
-      id = "#{opts[:env].send("networks_url")}/#{opts[:name]}"
-      net_hsh = { "id"=> id,
-                  "name" => opts[:name],
-                  "description" => opts[:description],
-                  "created" => Time.now,
-                  "state" => "STARTED",
-                  "access" => opts[:network_config].access,
-                  "bandwithLimit" => opts[:network_config].bandwidth_limit,
-                  "trafficPriority" => opts[:network_config].traffic_priority,
-                  "maxTrafficDelay" => opts[:network_config].max_traffic_delay,
-                  "maxTrafficLoss" =>opts[:network_config].max_traffic_loss,
-                  "maxTrafficJitter" =>opts[:network_config].max_traffic_jitter,
-                  "routingGroup"=> { "href" => opts[:routing_group].id },
-                  "operations" => [{"rel"=>"edit", "href"=> id},
-                                   {"rel"=>"delete", "href"=> id}]    }
-      network = CIMI::Model::Network.from_json(JSON.generate(net_hsh))
-
-      @client.store_cimi(:network, network)
-      network
-    end
-
-    def delete_network(credentials, id)
-      check_credentials(credentials)
-      @client.destroy_cimi(:network, id)
-    end
-
-    def start_network(credentials, id)
-      check_credentials(credentials)
-      update_object_state(id, "Network", "STARTED")
-    end
-
-    def stop_network(credentials, id)
-      check_credentials(credentials)
-      update_object_state(id, "Network", "STOPPED")
-    end
-
-    def suspend_network(credentials, id)
-      check_credentials(credentials)
-      update_object_state(id, "Network", "SUSPENDED")
-    end
-
     def network_configurations(credentials, opts={})
       check_credentials(credentials)
       if opts[:id].nil?
@@ -130,43 +87,6 @@ module Deltacloud::Drivers::Mock
       end
     end
 
-    def create_vsp(credentials, opts={})
-      check_credentials(credentials)
-      id = "#{opts[:env].send("vsps_url")}/#{opts[:name]}"
-      vsp_hash = { "id"    => id,
-                    "name"  => opts[:name],
-                    "description" => opts[:description],
-                    "state" => "STARTED",
-                    "created" => Time.now,
-                    "bandwidthReservation"=>opts[:vsp_config].bandwidth_reservation,
-                    "trafficPriority"=>opts[:vsp_config].traffic_priority,
-                    "maxTrafficDelay"=>opts[:vsp_config].max_traffic_delay,
-                    "maxTrafficLoss"=>opts[:vsp_config].max_traffic_loss,
-                    "maxTrafficJitter"=>opts[:vsp_config].max_traffic_jitter,
-                    "network" => {"href" => opts[:network].id},
-                    "operations" => [{"rel"=>"edit", "href"=> id},
-                                     {"rel"=>"delete", "href"=> id}]
-                   }
-      vsp = CIMI::Model::VSP.from_json(JSON.generate(vsp_hash))
-      @client.store_cimi(:vsp, vsp)
-      vsp
-    end
-
-    def start_vsp(credentials, id)
-      check_credentials(credentials)
-      update_object_state(id, "VSP", "STARTED")
-    end
-
-    def stop_vsp(credentials, id)
-      check_credentials(credentials)
-      update_object_state(id, "VSP", "STOPPED")
-    end
-
-    def delete_vsp(credentials, id)
-      check_credentials(credentials)
-      @client.destroy_cimi(:vsp, id)
-    end
-
     def vsp_configurations(credentials, opts={})
       check_credentials(credentials)
       if opts[:id].nil?
@@ -189,56 +109,6 @@ module Deltacloud::Drivers::Mock
       end
     end
 
-    def addresses(credentials, opts={})
-      check_credentials(credentials)
-      if opts[:id].nil?
-        addresses = @client.load_all_cimi(:address).map{|addr| CIMI::Model::Address.from_json(addr)}
-        addresses.map{|addr|convert_cimi_mock_urls(:address, addr, opts[:env])}.flatten
-      else
-        address = CIMI::Model::Address.from_json(@client.load_cimi(:address, opts[:id]))
-        convert_cimi_mock_urls(:address, address, opts[:env])
-      end
-    end
-
-    def create_address(credentials, opts={})
-      check_credentials(credentials)
-      id = "#{opts[:env].send("addresses_url")}/#{opts[:name]}"
-      addr_hash = { "id"    => id,
-                    "name"  => opts[:name],
-                    "description" => opts[:description],
-                    "created" => Time.now,
-                    "hostName" => opts[:address_template].hostname,
-                    "allocation" => opts[:address_template].allocation,
-                    "defaultGateway" => opts[:address_template].default_gateway,
-                    "dns" => opts[:address_template].dns,
-                    "macAddress" => opts[:address_template].mac_address,
-                    "protocol" => opts[:address_template].protocol,
-                    "mask" => opts[:address_template].mask,
-                    "network" => {"href" => opts[:address_template].network.href},
-                    "operations" => [{"rel"=>"edit", "href"=> id},
-                                     {"rel"=>"delete", "href"=> id}]
-                   }
-      address = CIMI::Model::Address.from_json(JSON.generate(addr_hash))
-      @client.store_cimi(:address, address)
-      address
-    end
-
-    def delete_address(credentials, id)
-      check_credentials(credentials)
-      @client.destroy_cimi(:address, id)
-    end
-
-    def address_templates(credentials, opts={})
-      check_credentials(credentials)
-      if opts[:id].nil?
-        address_templates = @client.load_all_cimi(:address_template).map{|addr_templ| CIMI::Model::AddressTemplate.from_json(addr_templ)}
-        address_templates.map{|addr_templ|convert_cimi_mock_urls(:address_template, addr_templ, opts[:env])}.flatten
-      else
-        address_template = CIMI::Model::AddressTemplate.from_json(@client.load_cimi(:address_template, opts[:id]))
-        convert_cimi_mock_urls(:address_template, address_template, opts[:env])
-      end
-    end
-
     private
 
     def convert_cimi_mock_urls(model_name, cimi_object, context)
@@ -270,15 +140,6 @@ module Deltacloud::Drivers::Mock
       end
     end
 
-    def update_object_state(id, object, new_state)
-      klass = CIMI::Model.const_get("#{object}")
-      symbol = object.to_s.downcase.singularize.intern
-      obj = klass.from_json(@client.load_cimi(symbol, id))
-      obj.state = new_state
-      @client.store_cimi(symbol, obj)
-      obj
-    end
-
   end
 
 end
diff --git a/server/lib/deltacloud/drivers/opennebula/opennebula_driver.rb b/server/lib/deltacloud/drivers/opennebula/opennebula_driver.rb
index 371e170..03c337f 100644
--- a/server/lib/deltacloud/drivers/opennebula/opennebula_driver.rb
+++ b/server/lib/deltacloud/drivers/opennebula/opennebula_driver.rb
@@ -28,10 +28,6 @@ module Deltacloud
 
 class OpennebulaDriver < Deltacloud::BaseDriver
 
-  def supported_collections
-    DEFAULT_COLLECTIONS - [:storage_volumes, :storage_snapshots]
-  end
-
   ######################################################################
   # Hardware profiles
   #####################################################################
@@ -152,8 +148,8 @@ class OpennebulaDriver < Deltacloud::BaseDriver
     running.to(:running)        .on( :reboot )
     running.to(:stopping)       .on( :stop )
     stopping.to(:stopped)       .automatically
-    running.to(:stopping)       .on( :destroy )
-    stopping.to(:finish)        .automatically
+    running.to(:shutting_down)  .on( :destroy )
+    shutting_down.to(:finish)   .automatically
   end
 
   def instances(credentials, opts=nil)
diff --git a/server/lib/deltacloud/drivers/openstack/openstack_driver.rb b/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
index c9ec95b..5d54d5b 100644
--- a/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
+++ b/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
@@ -14,9 +14,9 @@
 # under the License.
 #
 
-require 'deltacloud/base_driver'
 require 'openstack/compute'
 require 'tempfile'
+
 module Deltacloud
   module Drivers
     module Openstack
@@ -27,16 +27,12 @@ module Deltacloud
         feature :instances, :user_files
         feature :images, :user_name
 
-        def supported_collections
-          DEFAULT_COLLECTIONS - [ :storage_snapshots, :storage_volumes  ] #+ [ :buckets ]
-        end
-
         define_instance_states do
           start.to( :pending )          .on( :create )
           pending.to( :running )        .automatically
           running.to( :running )        .on( :reboot )
-          running.to( :stopping )       .on( :stop )
-          stopping.to( :stopped )       .automatically
+          running.to( :shutting_down )  .on( :stop )
+          shutting_down.to( :stopped )  .automatically
           stopped.to( :finish )         .automatically
         end
 
@@ -140,7 +136,7 @@ module Deltacloud
           params[:name] = (opts[:name] && opts[:name].length>0)? opts[:name] : Time.now.to_s
           params[:imageRef] = image_id
           params[:flavorRef] =  (opts[:hwp_id] && opts[:hwp_id].length>0) ?
-                          opts[:hwp_id] : hardware_profiles(credentials).first.name
+                          opts[:hwp_id] : hardware_profiles(credentials).first
           if opts[:password] && opts[:password].length > 0
             params[:adminPass]=opts[:password]
           end
diff --git a/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb b/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
index 1b019d4..f59f832 100644
--- a/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
+++ b/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
@@ -14,7 +14,6 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-require 'deltacloud/base_driver'
 require 'cloudfiles'
 require 'cloudservers'
 require 'base64'
@@ -30,10 +29,6 @@ class RackspaceDriver < Deltacloud::BaseDriver
   feature :instances, :user_files
   feature :images, :user_name
 
-  def supported_collections
-    DEFAULT_COLLECTIONS + [ :buckets ] - [ :storage_snapshots, :storage_volumes ]
-  end
-
   def hardware_profiles(credentials, opts = {})
     rs = new_client( credentials )
     results = []
@@ -194,8 +189,8 @@ class RackspaceDriver < Deltacloud::BaseDriver
     start.to( :pending )          .on( :create )
     pending.to( :running )        .automatically
     running.to( :running )        .on( :reboot )
-    running.to( :stopping )       .on( :stop )
-    stopping.to( :stopped )       .automatically
+    running.to( :shutting_down )  .on( :stop )
+    shutting_down.to( :stopped )  .automatically
     stopped.to( :finish )         .automatically
   end
 
diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
index 1c96df7..f138f03 100644
--- a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
+++ b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
@@ -14,27 +14,24 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-require 'deltacloud/base_driver'
 require 'rbovirt'
 
 module Deltacloud
   module Drivers
-    module RHEVM
+    module Rhevm
 
-class RHEVMDriver < Deltacloud::BaseDriver
+class RhevmDriver < Deltacloud::BaseDriver
 
-  def supported_collections
-    DEFAULT_COLLECTIONS - [:storage_snapshots]
-  end
-
-  feature :instances, :user_name do
-    constraint :max_length, 50
+  Sinatra::Rabbit::InstancesCollection.features do
+    feature :user_name, :for => :instances do
+      constrain :max_length, 50
+    end
   end
 
   feature :instances, :user_data
   feature :images, :user_name
 
-  USER_NAME_MAX = feature(:instances, :user_name).constraints[:max_length]
+  USER_NAME_MAX = Sinatra::Rabbit::InstancesCollection.feature(:user_name).constraints[:max_length]
 
   # FIXME: These values are just for ilustration
   # Also I choosed 'SERVER' and 'DESKTOP' names
diff --git a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
index 58f8e1b..f44336a 100644
--- a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
+++ b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
@@ -41,17 +41,16 @@ class RimuHostingClient
       headers["Authorization"] = @auth
     end
     safely do
-      r = @service.send_request(method, @uri.path + resource, data, headers)
-          puts r.body
-      res = JSON.parse(r.body)
-      res = res[res.keys[0]]
+    r = @service.send_request(method, @uri.path + resource, data, headers)
+         puts r.body
+    res = JSON.parse(r.body)
+    res = res[res.keys[0]]
 
-      if(res['response_type'] == "ERROR" and ( (res['error_info']['error_class'] == "PermissionException") or
+    if(res['response_type'] == "ERROR" and ( (res['error_info']['error_class'] == "PermissionException") or
 					     (res['error_info']['error_class'] == "LoginRequired") ))
-        raise "AuthFailure"
-      end
-      res
+      raise "AuthFailure"
     end
+    res
   end
 
   def list_images
@@ -82,6 +81,6 @@ class RimuHostingClient
   end
 end
 
+    end
   end
 end
-end
diff --git a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
index 67c415c..8633d53 100644
--- a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
+++ b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
@@ -16,7 +16,6 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-require "deltacloud/base_driver"
 require "deltacloud/drivers/rimuhosting/rimuhosting_client"
 
 module Deltacloud
@@ -131,9 +130,9 @@ class RimuHostingDriver < Deltacloud::BaseDriver
             :owner_id => "root",
             :instance_profile => InstanceProfile.new("none"),
             :actions => instance_actions_for("RUNNING"),
-            :public_addresses => [ InstanceAddress.new(inst["allocated_ips"]["primary_ip"] ) ],
-            :launch_time => inst["billing_info"]["order_date"]["iso_format"]
-    })
+            :public_addresses => [ InstanceAddress.new(inst["allocated_ips"]["primary_ip"] )],
+            :launch_time => inst["billing_info"]["order_date"]["iso_format"]}
+                )
   end
 
   define_instance_states do
@@ -142,9 +141,9 @@ class RimuHostingDriver < Deltacloud::BaseDriver
     pending.to( :running )        .automatically
 
     running.to( :running )        .on(:reboot)
-    running.to( :stopping )       .on(:stop)
+    running.to( :shutting_down )  .on(:stop)
 
-    stopping.to( :stopped )       .automatically
+    shutting_down.to( :stopped )  .automatically
 
     stopped.to( :finish )         .automatically
   end
diff --git a/server/lib/deltacloud/drivers/terremark/terremark_driver.rb b/server/lib/deltacloud/drivers/terremark/terremark_driver.rb
index 2dba02a..2e087cb 100644
--- a/server/lib/deltacloud/drivers/terremark/terremark_driver.rb
+++ b/server/lib/deltacloud/drivers/terremark/terremark_driver.rb
@@ -19,8 +19,7 @@
 # https://community.vcloudexpress.terremark.com/en-us/product_docs/w/wiki/d-complete-vcloud-express-api-document.aspx
 #
 # 02 May 2010
-#
-require 'deltacloud/base_driver'
+
 require 'fog'
 require 'excon'
 require 'nokogiri'
@@ -118,8 +117,8 @@ VAPP_STATE_MAP = { "0" =>  "PENDING", "1" =>  "PENDING", "2" =>  "STOPPED", "4"
     pending.to(:stopped)          .automatically
     stopped.to(:running)          .on( :start )
     running.to(:running)          .on( :reboot )
-    running.to(:stopping)         .on( :stop )
-    stopping.to(:stopped)         .automatically
+    running.to(:shutting_down)    .on( :stop )
+    shutting_down.to(:stopped)    .automatically
     stopped.to(:finish)           .on( :destroy )
    end
 
diff --git a/server/lib/deltacloud/drivers/vsphere/vsphere_driver.rb b/server/lib/deltacloud/drivers/vsphere/vsphere_driver.rb
index e16be2f..7ac908a 100644
--- a/server/lib/deltacloud/drivers/vsphere/vsphere_driver.rb
+++ b/server/lib/deltacloud/drivers/vsphere/vsphere_driver.rb
@@ -14,18 +14,17 @@
 # under the License.
 #
 
-require 'deltacloud/base_driver'
 require 'rbvmomi'
 require 'deltacloud/drivers/vsphere/vsphere_client'
 
-module Deltacloud::Drivers::VSphere
+module Deltacloud::Drivers::Vsphere
 
   MAPPER_STORAGE_ROOT = File::join("/var/tmp", "deltacloud-vsphere-#{ENV["USER"]}")
 
-  class VSphereDriver < Deltacloud::BaseDriver
+  class VsphereDriver < Deltacloud::BaseDriver
 
     include Deltacloud::Drivers::VSphere::Helper
-    include Deltacloud::Drivers::VSphere::FileManager
+    include VSphere::FileManager
 
     # You can use 'user_iso' feature to set 'user_iso' parameter when creating
     # a new instance where this parameter can hold gzipped CDROM iso which will
@@ -34,10 +33,6 @@ module Deltacloud::Drivers::VSphere
     feature :instances, :user_data
     feature :instances, :user_name
 
-    def supported_collections
-      DEFAULT_COLLECTIONS - [:storage_volumes, :storage_snapshots]
-    end
-
     # There is just one hardware profile where memory is measured using maximum
     # memory available on ESX for virtual machines and CPU using maximum free
     # CPU cores in ESX.
@@ -68,8 +63,8 @@ module Deltacloud::Drivers::VSphere
       pending.to(:stopped)        .automatically
       stopped.to(:running)        .on( :start )
       running.to(:running)        .on( :reboot )
-      running.to(:stopping)       .on( :stop )
-      stopping.to(:stopped)       .automatically
+      running.to(:shutting_down)  .on( :stop )
+      shutting_down.to(:stopped)  .automatically
       stopped.to(:finish)         .on( :destroy )
     end
 
-- 
1.7.10


Re: [PATCH core 14/32] Core: Updated drivers to remove base_driver require and added autoloading of driver

Posted by Michal Fojtik <mf...@redhat.com>.
On 04/18/12, Koper, Dies wrote:
> Hi Michal,
> 
> > -          running.to( :stopping )       .on( :destroy )
> > +          running.to( :shutting_down )  .on( :destroy )
> 
> In commit 09bfd939db278978d87539534ceda3465737acc3 David changed this
> state to be consistently :stopping.
> Does this mean we're reverting that and change the state consistently to
> :shutting_down?

Good catch Dies, thanks for this. When I forked DC I must miss this update.
I'll remove this state as David did before pushing. (/note added ;-)

  -- Michal


> 
> Cheers,
> Dies Koper
> 
> 
> 
> > -----Original Message-----
> > From: mfojtik@redhat.com [mailto:mfojtik@redhat.com]
> > Sent: Tuesday, 17 April 2012 11:40 PM
> > To: dev@deltacloud.apache.org
> > Subject: [PATCH core 14/32] Core: Updated drivers to remove
> base_driver
> > require and added autoloading of driver
> > 
> > From: Michal Fojtik <mf...@redhat.com>
> > 
> > 
> > Signed-off-by: Michal fojtik <mf...@redhat.com>
> > ---
> >  server/lib/deltacloud/drivers.rb                   |   48 +------
> >  .../lib/deltacloud/drivers/azure/azure_driver.rb   |    4 -
> >  .../lib/deltacloud/drivers/condor/condor_driver.rb |    9 +-
> >  server/lib/deltacloud/drivers/ec2/ec2_driver.rb    |   18 +--
> >  .../drivers/eucalyptus/eucalyptus_driver.rb        |    4 -
> >  server/lib/deltacloud/drivers/features.rb          |  111
> ++++++++++++++++
> >  .../lib/deltacloud/drivers/gogrid/gogrid_driver.rb |    6 -
> >  .../lib/deltacloud/drivers/google/google_driver.rb |    3 -
> >  server/lib/deltacloud/drivers/mock/mock_client.rb  |   11 --
> >  server/lib/deltacloud/drivers/mock/mock_driver.rb  |   21 +--
> >  .../drivers/mock/mock_driver_cimi_methods.rb       |  139
> --------------------
> >  .../drivers/opennebula/opennebula_driver.rb        |    8 +-
> >  .../drivers/openstack/openstack_driver.rb          |   12 +-
> >  .../drivers/rackspace/rackspace_driver.rb          |    9 +-
> >  .../lib/deltacloud/drivers/rhevm/rhevm_driver.rb   |   17 +--
> >  .../drivers/rimuhosting/rimuhosting_client.rb      |   17 ++-
> >  .../drivers/rimuhosting/rimuhosting_driver.rb      |   11 +-
> >  .../drivers/terremark/terremark_driver.rb          |    7 +-
> >  .../deltacloud/drivers/vsphere/vsphere_driver.rb   |   15 +--
> >  19 files changed, 160 insertions(+), 310 deletions(-)
> >  create mode 100644 server/lib/deltacloud/drivers/features.rb
> > 
> > diff --git a/server/lib/deltacloud/drivers.rb
> > b/server/lib/deltacloud/drivers.rb
> > index dfc998d..14e7ee0 100644
> > --- a/server/lib/deltacloud/drivers.rb
> > +++ b/server/lib/deltacloud/drivers.rb
> > @@ -13,25 +13,15 @@
> >  # License for the specific language governing permissions and
> limitations
> >  # under the License.
> > 
> > -module Deltacloud
> > +require_relative 'drivers/exceptions'
> > +require_relative 'drivers/base_driver'
> > +require_relative 'drivers/features'
> > +require 'yaml'
> > 
> > +module Deltacloud
> >    module Drivers
> > 
> > -    require 'yaml'
> > -
> > -    DEFAULT_COLLECTIONS = [
> > -      :hardware_profiles,
> > -      :images,
> > -      :instances,
> > -      :instance_states,
> > -      :realms,
> > -      :storage_volumes,
> > -      :storage_snapshots
> > -    ]
> > -
> > -    DRIVER=ENV['API_DRIVER'] ? ENV['API_DRIVER'].to_sym : :mock
> > -
> > -    def driver_config
> > +    def self.driver_config
> >        if Thread::current[:drivers].nil?
> >          Thread::current[:drivers] = {}
> >          top_srcdir = File.join(File.dirname(__FILE__), '..', '..')
> > @@ -42,31 +32,5 @@ module Deltacloud
> >        Thread::current[:drivers]
> >      end
> > 
> > -    def driver_symbol
> > -      (Thread.current[:driver] || DRIVER).to_sym
> > -    end
> > -
> > -    def driver_name
> > -      driver_config[:"#{driver_symbol}"][:name]
> > -    end
> > -
> > -    def driver_class
> > -      basename = driver_config[:"#{driver_symbol}"][:class] ||
> > "#{driver_name}Driver"
> > -      Deltacloud::Drivers.const_get(driver_name).const_get(basename)
> > -    end
> > -
> > -    def driver_source_name
> > -      File.join("deltacloud", "drivers", "#{driver_symbol}",
> > "#{driver_symbol}_driver.rb")
> > -    end
> > -
> > -    def driver_mock_source_name
> > -      return File.join('deltacloud', 'drivers', "#{driver_symbol}",
> > -		       "#{driver_symbol}_driver.rb") if driver_name.eql?
> > 'Mock'
> > -    end
> > -
> > -    def driver
> > -      require driver_source_name
> > -      @driver ||= driver_class.new
> > -    end
> >    end
> >  end
> > diff --git a/server/lib/deltacloud/drivers/azure/azure_driver.rb
> > b/server/lib/deltacloud/drivers/azure/azure_driver.rb
> > index 24feeb7..db2b6c6 100644
> > --- a/server/lib/deltacloud/drivers/azure/azure_driver.rb
> > +++ b/server/lib/deltacloud/drivers/azure/azure_driver.rb
> > @@ -15,7 +15,6 @@
> >  # under the License.
> > 
> >  #Windows Azure (WAZ) gem at http://github.com/johnnyhalife/waz-
> > storage
> > -require 'deltacloud/base_driver'
> >  require 'waz-blobs'
> > 
> >  module Deltacloud
> > @@ -24,9 +23,6 @@ module Deltacloud
> > 
> >  class AzureDriver < Deltacloud::BaseDriver
> > 
> > -  def supported_collections; [:buckets]
> > -  end
> > -
> >  #--
> >  # Buckets
> >  #--
> > diff --git a/server/lib/deltacloud/drivers/condor/condor_driver.rb
> > b/server/lib/deltacloud/drivers/condor/condor_driver.rb
> > index f5cb741..c139b62 100644
> > --- a/server/lib/deltacloud/drivers/condor/condor_driver.rb
> > +++ b/server/lib/deltacloud/drivers/condor/condor_driver.rb
> > @@ -14,9 +14,6 @@
> >  # under the License.
> >  #
> > 
> > -require 'deltacloud/base_driver'
> > -
> > -
> >  class Instance
> >    def self.convert_condor_state(state_id)
> >      case state_id
> > @@ -44,10 +41,6 @@ module Deltacloud
> >          feature :instances, :user_data
> >          feature :instances, :authentication_password
> > 
> > -        def supported_collections
> > -          DEFAULT_COLLECTIONS - [ :storage_volumes,
> :storage_snapshots ]
> > -        end
> > -
> >          CONDOR_MAPPER_DIR = ENV['CONDOR_MAPPER_DIR'] || '/var/tmp'
> > 
> >          def hardware_profiles(credentials, opts={})
> > @@ -175,7 +168,7 @@ module Deltacloud
> >            pending.to( :running )        .automatically
> >            pending.to( :finish )         .on(:destroy)
> >            running.to( :running )        .on( :reboot )
> > -          running.to( :stopping )       .on( :destroy )
> > +          running.to( :shutting_down )  .on( :destroy )
> >            pending.to( :finish )         .automatically
> >          end
> > 
> > diff --git a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
> > b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
> > index 60e86e8..01b76b4 100644
> > --- a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
> > +++ b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
> > @@ -14,7 +14,6 @@
> >  # under the License.
> >  #
> > 
> > -require 'deltacloud/base_driver'
> >  require 'aws'
> > 
> >  class Instance
> > @@ -29,13 +28,8 @@ end
> > 
> >  module Deltacloud
> >    module Drivers
> > -    module EC2
> > -      class EC2Driver < Deltacloud::BaseDriver
> > -
> > -        def supported_collections
> > -
> > -          DEFAULT_COLLECTIONS +
> > [ :keys, :buckets, :load_balancers, :addresses, :firewalls ]
> > -        end
> > +    module Ec2
> > +      class Ec2Driver < Deltacloud::BaseDriver
> > 
> >          feature :instances, :user_data
> >          feature :instances, :authentication_key
> > @@ -127,8 +121,7 @@ module Deltacloud
> >            stopped.to( :running )        .on( :start )
> >            running.to( :running )        .on( :reboot )
> >            running.to( :stopping )       .on( :stop )
> > -          stopping.to(:stopped)         .automatically
> > -          stopping.to(:finish)          .automatically
> > +          shutting_down.to( :stopped )  .automatically
> >            stopped.to( :finish )         .automatically
> >          end
> > 
> > @@ -413,9 +406,7 @@ module Deltacloud
> >            safely do
> >              s3_bucket = s3_client.bucket(opts['bucket'])
> >              if(opts[:id])
> > -              s3_key = s3_bucket.key(opts[:id], true)
> > -              raise "Blob #{opts[:id]} in Bucket #{opts['bucket']}
> NotFound"
> > unless s3_key.exists?
> > -              blobs << convert_object(s3_key)
> > +              blobs << convert_object(s3_bucket.key(opts[:id], true))
> >              else
> >                s3_bucket.keys({}, true).each do |s3_object|
> >                  blobs << convert_object(s3_object)
> > @@ -471,7 +462,6 @@ module Deltacloud
> >            blob_meta = {}
> >            safely do
> >              the_blob =
> s3_client.bucket(opts['bucket']).key(opts[:id], true)
> > -            raise "Blob #{opts[:id]} in Bucket #{opts['bucket']}
> NotFound" unless
> > the_blob.exists?
> >              blob_meta = the_blob.meta_headers
> >            end
> >          end
> > diff --git
> a/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb
> > b/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb
> > index 2270178..54c1eed 100644
> > --- a/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb
> > +++ b/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb
> > @@ -21,10 +21,6 @@ module Deltacloud
> >      module Eucalyptus
> >        class EucalyptusDriver < EC2::EC2Driver
> > 
> > -        def supported_collections
> > -          DEFAULT_COLLECTIONS + [ :keys, :buckets, :addresses,
> :firewalls ]
> > -        end
> > -
> >          feature :instances, :user_data
> >          feature :instances, :authentication_key
> >          feature :instances, :firewalls
> > diff --git a/server/lib/deltacloud/drivers/features.rb
> > b/server/lib/deltacloud/drivers/features.rb
> > new file mode 100644
> > index 0000000..01d8656
> > --- /dev/null
> > +++ b/server/lib/deltacloud/drivers/features.rb
> > @@ -0,0 +1,111 @@
> > +# 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.
> > +
> > +module Deltacloud
> > +  module InstanceFeatures
> > +
> > +    def self.included(k)
> > +      current_features = features
> > +      k.instance_eval do
> > +        features(&current_features)
> > +      end
> > +    end
> > +
> > +    def self.features(&block)
> > +      block_given? ? @features = block : @features || Proc.new{}
> > +    end
> > +
> > +    features do
> > +
> > +      feature :user_name, :for => :instances do
> > +        description "Allow to set user-defined name for the instance"
> > +        operation :create do
> > +          param :name, :string, :optional
> > +        end
> > +      end
> > +
> > +      feature :user_data, :for => :instances do
> > +        description "Allow to pass user-defined data into the
> instance"
> > +        operation :create do
> > +          param :user_data, :string, :optional
> > +        end
> > +      end
> > +
> > +      feature :user_iso, :for => :instances do
> > +        description  "Base64 encoded gzipped ISO file will be
> accessible as CD-
> > ROM drive in instance"
> > +        operation :create do
> > +          param :user_iso, :string, :optional
> > +        end
> > +      end
> > +
> > +      feature :firewalls, :for => :instances do
> > +        description "Put instance in one or more firewalls (security
> groups) on
> > launch"
> > +        operation :create do
> > +          param :firewalls, :array, :optional, nil, "Array of
> firewall ID strings"
> > +          "Array of firewall (security group) id"
> > +        end
> > +      end
> > +
> > +      feature :authentication_key, :for => :instances do
> > +        operation :create do
> > +          param :keyname, :string,  :optional, [], "Key
> authentification
> > method"
> > +        end
> > +        operation :show do
> > +        end
> > +      end
> > +
> > +      feature :authentication_password, :for => :instances do
> > +        operation :create do
> > +          param :password, :string, :optional
> > +        end
> > +      end
> > +
> > +      feature :hardware_profiles, :for => :instances do
> > +        description "Size instances according to changes to a
> hardware
> > profile"
> > +        # The parameters are filled in from the hardware profiles
> > +      end
> > +
> > +      feature :register_to_load_balancer, :for => :instances do
> > +        description "Register instance to load balancer"
> > +        operation :create do
> > +          param :load_balancer_id, :string, :optional
> > +        end
> > +      end
> > +
> > +      feature :instance_count, :for => :instances do
> > +        description "Number of instances to be launch with at once"
> > +        operation :create do
> > +          param :instance_count,  :string,  :optional
> > +        end
> > +      end
> > +
> > +      feature :attach_snapshot, :for => :instances do
> > +        description "Attach an snapshot to instance on create"
> > +        operation :create do
> > +          param :snapshot_id,  :string,  :optional
> > +          param :device_name,  :string,  :optional
> > +        end
> > +      end
> > +
> > +      feature :sandboxing, :for => :instances do
> > +        description "Allow lanuching sandbox images"
> > +        operation :create do
> > +          param :sandbox, :string,  :optional
> > +        end
> > +      end
> > +    end
> > +
> > +  end
> > +end
> > diff --git a/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
> > b/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
> > index 285f58f..2a83c24 100644
> > --- a/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
> > +++ b/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
> > @@ -14,7 +14,6 @@
> >  # License for the specific language governing permissions and
> limitations
> >  # under the License.
> > 
> > -require 'deltacloud/base_driver'
> >  require 'deltacloud/drivers/gogrid/gogrid_client'
> > 
> >  class Instance
> > @@ -61,11 +60,6 @@ class GogridDriver < Deltacloud::BaseDriver
> >      @hardware_profiles
> >    end
> > 
> > -  def supported_collections
> > -    DEFAULT_COLLECTIONS.reject! { |c|
> > [ :storage_volumes, :storage_snapshots ].include?(c) }
> > -    DEFAULT_COLLECTIONS + [ :keys, :load_balancers ]
> > -  end
> > -
> >    def images(credentials, opts=nil)
> >      imgs = []
> >      if opts and opts[:id]
> > diff --git a/server/lib/deltacloud/drivers/google/google_driver.rb
> > b/server/lib/deltacloud/drivers/google/google_driver.rb
> > index 2ffb5f8..8bc6f25 100644
> > --- a/server/lib/deltacloud/drivers/google/google_driver.rb
> > +++ b/server/lib/deltacloud/drivers/google/google_driver.rb
> > @@ -21,9 +21,6 @@ module Deltacloud
> > 
> >  class GoogleDriver < Deltacloud::BaseDriver
> > 
> > -  def supported_collections; [:buckets]
> > -  end
> > -
> >    feature :buckets, :bucket_location
> > 
> >  #--
> > diff --git a/server/lib/deltacloud/drivers/mock/mock_client.rb
> > b/server/lib/deltacloud/drivers/mock/mock_client.rb
> > index 94c56af..248cc49 100644
> > --- a/server/lib/deltacloud/drivers/mock/mock_client.rb
> > +++ b/server/lib/deltacloud/drivers/mock/mock_client.rb
> > @@ -91,17 +91,6 @@ module Deltacloud::Drivers::Mock
> >        FileUtils.rm(fname) if File::exists?(fname)
> >      end
> > 
> > -    def store_cimi(collection, obj)
> > -      raise "Why no obj.name?" unless obj.name
> > -      File::open(cimi_file(collection, obj.name), "w") { |f|
> > f.write(obj.to_json) }
> > -    end
> > -
> > -    def destroy_cimi(collection, id)
> > -      fname = cimi_file(collection, id)
> > -      raise "No such object: #{id} in #{collection} collection"
> unless
> > File::exists?(fname)
> > -      FileUtils.rm(fname)
> > -    end
> > -
> >      def load_all_cimi(model_name)
> >          model_files = Dir[File::join(cimi_dir(model_name), "*.json")]
> >          model_files.map{|f| File.read(f)}
> > diff --git a/server/lib/deltacloud/drivers/mock/mock_driver.rb
> > b/server/lib/deltacloud/drivers/mock/mock_driver.rb
> > index b58872c..15f06fb 100644
> > --- a/server/lib/deltacloud/drivers/mock/mock_driver.rb
> > +++ b/server/lib/deltacloud/drivers/mock/mock_driver.rb
> > @@ -14,28 +14,16 @@
> >  # License for the specific language governing permissions and
> limitations
> >  # under the License.
> > 
> > -
> >  require 'yaml'
> >  require 'base64'
> >  require 'etc'
> > -require 'deltacloud/base_driver'
> > -require 'deltacloud/drivers/mock/mock_client'
> > -require 'deltacloud/drivers/mock/mock_driver_cimi_methods'
> > +require_relative 'mock_client'
> > +require_relative 'mock_driver_cimi_methods'
> > 
> >  module Deltacloud::Drivers::Mock
> > 
> >    class MockDriver < Deltacloud::BaseDriver
> > 
> > -    # If the provider is set to storage, pretend to be a storage-only
> > -    # driver
> > -    def supported_collections
> > -      if api_provider == 'storage'
> > -        [:buckets]
> > -      else
> > -        DEFAULT_COLLECTIONS + [:buckets, :keys]
> > -      end
> > -    end
> > -
> >      ( REALMS = [
> >        Realm.new({
> >          :id=>'us',
> > @@ -299,11 +287,6 @@ module Deltacloud::Drivers::Mock
> >        snapshots
> >      end
> > 
> > -    def destroy_storage_snapshot(credentials, opts={})
> > -      check_credentials(credentials)
> > -      @client.destroy(:storage_snapshots, opts[:id])
> > -    end
> > -
> >      def keys(credentials, opts={})
> >        check_credentials(credentials)
> >        result = @client.build_all(Key)
> > diff --git
> > a/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
> > b/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
> > index 2dec66b..bebc45c 100644
> > --- a/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
> > +++ b/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
> > @@ -32,49 +32,6 @@ module Deltacloud::Drivers::Mock
> >        end
> >      end
> > 
> > -    def create_network(credentials, opts={})
> > -      check_credentials(credentials)
> > -      id = "#{opts[:env].send("networks_url")}/#{opts[:name]}"
> > -      net_hsh = { "id"=> id,
> > -                  "name" => opts[:name],
> > -                  "description" => opts[:description],
> > -                  "created" => Time.now,
> > -                  "state" => "STARTED",
> > -                  "access" => opts[:network_config].access,
> > -                  "bandwithLimit" =>
> opts[:network_config].bandwidth_limit,
> > -                  "trafficPriority" =>
> opts[:network_config].traffic_priority,
> > -                  "maxTrafficDelay" =>
> opts[:network_config].max_traffic_delay,
> > -                  "maxTrafficLoss"
> =>opts[:network_config].max_traffic_loss,
> > -                  "maxTrafficJitter"
> =>opts[:network_config].max_traffic_jitter,
> > -                  "routingGroup"=> { "href" =>
> opts[:routing_group].id },
> > -                  "operations" => [{"rel"=>"edit", "href"=> id},
> > -                                   {"rel"=>"delete", "href"=> id}]
> }
> > -      network =
> CIMI::Model::Network.from_json(JSON.generate(net_hsh))
> > -
> > -      @client.store_cimi(:network, network)
> > -      network
> > -    end
> > -
> > -    def delete_network(credentials, id)
> > -      check_credentials(credentials)
> > -      @client.destroy_cimi(:network, id)
> > -    end
> > -
> > -    def start_network(credentials, id)
> > -      check_credentials(credentials)
> > -      update_object_state(id, "Network", "STARTED")
> > -    end
> > -
> > -    def stop_network(credentials, id)
> > -      check_credentials(credentials)
> > -      update_object_state(id, "Network", "STOPPED")
> > -    end
> > -
> > -    def suspend_network(credentials, id)
> > -      check_credentials(credentials)
> > -      update_object_state(id, "Network", "SUSPENDED")
> > -    end
> > -
> >      def network_configurations(credentials, opts={})
> >        check_credentials(credentials)
> >        if opts[:id].nil?
> > @@ -130,43 +87,6 @@ module Deltacloud::Drivers::Mock
> >        end
> >      end
> > 
> > -    def create_vsp(credentials, opts={})
> > -      check_credentials(credentials)
> > -      id = "#{opts[:env].send("vsps_url")}/#{opts[:name]}"
> > -      vsp_hash = { "id"    => id,
> > -                    "name"  => opts[:name],
> > -                    "description" => opts[:description],
> > -                    "state" => "STARTED",
> > -                    "created" => Time.now,
> > -
> > "bandwidthReservation"=>opts[:vsp_config].bandwidth_reservation,
> > -
> "trafficPriority"=>opts[:vsp_config].traffic_priority,
> > -
> "maxTrafficDelay"=>opts[:vsp_config].max_traffic_delay,
> > -
> "maxTrafficLoss"=>opts[:vsp_config].max_traffic_loss,
> > -
> "maxTrafficJitter"=>opts[:vsp_config].max_traffic_jitter,
> > -                    "network" => {"href" => opts[:network].id},
> > -                    "operations" => [{"rel"=>"edit", "href"=> id},
> > -                                     {"rel"=>"delete", "href"=> id}]
> > -                   }
> > -      vsp = CIMI::Model::VSP.from_json(JSON.generate(vsp_hash))
> > -      @client.store_cimi(:vsp, vsp)
> > -      vsp
> > -    end
> > -
> > -    def start_vsp(credentials, id)
> > -      check_credentials(credentials)
> > -      update_object_state(id, "VSP", "STARTED")
> > -    end
> > -
> > -    def stop_vsp(credentials, id)
> > -      check_credentials(credentials)
> > -      update_object_state(id, "VSP", "STOPPED")
> > -    end
> > -
> > -    def delete_vsp(credentials, id)
> > -      check_credentials(credentials)
> > -      @client.destroy_cimi(:vsp, id)
> > -    end
> > -
> >      def vsp_configurations(credentials, opts={})
> >        check_credentials(credentials)
> >        if opts[:id].nil?
> > @@ -189,56 +109,6 @@ module Deltacloud::Drivers::Mock
> >        end
> >      end
> > 
> > -    def addresses(credentials, opts={})
> > -      check_credentials(credentials)
> > -      if opts[:id].nil?
> > -        addresses = @client.load_all_cimi(:address).map{|addr|
> > CIMI::Model::Address.from_json(addr)}
> > -        addresses.map{|addr|convert_cimi_mock_urls(:address, addr,
> > opts[:env])}.flatten
> > -      else
> > -        address =
> > CIMI::Model::Address.from_json(@client.load_cimi(:address, opts[:id]))
> > -        convert_cimi_mock_urls(:address, address, opts[:env])
> > -      end
> > -    end
> > -
> > -    def create_address(credentials, opts={})
> > -      check_credentials(credentials)
> > -      id = "#{opts[:env].send("addresses_url")}/#{opts[:name]}"
> > -      addr_hash = { "id"    => id,
> > -                    "name"  => opts[:name],
> > -                    "description" => opts[:description],
> > -                    "created" => Time.now,
> > -                    "hostName" => opts[:address_template].hostname,
> > -                    "allocation" =>
> opts[:address_template].allocation,
> > -                    "defaultGateway" =>
> opts[:address_template].default_gateway,
> > -                    "dns" => opts[:address_template].dns,
> > -                    "macAddress" =>
> opts[:address_template].mac_address,
> > -                    "protocol" => opts[:address_template].protocol,
> > -                    "mask" => opts[:address_template].mask,
> > -                    "network" => {"href" =>
> opts[:address_template].network.href},
> > -                    "operations" => [{"rel"=>"edit", "href"=> id},
> > -                                     {"rel"=>"delete", "href"=> id}]
> > -                   }
> > -      address =
> CIMI::Model::Address.from_json(JSON.generate(addr_hash))
> > -      @client.store_cimi(:address, address)
> > -      address
> > -    end
> > -
> > -    def delete_address(credentials, id)
> > -      check_credentials(credentials)
> > -      @client.destroy_cimi(:address, id)
> > -    end
> > -
> > -    def address_templates(credentials, opts={})
> > -      check_credentials(credentials)
> > -      if opts[:id].nil?
> > -        address_templates =
> > @client.load_all_cimi(:address_template).map{|addr_templ|
> > CIMI::Model::AddressTemplate.from_json(addr_templ)}
> > -
> > address_templates.map{|addr_templ|convert_cimi_mock_urls(:address_t
> > emplate, addr_templ, opts[:env])}.flatten
> > -      else
> > -        address_template =
> > CIMI::Model::AddressTemplate.from_json(@client.load_cimi(:address_tem
> > plate, opts[:id]))
> > -        convert_cimi_mock_urls(:address_template, address_template,
> > opts[:env])
> > -      end
> > -    end
> > -
> >      private
> > 
> >      def convert_cimi_mock_urls(model_name, cimi_object, context)
> > @@ -270,15 +140,6 @@ module Deltacloud::Drivers::Mock
> >        end
> >      end
> > 
> > -    def update_object_state(id, object, new_state)
> > -      klass = CIMI::Model.const_get("#{object}")
> > -      symbol = object.to_s.downcase.singularize.intern
> > -      obj = klass.from_json(@client.load_cimi(symbol, id))
> > -      obj.state = new_state
> > -      @client.store_cimi(symbol, obj)
> > -      obj
> > -    end
> > -
> >    end
> > 
> >  end
> > diff --git
> a/server/lib/deltacloud/drivers/opennebula/opennebula_driver.rb
> > b/server/lib/deltacloud/drivers/opennebula/opennebula_driver.rb
> > index 371e170..03c337f 100644
> > --- a/server/lib/deltacloud/drivers/opennebula/opennebula_driver.rb
> > +++ b/server/lib/deltacloud/drivers/opennebula/opennebula_driver.rb
> > @@ -28,10 +28,6 @@ module Deltacloud
> > 
> >  class OpennebulaDriver < Deltacloud::BaseDriver
> > 
> > -  def supported_collections
> > -    DEFAULT_COLLECTIONS - [:storage_volumes, :storage_snapshots]
> > -  end
> > -
> > 
> > ##########################################################
> > ############
> >    # Hardware profiles
> > 
> > ##########################################################
> > ###########
> > @@ -152,8 +148,8 @@ class OpennebulaDriver < Deltacloud::BaseDriver
> >      running.to(:running)        .on( :reboot )
> >      running.to(:stopping)       .on( :stop )
> >      stopping.to(:stopped)       .automatically
> > -    running.to(:stopping)       .on( :destroy )
> > -    stopping.to(:finish)        .automatically
> > +    running.to(:shutting_down)  .on( :destroy )
> > +    shutting_down.to(:finish)   .automatically
> >    end
> > 
> >    def instances(credentials, opts=nil)
> > diff --git
> a/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
> > b/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
> > index c9ec95b..5d54d5b 100644
> > --- a/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
> > +++ b/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
> > @@ -14,9 +14,9 @@
> >  # under the License.
> >  #
> > 
> > -require 'deltacloud/base_driver'
> >  require 'openstack/compute'
> >  require 'tempfile'
> > +
> >  module Deltacloud
> >    module Drivers
> >      module Openstack
> > @@ -27,16 +27,12 @@ module Deltacloud
> >          feature :instances, :user_files
> >          feature :images, :user_name
> > 
> > -        def supported_collections
> > -          DEFAULT_COLLECTIONS - [ :storage_snapshots,
> :storage_volumes  ]
> > #+ [ :buckets ]
> > -        end
> > -
> >          define_instance_states do
> >            start.to( :pending )          .on( :create )
> >            pending.to( :running )        .automatically
> >            running.to( :running )        .on( :reboot )
> > -          running.to( :stopping )       .on( :stop )
> > -          stopping.to( :stopped )       .automatically
> > +          running.to( :shutting_down )  .on( :stop )
> > +          shutting_down.to( :stopped )  .automatically
> >            stopped.to( :finish )         .automatically
> >          end
> > 
> > @@ -140,7 +136,7 @@ module Deltacloud
> >            params[:name] = (opts[:name] && opts[:name].length>0)?
> > opts[:name] : Time.now.to_s
> >            params[:imageRef] = image_id
> >            params[:flavorRef] =  (opts[:hwp_id] &&
> opts[:hwp_id].length>0) ?
> > -                          opts[:hwp_id] :
> hardware_profiles(credentials).first.name
> > +                          opts[:hwp_id] :
> hardware_profiles(credentials).first
> >            if opts[:password] && opts[:password].length > 0
> >              params[:adminPass]=opts[:password]
> >            end
> > diff --git
> a/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
> > b/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
> > index 1b019d4..f59f832 100644
> > --- a/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
> > +++ b/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
> > @@ -14,7 +14,6 @@
> >  # License for the specific language governing permissions and
> limitations
> >  # under the License.
> > 
> > -require 'deltacloud/base_driver'
> >  require 'cloudfiles'
> >  require 'cloudservers'
> >  require 'base64'
> > @@ -30,10 +29,6 @@ class RackspaceDriver < Deltacloud::BaseDriver
> >    feature :instances, :user_files
> >    feature :images, :user_name
> > 
> > -  def supported_collections
> > -    DEFAULT_COLLECTIONS + [ :buckets ] -
> > [ :storage_snapshots, :storage_volumes ]
> > -  end
> > -
> >    def hardware_profiles(credentials, opts = {})
> >      rs = new_client( credentials )
> >      results = []
> > @@ -194,8 +189,8 @@ class RackspaceDriver < Deltacloud::BaseDriver
> >      start.to( :pending )          .on( :create )
> >      pending.to( :running )        .automatically
> >      running.to( :running )        .on( :reboot )
> > -    running.to( :stopping )       .on( :stop )
> > -    stopping.to( :stopped )       .automatically
> > +    running.to( :shutting_down )  .on( :stop )
> > +    shutting_down.to( :stopped )  .automatically
> >      stopped.to( :finish )         .automatically
> >    end
> > 
> > diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> > b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> > index 1c96df7..f138f03 100644
> > --- a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> > +++ b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> > @@ -14,27 +14,24 @@
> >  # License for the specific language governing permissions and
> limitations
> >  # under the License.
> > 
> > -require 'deltacloud/base_driver'
> >  require 'rbovirt'
> > 
> >  module Deltacloud
> >    module Drivers
> > -    module RHEVM
> > +    module Rhevm
> > 
> > -class RHEVMDriver < Deltacloud::BaseDriver
> > +class RhevmDriver < Deltacloud::BaseDriver
> > 
> > -  def supported_collections
> > -    DEFAULT_COLLECTIONS - [:storage_snapshots]
> > -  end
> > -
> > -  feature :instances, :user_name do
> > -    constraint :max_length, 50
> > +  Sinatra::Rabbit::InstancesCollection.features do
> > +    feature :user_name, :for => :instances do
> > +      constrain :max_length, 50
> > +    end
> >    end
> > 
> >    feature :instances, :user_data
> >    feature :images, :user_name
> > 
> > -  USER_NAME_MAX =
> > feature(:instances, :user_name).constraints[:max_length]
> > +  USER_NAME_MAX =
> >
> Sinatra::Rabbit::InstancesCollection.feature(:user_name).constraints[:ma
> x_l
> > ength]
> > 
> >    # FIXME: These values are just for ilustration
> >    # Also I choosed 'SERVER' and 'DESKTOP' names
> > diff --git
> a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
> > b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
> > index 58f8e1b..f44336a 100644
> > --- a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
> > +++ b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
> > @@ -41,17 +41,16 @@ class RimuHostingClient
> >        headers["Authorization"] = @auth
> >      end
> >      safely do
> > -      r = @service.send_request(method, @uri.path + resource, data,
> > headers)
> > -          puts r.body
> > -      res = JSON.parse(r.body)
> > -      res = res[res.keys[0]]
> > +    r = @service.send_request(method, @uri.path + resource, data,
> > headers)
> > +         puts r.body
> > +    res = JSON.parse(r.body)
> > +    res = res[res.keys[0]]
> > 
> > -      if(res['response_type'] == "ERROR" and (
> (res['error_info']['error_class']
> > == "PermissionException") or
> > +    if(res['response_type'] == "ERROR" and (
> (res['error_info']['error_class']
> > == "PermissionException") or
> >
> (res['error_info']['error_class'] ==
> > "LoginRequired") ))
> > -        raise "AuthFailure"
> > -      end
> > -      res
> > +      raise "AuthFailure"
> >      end
> > +    res
> >    end
> > 
> >    def list_images
> > @@ -82,6 +81,6 @@ class RimuHostingClient
> >    end
> >  end
> > 
> > +    end
> >    end
> >  end
> > -end
> > diff --git
> a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
> > b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
> > index 67c415c..8633d53 100644
> > --- a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
> > +++ b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
> > @@ -16,7 +16,6 @@
> >  # License for the specific language governing permissions and
> limitations
> >  # under the License.
> > 
> > -require "deltacloud/base_driver"
> >  require "deltacloud/drivers/rimuhosting/rimuhosting_client"
> > 
> >  module Deltacloud
> > @@ -131,9 +130,9 @@ class RimuHostingDriver < Deltacloud::BaseDriver
> >              :owner_id => "root",
> >              :instance_profile => InstanceProfile.new("none"),
> >              :actions => instance_actions_for("RUNNING"),
> > -            :public_addresses =>
> > [ InstanceAddress.new(inst["allocated_ips"]["primary_ip"] ) ],
> > -            :launch_time =>
> inst["billing_info"]["order_date"]["iso_format"]
> > -    })
> > +            :public_addresses =>
> > [ InstanceAddress.new(inst["allocated_ips"]["primary_ip"] )],
> > +            :launch_time =>
> inst["billing_info"]["order_date"]["iso_format"]}
> > +                )
> >    end
> > 
> >    define_instance_states do
> > @@ -142,9 +141,9 @@ class RimuHostingDriver < Deltacloud::BaseDriver
> >      pending.to( :running )        .automatically
> > 
> >      running.to( :running )        .on(:reboot)
> > -    running.to( :stopping )       .on(:stop)
> > +    running.to( :shutting_down )  .on(:stop)
> > 
> > -    stopping.to( :stopped )       .automatically
> > +    shutting_down.to( :stopped )  .automatically
> > 
> >      stopped.to( :finish )         .automatically
> >    end
> > diff --git
> a/server/lib/deltacloud/drivers/terremark/terremark_driver.rb
> > b/server/lib/deltacloud/drivers/terremark/terremark_driver.rb
> > index 2dba02a..2e087cb 100644
> > --- a/server/lib/deltacloud/drivers/terremark/terremark_driver.rb
> > +++ b/server/lib/deltacloud/drivers/terremark/terremark_driver.rb
> > @@ -19,8 +19,7 @@
> >  # https://community.vcloudexpress.terremark.com/en-
> > us/product_docs/w/wiki/d-complete-vcloud-express-api-document.aspx
> >  #
> >  # 02 May 2010
> > -#
> > -require 'deltacloud/base_driver'
> > +
> >  require 'fog'
> >  require 'excon'
> >  require 'nokogiri'
> > @@ -118,8 +117,8 @@ VAPP_STATE_MAP = { "0" =>  "PENDING", "1" =>
> > "PENDING", "2" =>  "STOPPED", "4"
> >      pending.to(:stopped)          .automatically
> >      stopped.to(:running)          .on( :start )
> >      running.to(:running)          .on( :reboot )
> > -    running.to(:stopping)         .on( :stop )
> > -    stopping.to(:stopped)         .automatically
> > +    running.to(:shutting_down)    .on( :stop )
> > +    shutting_down.to(:stopped)    .automatically
> >      stopped.to(:finish)           .on( :destroy )
> >     end
> > 
> > diff --git a/server/lib/deltacloud/drivers/vsphere/vsphere_driver.rb
> > b/server/lib/deltacloud/drivers/vsphere/vsphere_driver.rb
> > index e16be2f..7ac908a 100644
> > --- a/server/lib/deltacloud/drivers/vsphere/vsphere_driver.rb
> > +++ b/server/lib/deltacloud/drivers/vsphere/vsphere_driver.rb
> > @@ -14,18 +14,17 @@
> >  # under the License.
> >  #
> > 
> > -require 'deltacloud/base_driver'
> >  require 'rbvmomi'
> >  require 'deltacloud/drivers/vsphere/vsphere_client'
> > 
> > -module Deltacloud::Drivers::VSphere
> > +module Deltacloud::Drivers::Vsphere
> > 
> >    MAPPER_STORAGE_ROOT = File::join("/var/tmp", "deltacloud-vsphere-
> > #{ENV["USER"]}")
> > 
> > -  class VSphereDriver < Deltacloud::BaseDriver
> > +  class VsphereDriver < Deltacloud::BaseDriver
> > 
> >      include Deltacloud::Drivers::VSphere::Helper
> > -    include Deltacloud::Drivers::VSphere::FileManager
> > +    include VSphere::FileManager
> > 
> >      # You can use 'user_iso' feature to set 'user_iso' parameter when
> > creating
> >      # a new instance where this parameter can hold gzipped CDROM iso
> > which will
> > @@ -34,10 +33,6 @@ module Deltacloud::Drivers::VSphere
> >      feature :instances, :user_data
> >      feature :instances, :user_name
> > 
> > -    def supported_collections
> > -      DEFAULT_COLLECTIONS - [:storage_volumes, :storage_snapshots]
> > -    end
> > -
> >      # There is just one hardware profile where memory is measured
> using
> > maximum
> >      # memory available on ESX for virtual machines and CPU using
> maximum
> > free
> >      # CPU cores in ESX.
> > @@ -68,8 +63,8 @@ module Deltacloud::Drivers::VSphere
> >        pending.to(:stopped)        .automatically
> >        stopped.to(:running)        .on( :start )
> >        running.to(:running)        .on( :reboot )
> > -      running.to(:stopping)       .on( :stop )
> > -      stopping.to(:stopped)       .automatically
> > +      running.to(:shutting_down)  .on( :stop )
> > +      shutting_down.to(:stopped)  .automatically
> >        stopped.to(:finish)         .on( :destroy )
> >      end
> > 
> > --
> > 1.7.10
> > 
> 
> 

-- 
Michal Fojtik
Sr. Software Engineer, Deltacloud API (http://deltacloud.org)

RE: [PATCH core 14/32] Core: Updated drivers to remove base_driver require and added autoloading of driver

Posted by "Koper, Dies" <di...@fast.au.fujitsu.com>.
Hi Michal,

> -          running.to( :stopping )       .on( :destroy )
> +          running.to( :shutting_down )  .on( :destroy )

In commit 09bfd939db278978d87539534ceda3465737acc3 David changed this
state to be consistently :stopping.
Does this mean we're reverting that and change the state consistently to
:shutting_down?

Cheers,
Dies Koper



> -----Original Message-----
> From: mfojtik@redhat.com [mailto:mfojtik@redhat.com]
> Sent: Tuesday, 17 April 2012 11:40 PM
> To: dev@deltacloud.apache.org
> Subject: [PATCH core 14/32] Core: Updated drivers to remove
base_driver
> require and added autoloading of driver
> 
> From: Michal Fojtik <mf...@redhat.com>
> 
> 
> Signed-off-by: Michal fojtik <mf...@redhat.com>
> ---
>  server/lib/deltacloud/drivers.rb                   |   48 +------
>  .../lib/deltacloud/drivers/azure/azure_driver.rb   |    4 -
>  .../lib/deltacloud/drivers/condor/condor_driver.rb |    9 +-
>  server/lib/deltacloud/drivers/ec2/ec2_driver.rb    |   18 +--
>  .../drivers/eucalyptus/eucalyptus_driver.rb        |    4 -
>  server/lib/deltacloud/drivers/features.rb          |  111
++++++++++++++++
>  .../lib/deltacloud/drivers/gogrid/gogrid_driver.rb |    6 -
>  .../lib/deltacloud/drivers/google/google_driver.rb |    3 -
>  server/lib/deltacloud/drivers/mock/mock_client.rb  |   11 --
>  server/lib/deltacloud/drivers/mock/mock_driver.rb  |   21 +--
>  .../drivers/mock/mock_driver_cimi_methods.rb       |  139
--------------------
>  .../drivers/opennebula/opennebula_driver.rb        |    8 +-
>  .../drivers/openstack/openstack_driver.rb          |   12 +-
>  .../drivers/rackspace/rackspace_driver.rb          |    9 +-
>  .../lib/deltacloud/drivers/rhevm/rhevm_driver.rb   |   17 +--
>  .../drivers/rimuhosting/rimuhosting_client.rb      |   17 ++-
>  .../drivers/rimuhosting/rimuhosting_driver.rb      |   11 +-
>  .../drivers/terremark/terremark_driver.rb          |    7 +-
>  .../deltacloud/drivers/vsphere/vsphere_driver.rb   |   15 +--
>  19 files changed, 160 insertions(+), 310 deletions(-)
>  create mode 100644 server/lib/deltacloud/drivers/features.rb
> 
> diff --git a/server/lib/deltacloud/drivers.rb
> b/server/lib/deltacloud/drivers.rb
> index dfc998d..14e7ee0 100644
> --- a/server/lib/deltacloud/drivers.rb
> +++ b/server/lib/deltacloud/drivers.rb
> @@ -13,25 +13,15 @@
>  # License for the specific language governing permissions and
limitations
>  # under the License.
> 
> -module Deltacloud
> +require_relative 'drivers/exceptions'
> +require_relative 'drivers/base_driver'
> +require_relative 'drivers/features'
> +require 'yaml'
> 
> +module Deltacloud
>    module Drivers
> 
> -    require 'yaml'
> -
> -    DEFAULT_COLLECTIONS = [
> -      :hardware_profiles,
> -      :images,
> -      :instances,
> -      :instance_states,
> -      :realms,
> -      :storage_volumes,
> -      :storage_snapshots
> -    ]
> -
> -    DRIVER=ENV['API_DRIVER'] ? ENV['API_DRIVER'].to_sym : :mock
> -
> -    def driver_config
> +    def self.driver_config
>        if Thread::current[:drivers].nil?
>          Thread::current[:drivers] = {}
>          top_srcdir = File.join(File.dirname(__FILE__), '..', '..')
> @@ -42,31 +32,5 @@ module Deltacloud
>        Thread::current[:drivers]
>      end
> 
> -    def driver_symbol
> -      (Thread.current[:driver] || DRIVER).to_sym
> -    end
> -
> -    def driver_name
> -      driver_config[:"#{driver_symbol}"][:name]
> -    end
> -
> -    def driver_class
> -      basename = driver_config[:"#{driver_symbol}"][:class] ||
> "#{driver_name}Driver"
> -      Deltacloud::Drivers.const_get(driver_name).const_get(basename)
> -    end
> -
> -    def driver_source_name
> -      File.join("deltacloud", "drivers", "#{driver_symbol}",
> "#{driver_symbol}_driver.rb")
> -    end
> -
> -    def driver_mock_source_name
> -      return File.join('deltacloud', 'drivers', "#{driver_symbol}",
> -		       "#{driver_symbol}_driver.rb") if driver_name.eql?
> 'Mock'
> -    end
> -
> -    def driver
> -      require driver_source_name
> -      @driver ||= driver_class.new
> -    end
>    end
>  end
> diff --git a/server/lib/deltacloud/drivers/azure/azure_driver.rb
> b/server/lib/deltacloud/drivers/azure/azure_driver.rb
> index 24feeb7..db2b6c6 100644
> --- a/server/lib/deltacloud/drivers/azure/azure_driver.rb
> +++ b/server/lib/deltacloud/drivers/azure/azure_driver.rb
> @@ -15,7 +15,6 @@
>  # under the License.
> 
>  #Windows Azure (WAZ) gem at http://github.com/johnnyhalife/waz-
> storage
> -require 'deltacloud/base_driver'
>  require 'waz-blobs'
> 
>  module Deltacloud
> @@ -24,9 +23,6 @@ module Deltacloud
> 
>  class AzureDriver < Deltacloud::BaseDriver
> 
> -  def supported_collections; [:buckets]
> -  end
> -
>  #--
>  # Buckets
>  #--
> diff --git a/server/lib/deltacloud/drivers/condor/condor_driver.rb
> b/server/lib/deltacloud/drivers/condor/condor_driver.rb
> index f5cb741..c139b62 100644
> --- a/server/lib/deltacloud/drivers/condor/condor_driver.rb
> +++ b/server/lib/deltacloud/drivers/condor/condor_driver.rb
> @@ -14,9 +14,6 @@
>  # under the License.
>  #
> 
> -require 'deltacloud/base_driver'
> -
> -
>  class Instance
>    def self.convert_condor_state(state_id)
>      case state_id
> @@ -44,10 +41,6 @@ module Deltacloud
>          feature :instances, :user_data
>          feature :instances, :authentication_password
> 
> -        def supported_collections
> -          DEFAULT_COLLECTIONS - [ :storage_volumes,
:storage_snapshots ]
> -        end
> -
>          CONDOR_MAPPER_DIR = ENV['CONDOR_MAPPER_DIR'] || '/var/tmp'
> 
>          def hardware_profiles(credentials, opts={})
> @@ -175,7 +168,7 @@ module Deltacloud
>            pending.to( :running )        .automatically
>            pending.to( :finish )         .on(:destroy)
>            running.to( :running )        .on( :reboot )
> -          running.to( :stopping )       .on( :destroy )
> +          running.to( :shutting_down )  .on( :destroy )
>            pending.to( :finish )         .automatically
>          end
> 
> diff --git a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
> b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
> index 60e86e8..01b76b4 100644
> --- a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
> +++ b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
> @@ -14,7 +14,6 @@
>  # under the License.
>  #
> 
> -require 'deltacloud/base_driver'
>  require 'aws'
> 
>  class Instance
> @@ -29,13 +28,8 @@ end
> 
>  module Deltacloud
>    module Drivers
> -    module EC2
> -      class EC2Driver < Deltacloud::BaseDriver
> -
> -        def supported_collections
> -
> -          DEFAULT_COLLECTIONS +
> [ :keys, :buckets, :load_balancers, :addresses, :firewalls ]
> -        end
> +    module Ec2
> +      class Ec2Driver < Deltacloud::BaseDriver
> 
>          feature :instances, :user_data
>          feature :instances, :authentication_key
> @@ -127,8 +121,7 @@ module Deltacloud
>            stopped.to( :running )        .on( :start )
>            running.to( :running )        .on( :reboot )
>            running.to( :stopping )       .on( :stop )
> -          stopping.to(:stopped)         .automatically
> -          stopping.to(:finish)          .automatically
> +          shutting_down.to( :stopped )  .automatically
>            stopped.to( :finish )         .automatically
>          end
> 
> @@ -413,9 +406,7 @@ module Deltacloud
>            safely do
>              s3_bucket = s3_client.bucket(opts['bucket'])
>              if(opts[:id])
> -              s3_key = s3_bucket.key(opts[:id], true)
> -              raise "Blob #{opts[:id]} in Bucket #{opts['bucket']}
NotFound"
> unless s3_key.exists?
> -              blobs << convert_object(s3_key)
> +              blobs << convert_object(s3_bucket.key(opts[:id], true))
>              else
>                s3_bucket.keys({}, true).each do |s3_object|
>                  blobs << convert_object(s3_object)
> @@ -471,7 +462,6 @@ module Deltacloud
>            blob_meta = {}
>            safely do
>              the_blob =
s3_client.bucket(opts['bucket']).key(opts[:id], true)
> -            raise "Blob #{opts[:id]} in Bucket #{opts['bucket']}
NotFound" unless
> the_blob.exists?
>              blob_meta = the_blob.meta_headers
>            end
>          end
> diff --git
a/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb
> b/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb
> index 2270178..54c1eed 100644
> --- a/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb
> +++ b/server/lib/deltacloud/drivers/eucalyptus/eucalyptus_driver.rb
> @@ -21,10 +21,6 @@ module Deltacloud
>      module Eucalyptus
>        class EucalyptusDriver < EC2::EC2Driver
> 
> -        def supported_collections
> -          DEFAULT_COLLECTIONS + [ :keys, :buckets, :addresses,
:firewalls ]
> -        end
> -
>          feature :instances, :user_data
>          feature :instances, :authentication_key
>          feature :instances, :firewalls
> diff --git a/server/lib/deltacloud/drivers/features.rb
> b/server/lib/deltacloud/drivers/features.rb
> new file mode 100644
> index 0000000..01d8656
> --- /dev/null
> +++ b/server/lib/deltacloud/drivers/features.rb
> @@ -0,0 +1,111 @@
> +# 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.
> +
> +module Deltacloud
> +  module InstanceFeatures
> +
> +    def self.included(k)
> +      current_features = features
> +      k.instance_eval do
> +        features(&current_features)
> +      end
> +    end
> +
> +    def self.features(&block)
> +      block_given? ? @features = block : @features || Proc.new{}
> +    end
> +
> +    features do
> +
> +      feature :user_name, :for => :instances do
> +        description "Allow to set user-defined name for the instance"
> +        operation :create do
> +          param :name, :string, :optional
> +        end
> +      end
> +
> +      feature :user_data, :for => :instances do
> +        description "Allow to pass user-defined data into the
instance"
> +        operation :create do
> +          param :user_data, :string, :optional
> +        end
> +      end
> +
> +      feature :user_iso, :for => :instances do
> +        description  "Base64 encoded gzipped ISO file will be
accessible as CD-
> ROM drive in instance"
> +        operation :create do
> +          param :user_iso, :string, :optional
> +        end
> +      end
> +
> +      feature :firewalls, :for => :instances do
> +        description "Put instance in one or more firewalls (security
groups) on
> launch"
> +        operation :create do
> +          param :firewalls, :array, :optional, nil, "Array of
firewall ID strings"
> +          "Array of firewall (security group) id"
> +        end
> +      end
> +
> +      feature :authentication_key, :for => :instances do
> +        operation :create do
> +          param :keyname, :string,  :optional, [], "Key
authentification
> method"
> +        end
> +        operation :show do
> +        end
> +      end
> +
> +      feature :authentication_password, :for => :instances do
> +        operation :create do
> +          param :password, :string, :optional
> +        end
> +      end
> +
> +      feature :hardware_profiles, :for => :instances do
> +        description "Size instances according to changes to a
hardware
> profile"
> +        # The parameters are filled in from the hardware profiles
> +      end
> +
> +      feature :register_to_load_balancer, :for => :instances do
> +        description "Register instance to load balancer"
> +        operation :create do
> +          param :load_balancer_id, :string, :optional
> +        end
> +      end
> +
> +      feature :instance_count, :for => :instances do
> +        description "Number of instances to be launch with at once"
> +        operation :create do
> +          param :instance_count,  :string,  :optional
> +        end
> +      end
> +
> +      feature :attach_snapshot, :for => :instances do
> +        description "Attach an snapshot to instance on create"
> +        operation :create do
> +          param :snapshot_id,  :string,  :optional
> +          param :device_name,  :string,  :optional
> +        end
> +      end
> +
> +      feature :sandboxing, :for => :instances do
> +        description "Allow lanuching sandbox images"
> +        operation :create do
> +          param :sandbox, :string,  :optional
> +        end
> +      end
> +    end
> +
> +  end
> +end
> diff --git a/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
> b/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
> index 285f58f..2a83c24 100644
> --- a/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
> +++ b/server/lib/deltacloud/drivers/gogrid/gogrid_driver.rb
> @@ -14,7 +14,6 @@
>  # License for the specific language governing permissions and
limitations
>  # under the License.
> 
> -require 'deltacloud/base_driver'
>  require 'deltacloud/drivers/gogrid/gogrid_client'
> 
>  class Instance
> @@ -61,11 +60,6 @@ class GogridDriver < Deltacloud::BaseDriver
>      @hardware_profiles
>    end
> 
> -  def supported_collections
> -    DEFAULT_COLLECTIONS.reject! { |c|
> [ :storage_volumes, :storage_snapshots ].include?(c) }
> -    DEFAULT_COLLECTIONS + [ :keys, :load_balancers ]
> -  end
> -
>    def images(credentials, opts=nil)
>      imgs = []
>      if opts and opts[:id]
> diff --git a/server/lib/deltacloud/drivers/google/google_driver.rb
> b/server/lib/deltacloud/drivers/google/google_driver.rb
> index 2ffb5f8..8bc6f25 100644
> --- a/server/lib/deltacloud/drivers/google/google_driver.rb
> +++ b/server/lib/deltacloud/drivers/google/google_driver.rb
> @@ -21,9 +21,6 @@ module Deltacloud
> 
>  class GoogleDriver < Deltacloud::BaseDriver
> 
> -  def supported_collections; [:buckets]
> -  end
> -
>    feature :buckets, :bucket_location
> 
>  #--
> diff --git a/server/lib/deltacloud/drivers/mock/mock_client.rb
> b/server/lib/deltacloud/drivers/mock/mock_client.rb
> index 94c56af..248cc49 100644
> --- a/server/lib/deltacloud/drivers/mock/mock_client.rb
> +++ b/server/lib/deltacloud/drivers/mock/mock_client.rb
> @@ -91,17 +91,6 @@ module Deltacloud::Drivers::Mock
>        FileUtils.rm(fname) if File::exists?(fname)
>      end
> 
> -    def store_cimi(collection, obj)
> -      raise "Why no obj.name?" unless obj.name
> -      File::open(cimi_file(collection, obj.name), "w") { |f|
> f.write(obj.to_json) }
> -    end
> -
> -    def destroy_cimi(collection, id)
> -      fname = cimi_file(collection, id)
> -      raise "No such object: #{id} in #{collection} collection"
unless
> File::exists?(fname)
> -      FileUtils.rm(fname)
> -    end
> -
>      def load_all_cimi(model_name)
>          model_files = Dir[File::join(cimi_dir(model_name), "*.json")]
>          model_files.map{|f| File.read(f)}
> diff --git a/server/lib/deltacloud/drivers/mock/mock_driver.rb
> b/server/lib/deltacloud/drivers/mock/mock_driver.rb
> index b58872c..15f06fb 100644
> --- a/server/lib/deltacloud/drivers/mock/mock_driver.rb
> +++ b/server/lib/deltacloud/drivers/mock/mock_driver.rb
> @@ -14,28 +14,16 @@
>  # License for the specific language governing permissions and
limitations
>  # under the License.
> 
> -
>  require 'yaml'
>  require 'base64'
>  require 'etc'
> -require 'deltacloud/base_driver'
> -require 'deltacloud/drivers/mock/mock_client'
> -require 'deltacloud/drivers/mock/mock_driver_cimi_methods'
> +require_relative 'mock_client'
> +require_relative 'mock_driver_cimi_methods'
> 
>  module Deltacloud::Drivers::Mock
> 
>    class MockDriver < Deltacloud::BaseDriver
> 
> -    # If the provider is set to storage, pretend to be a storage-only
> -    # driver
> -    def supported_collections
> -      if api_provider == 'storage'
> -        [:buckets]
> -      else
> -        DEFAULT_COLLECTIONS + [:buckets, :keys]
> -      end
> -    end
> -
>      ( REALMS = [
>        Realm.new({
>          :id=>'us',
> @@ -299,11 +287,6 @@ module Deltacloud::Drivers::Mock
>        snapshots
>      end
> 
> -    def destroy_storage_snapshot(credentials, opts={})
> -      check_credentials(credentials)
> -      @client.destroy(:storage_snapshots, opts[:id])
> -    end
> -
>      def keys(credentials, opts={})
>        check_credentials(credentials)
>        result = @client.build_all(Key)
> diff --git
> a/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
> b/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
> index 2dec66b..bebc45c 100644
> --- a/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
> +++ b/server/lib/deltacloud/drivers/mock/mock_driver_cimi_methods.rb
> @@ -32,49 +32,6 @@ module Deltacloud::Drivers::Mock
>        end
>      end
> 
> -    def create_network(credentials, opts={})
> -      check_credentials(credentials)
> -      id = "#{opts[:env].send("networks_url")}/#{opts[:name]}"
> -      net_hsh = { "id"=> id,
> -                  "name" => opts[:name],
> -                  "description" => opts[:description],
> -                  "created" => Time.now,
> -                  "state" => "STARTED",
> -                  "access" => opts[:network_config].access,
> -                  "bandwithLimit" =>
opts[:network_config].bandwidth_limit,
> -                  "trafficPriority" =>
opts[:network_config].traffic_priority,
> -                  "maxTrafficDelay" =>
opts[:network_config].max_traffic_delay,
> -                  "maxTrafficLoss"
=>opts[:network_config].max_traffic_loss,
> -                  "maxTrafficJitter"
=>opts[:network_config].max_traffic_jitter,
> -                  "routingGroup"=> { "href" =>
opts[:routing_group].id },
> -                  "operations" => [{"rel"=>"edit", "href"=> id},
> -                                   {"rel"=>"delete", "href"=> id}]
}
> -      network =
CIMI::Model::Network.from_json(JSON.generate(net_hsh))
> -
> -      @client.store_cimi(:network, network)
> -      network
> -    end
> -
> -    def delete_network(credentials, id)
> -      check_credentials(credentials)
> -      @client.destroy_cimi(:network, id)
> -    end
> -
> -    def start_network(credentials, id)
> -      check_credentials(credentials)
> -      update_object_state(id, "Network", "STARTED")
> -    end
> -
> -    def stop_network(credentials, id)
> -      check_credentials(credentials)
> -      update_object_state(id, "Network", "STOPPED")
> -    end
> -
> -    def suspend_network(credentials, id)
> -      check_credentials(credentials)
> -      update_object_state(id, "Network", "SUSPENDED")
> -    end
> -
>      def network_configurations(credentials, opts={})
>        check_credentials(credentials)
>        if opts[:id].nil?
> @@ -130,43 +87,6 @@ module Deltacloud::Drivers::Mock
>        end
>      end
> 
> -    def create_vsp(credentials, opts={})
> -      check_credentials(credentials)
> -      id = "#{opts[:env].send("vsps_url")}/#{opts[:name]}"
> -      vsp_hash = { "id"    => id,
> -                    "name"  => opts[:name],
> -                    "description" => opts[:description],
> -                    "state" => "STARTED",
> -                    "created" => Time.now,
> -
> "bandwidthReservation"=>opts[:vsp_config].bandwidth_reservation,
> -
"trafficPriority"=>opts[:vsp_config].traffic_priority,
> -
"maxTrafficDelay"=>opts[:vsp_config].max_traffic_delay,
> -
"maxTrafficLoss"=>opts[:vsp_config].max_traffic_loss,
> -
"maxTrafficJitter"=>opts[:vsp_config].max_traffic_jitter,
> -                    "network" => {"href" => opts[:network].id},
> -                    "operations" => [{"rel"=>"edit", "href"=> id},
> -                                     {"rel"=>"delete", "href"=> id}]
> -                   }
> -      vsp = CIMI::Model::VSP.from_json(JSON.generate(vsp_hash))
> -      @client.store_cimi(:vsp, vsp)
> -      vsp
> -    end
> -
> -    def start_vsp(credentials, id)
> -      check_credentials(credentials)
> -      update_object_state(id, "VSP", "STARTED")
> -    end
> -
> -    def stop_vsp(credentials, id)
> -      check_credentials(credentials)
> -      update_object_state(id, "VSP", "STOPPED")
> -    end
> -
> -    def delete_vsp(credentials, id)
> -      check_credentials(credentials)
> -      @client.destroy_cimi(:vsp, id)
> -    end
> -
>      def vsp_configurations(credentials, opts={})
>        check_credentials(credentials)
>        if opts[:id].nil?
> @@ -189,56 +109,6 @@ module Deltacloud::Drivers::Mock
>        end
>      end
> 
> -    def addresses(credentials, opts={})
> -      check_credentials(credentials)
> -      if opts[:id].nil?
> -        addresses = @client.load_all_cimi(:address).map{|addr|
> CIMI::Model::Address.from_json(addr)}
> -        addresses.map{|addr|convert_cimi_mock_urls(:address, addr,
> opts[:env])}.flatten
> -      else
> -        address =
> CIMI::Model::Address.from_json(@client.load_cimi(:address, opts[:id]))
> -        convert_cimi_mock_urls(:address, address, opts[:env])
> -      end
> -    end
> -
> -    def create_address(credentials, opts={})
> -      check_credentials(credentials)
> -      id = "#{opts[:env].send("addresses_url")}/#{opts[:name]}"
> -      addr_hash = { "id"    => id,
> -                    "name"  => opts[:name],
> -                    "description" => opts[:description],
> -                    "created" => Time.now,
> -                    "hostName" => opts[:address_template].hostname,
> -                    "allocation" =>
opts[:address_template].allocation,
> -                    "defaultGateway" =>
opts[:address_template].default_gateway,
> -                    "dns" => opts[:address_template].dns,
> -                    "macAddress" =>
opts[:address_template].mac_address,
> -                    "protocol" => opts[:address_template].protocol,
> -                    "mask" => opts[:address_template].mask,
> -                    "network" => {"href" =>
opts[:address_template].network.href},
> -                    "operations" => [{"rel"=>"edit", "href"=> id},
> -                                     {"rel"=>"delete", "href"=> id}]
> -                   }
> -      address =
CIMI::Model::Address.from_json(JSON.generate(addr_hash))
> -      @client.store_cimi(:address, address)
> -      address
> -    end
> -
> -    def delete_address(credentials, id)
> -      check_credentials(credentials)
> -      @client.destroy_cimi(:address, id)
> -    end
> -
> -    def address_templates(credentials, opts={})
> -      check_credentials(credentials)
> -      if opts[:id].nil?
> -        address_templates =
> @client.load_all_cimi(:address_template).map{|addr_templ|
> CIMI::Model::AddressTemplate.from_json(addr_templ)}
> -
> address_templates.map{|addr_templ|convert_cimi_mock_urls(:address_t
> emplate, addr_templ, opts[:env])}.flatten
> -      else
> -        address_template =
> CIMI::Model::AddressTemplate.from_json(@client.load_cimi(:address_tem
> plate, opts[:id]))
> -        convert_cimi_mock_urls(:address_template, address_template,
> opts[:env])
> -      end
> -    end
> -
>      private
> 
>      def convert_cimi_mock_urls(model_name, cimi_object, context)
> @@ -270,15 +140,6 @@ module Deltacloud::Drivers::Mock
>        end
>      end
> 
> -    def update_object_state(id, object, new_state)
> -      klass = CIMI::Model.const_get("#{object}")
> -      symbol = object.to_s.downcase.singularize.intern
> -      obj = klass.from_json(@client.load_cimi(symbol, id))
> -      obj.state = new_state
> -      @client.store_cimi(symbol, obj)
> -      obj
> -    end
> -
>    end
> 
>  end
> diff --git
a/server/lib/deltacloud/drivers/opennebula/opennebula_driver.rb
> b/server/lib/deltacloud/drivers/opennebula/opennebula_driver.rb
> index 371e170..03c337f 100644
> --- a/server/lib/deltacloud/drivers/opennebula/opennebula_driver.rb
> +++ b/server/lib/deltacloud/drivers/opennebula/opennebula_driver.rb
> @@ -28,10 +28,6 @@ module Deltacloud
> 
>  class OpennebulaDriver < Deltacloud::BaseDriver
> 
> -  def supported_collections
> -    DEFAULT_COLLECTIONS - [:storage_volumes, :storage_snapshots]
> -  end
> -
> 
> ##########################################################
> ############
>    # Hardware profiles
> 
> ##########################################################
> ###########
> @@ -152,8 +148,8 @@ class OpennebulaDriver < Deltacloud::BaseDriver
>      running.to(:running)        .on( :reboot )
>      running.to(:stopping)       .on( :stop )
>      stopping.to(:stopped)       .automatically
> -    running.to(:stopping)       .on( :destroy )
> -    stopping.to(:finish)        .automatically
> +    running.to(:shutting_down)  .on( :destroy )
> +    shutting_down.to(:finish)   .automatically
>    end
> 
>    def instances(credentials, opts=nil)
> diff --git
a/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
> b/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
> index c9ec95b..5d54d5b 100644
> --- a/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
> +++ b/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
> @@ -14,9 +14,9 @@
>  # under the License.
>  #
> 
> -require 'deltacloud/base_driver'
>  require 'openstack/compute'
>  require 'tempfile'
> +
>  module Deltacloud
>    module Drivers
>      module Openstack
> @@ -27,16 +27,12 @@ module Deltacloud
>          feature :instances, :user_files
>          feature :images, :user_name
> 
> -        def supported_collections
> -          DEFAULT_COLLECTIONS - [ :storage_snapshots,
:storage_volumes  ]
> #+ [ :buckets ]
> -        end
> -
>          define_instance_states do
>            start.to( :pending )          .on( :create )
>            pending.to( :running )        .automatically
>            running.to( :running )        .on( :reboot )
> -          running.to( :stopping )       .on( :stop )
> -          stopping.to( :stopped )       .automatically
> +          running.to( :shutting_down )  .on( :stop )
> +          shutting_down.to( :stopped )  .automatically
>            stopped.to( :finish )         .automatically
>          end
> 
> @@ -140,7 +136,7 @@ module Deltacloud
>            params[:name] = (opts[:name] && opts[:name].length>0)?
> opts[:name] : Time.now.to_s
>            params[:imageRef] = image_id
>            params[:flavorRef] =  (opts[:hwp_id] &&
opts[:hwp_id].length>0) ?
> -                          opts[:hwp_id] :
hardware_profiles(credentials).first.name
> +                          opts[:hwp_id] :
hardware_profiles(credentials).first
>            if opts[:password] && opts[:password].length > 0
>              params[:adminPass]=opts[:password]
>            end
> diff --git
a/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
> b/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
> index 1b019d4..f59f832 100644
> --- a/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
> +++ b/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
> @@ -14,7 +14,6 @@
>  # License for the specific language governing permissions and
limitations
>  # under the License.
> 
> -require 'deltacloud/base_driver'
>  require 'cloudfiles'
>  require 'cloudservers'
>  require 'base64'
> @@ -30,10 +29,6 @@ class RackspaceDriver < Deltacloud::BaseDriver
>    feature :instances, :user_files
>    feature :images, :user_name
> 
> -  def supported_collections
> -    DEFAULT_COLLECTIONS + [ :buckets ] -
> [ :storage_snapshots, :storage_volumes ]
> -  end
> -
>    def hardware_profiles(credentials, opts = {})
>      rs = new_client( credentials )
>      results = []
> @@ -194,8 +189,8 @@ class RackspaceDriver < Deltacloud::BaseDriver
>      start.to( :pending )          .on( :create )
>      pending.to( :running )        .automatically
>      running.to( :running )        .on( :reboot )
> -    running.to( :stopping )       .on( :stop )
> -    stopping.to( :stopped )       .automatically
> +    running.to( :shutting_down )  .on( :stop )
> +    shutting_down.to( :stopped )  .automatically
>      stopped.to( :finish )         .automatically
>    end
> 
> diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> index 1c96df7..f138f03 100644
> --- a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> +++ b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> @@ -14,27 +14,24 @@
>  # License for the specific language governing permissions and
limitations
>  # under the License.
> 
> -require 'deltacloud/base_driver'
>  require 'rbovirt'
> 
>  module Deltacloud
>    module Drivers
> -    module RHEVM
> +    module Rhevm
> 
> -class RHEVMDriver < Deltacloud::BaseDriver
> +class RhevmDriver < Deltacloud::BaseDriver
> 
> -  def supported_collections
> -    DEFAULT_COLLECTIONS - [:storage_snapshots]
> -  end
> -
> -  feature :instances, :user_name do
> -    constraint :max_length, 50
> +  Sinatra::Rabbit::InstancesCollection.features do
> +    feature :user_name, :for => :instances do
> +      constrain :max_length, 50
> +    end
>    end
> 
>    feature :instances, :user_data
>    feature :images, :user_name
> 
> -  USER_NAME_MAX =
> feature(:instances, :user_name).constraints[:max_length]
> +  USER_NAME_MAX =
>
Sinatra::Rabbit::InstancesCollection.feature(:user_name).constraints[:ma
x_l
> ength]
> 
>    # FIXME: These values are just for ilustration
>    # Also I choosed 'SERVER' and 'DESKTOP' names
> diff --git
a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
> b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
> index 58f8e1b..f44336a 100644
> --- a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
> +++ b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
> @@ -41,17 +41,16 @@ class RimuHostingClient
>        headers["Authorization"] = @auth
>      end
>      safely do
> -      r = @service.send_request(method, @uri.path + resource, data,
> headers)
> -          puts r.body
> -      res = JSON.parse(r.body)
> -      res = res[res.keys[0]]
> +    r = @service.send_request(method, @uri.path + resource, data,
> headers)
> +         puts r.body
> +    res = JSON.parse(r.body)
> +    res = res[res.keys[0]]
> 
> -      if(res['response_type'] == "ERROR" and (
(res['error_info']['error_class']
> == "PermissionException") or
> +    if(res['response_type'] == "ERROR" and (
(res['error_info']['error_class']
> == "PermissionException") or
>
(res['error_info']['error_class'] ==
> "LoginRequired") ))
> -        raise "AuthFailure"
> -      end
> -      res
> +      raise "AuthFailure"
>      end
> +    res
>    end
> 
>    def list_images
> @@ -82,6 +81,6 @@ class RimuHostingClient
>    end
>  end
> 
> +    end
>    end
>  end
> -end
> diff --git
a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
> b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
> index 67c415c..8633d53 100644
> --- a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
> +++ b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
> @@ -16,7 +16,6 @@
>  # License for the specific language governing permissions and
limitations
>  # under the License.
> 
> -require "deltacloud/base_driver"
>  require "deltacloud/drivers/rimuhosting/rimuhosting_client"
> 
>  module Deltacloud
> @@ -131,9 +130,9 @@ class RimuHostingDriver < Deltacloud::BaseDriver
>              :owner_id => "root",
>              :instance_profile => InstanceProfile.new("none"),
>              :actions => instance_actions_for("RUNNING"),
> -            :public_addresses =>
> [ InstanceAddress.new(inst["allocated_ips"]["primary_ip"] ) ],
> -            :launch_time =>
inst["billing_info"]["order_date"]["iso_format"]
> -    })
> +            :public_addresses =>
> [ InstanceAddress.new(inst["allocated_ips"]["primary_ip"] )],
> +            :launch_time =>
inst["billing_info"]["order_date"]["iso_format"]}
> +                )
>    end
> 
>    define_instance_states do
> @@ -142,9 +141,9 @@ class RimuHostingDriver < Deltacloud::BaseDriver
>      pending.to( :running )        .automatically
> 
>      running.to( :running )        .on(:reboot)
> -    running.to( :stopping )       .on(:stop)
> +    running.to( :shutting_down )  .on(:stop)
> 
> -    stopping.to( :stopped )       .automatically
> +    shutting_down.to( :stopped )  .automatically
> 
>      stopped.to( :finish )         .automatically
>    end
> diff --git
a/server/lib/deltacloud/drivers/terremark/terremark_driver.rb
> b/server/lib/deltacloud/drivers/terremark/terremark_driver.rb
> index 2dba02a..2e087cb 100644
> --- a/server/lib/deltacloud/drivers/terremark/terremark_driver.rb
> +++ b/server/lib/deltacloud/drivers/terremark/terremark_driver.rb
> @@ -19,8 +19,7 @@
>  # https://community.vcloudexpress.terremark.com/en-
> us/product_docs/w/wiki/d-complete-vcloud-express-api-document.aspx
>  #
>  # 02 May 2010
> -#
> -require 'deltacloud/base_driver'
> +
>  require 'fog'
>  require 'excon'
>  require 'nokogiri'
> @@ -118,8 +117,8 @@ VAPP_STATE_MAP = { "0" =>  "PENDING", "1" =>
> "PENDING", "2" =>  "STOPPED", "4"
>      pending.to(:stopped)          .automatically
>      stopped.to(:running)          .on( :start )
>      running.to(:running)          .on( :reboot )
> -    running.to(:stopping)         .on( :stop )
> -    stopping.to(:stopped)         .automatically
> +    running.to(:shutting_down)    .on( :stop )
> +    shutting_down.to(:stopped)    .automatically
>      stopped.to(:finish)           .on( :destroy )
>     end
> 
> diff --git a/server/lib/deltacloud/drivers/vsphere/vsphere_driver.rb
> b/server/lib/deltacloud/drivers/vsphere/vsphere_driver.rb
> index e16be2f..7ac908a 100644
> --- a/server/lib/deltacloud/drivers/vsphere/vsphere_driver.rb
> +++ b/server/lib/deltacloud/drivers/vsphere/vsphere_driver.rb
> @@ -14,18 +14,17 @@
>  # under the License.
>  #
> 
> -require 'deltacloud/base_driver'
>  require 'rbvmomi'
>  require 'deltacloud/drivers/vsphere/vsphere_client'
> 
> -module Deltacloud::Drivers::VSphere
> +module Deltacloud::Drivers::Vsphere
> 
>    MAPPER_STORAGE_ROOT = File::join("/var/tmp", "deltacloud-vsphere-
> #{ENV["USER"]}")
> 
> -  class VSphereDriver < Deltacloud::BaseDriver
> +  class VsphereDriver < Deltacloud::BaseDriver
> 
>      include Deltacloud::Drivers::VSphere::Helper
> -    include Deltacloud::Drivers::VSphere::FileManager
> +    include VSphere::FileManager
> 
>      # You can use 'user_iso' feature to set 'user_iso' parameter when
> creating
>      # a new instance where this parameter can hold gzipped CDROM iso
> which will
> @@ -34,10 +33,6 @@ module Deltacloud::Drivers::VSphere
>      feature :instances, :user_data
>      feature :instances, :user_name
> 
> -    def supported_collections
> -      DEFAULT_COLLECTIONS - [:storage_volumes, :storage_snapshots]
> -    end
> -
>      # There is just one hardware profile where memory is measured
using
> maximum
>      # memory available on ESX for virtual machines and CPU using
maximum
> free
>      # CPU cores in ESX.
> @@ -68,8 +63,8 @@ module Deltacloud::Drivers::VSphere
>        pending.to(:stopped)        .automatically
>        stopped.to(:running)        .on( :start )
>        running.to(:running)        .on( :reboot )
> -      running.to(:stopping)       .on( :stop )
> -      stopping.to(:stopped)       .automatically
> +      running.to(:shutting_down)  .on( :stop )
> +      shutting_down.to(:stopped)  .automatically
>        stopped.to(:finish)         .on( :destroy )
>      end
> 
> --
> 1.7.10
>