You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltacloud.apache.org by mf...@apache.org on 2012/05/22 22:19:38 UTC

[41/50] [abbrv] git commit: Core: Added the Deltacloud library wrapper (require 'lib/deltacloud')

Core: Added the Deltacloud library wrapper (require 'lib/deltacloud')

This will make possible to use Deltacloud drivers API with thirty-party
application whithout spawning a server.


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

Branch: refs/heads/master
Commit: 09cb888686d80d6a18e16dbe9f795e6526f29fe6
Parents: b504b17
Author: Michal Fojtik <mf...@redhat.com>
Authored: Tue Apr 17 15:27:10 2012 +0200
Committer: Michal fojtik <mf...@redhat.com>
Committed: Tue May 22 22:17:35 2012 +0200

----------------------------------------------------------------------
 server/lib/deltacloud.rb         |   79 ++++++++++++++++++++++++++++----
 server/tests/api/common.rb       |    1 +
 server/tests/api/driver_test.rb  |   79 +++++++++++++++++++++++++++++++++
 server/tests/api/library_test.rb |   48 ++++++++++++++++++++
 4 files changed, 197 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltacloud/blob/09cb8886/server/lib/deltacloud.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud.rb b/server/lib/deltacloud.rb
index 6ff547e..6508d8d 100644
--- a/server/lib/deltacloud.rb
+++ b/server/lib/deltacloud.rb
@@ -1,4 +1,3 @@
-#
 # 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
@@ -14,14 +13,74 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-require 'deltacloud/drivers'
+require 'rubygems'
+
+load File.join(File.dirname(__FILE__), 'deltacloud/core_ext.rb')
+
+require 'ostruct'
+
+require_relative 'deltacloud/core_ext/string'
+require_relative 'deltacloud/core_ext/array'
+require_relative 'deltacloud/core_ext/hash'
+require_relative 'deltacloud/core_ext/integer'
+require_relative 'deltacloud/core_ext/proc'
+require_relative 'deltacloud/models'
+require_relative 'deltacloud/drivers'
+require_relative 'deltacloud/helpers/driver_helper'
+
+module Deltacloud
+
+  API_VERSION = '0.5.0'
+
+  def self.drivers
+    Drivers.driver_config
+  end
+
+  class Library
+    include Helpers::Drivers
+
+    attr_reader :backend, :credentials
+
+    def initialize(driver_name, opts={}, &block)
+      Thread.current[:driver] = driver_name.to_s
+      Thread.current[:provider] = opts[:provider]
+      @backend = driver
+      opts[:user] ||= 'mockuser'
+      opts[:password] ||= 'mockpassword'
+      @credentials = OpenStruct.new(:user => opts[:user], :password => opts[:password])
+      yield backend if block_given?
+    end
+
+    def version
+      Deltacloud::API_VERSION
+    end
+
+    def current_provider
+      Thread.current[:provider]
+    end
+
+    def current_driver
+      Thread.current[:driver]
+    end
+
+    def providers
+      Deltacloud.drivers[current_driver.to_sym]
+    end
+
+    def method_missing(name, *args)
+      return super unless backend.respond_to? name
+      begin
+        params = ([@credentials] + args).flatten
+        backend.send(name, *params)
+      rescue ArgumentError
+        backend.send(name, *args)
+      end
+    end
+
+  end
 
-require 'deltacloud/core_ext'
+  def self.new(driver_name, opts={}, &block)
+    Library.new(driver_name, opts, &block)
+  end
 
-require 'deltacloud/base_driver'
-require 'deltacloud/hardware_profile'
-require 'deltacloud/state_machine'
-require 'deltacloud/helpers'
-require 'deltacloud/models'
-require 'deltacloud/validation'
-require 'deltacloud/runner'
+end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/09cb8886/server/tests/api/common.rb
----------------------------------------------------------------------
diff --git a/server/tests/api/common.rb b/server/tests/api/common.rb
new file mode 100644
index 0000000..3554a81
--- /dev/null
+++ b/server/tests/api/common.rb
@@ -0,0 +1 @@
+require 'minitest/autorun'

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/09cb8886/server/tests/api/driver_test.rb
----------------------------------------------------------------------
diff --git a/server/tests/api/driver_test.rb b/server/tests/api/driver_test.rb
new file mode 100644
index 0000000..20f9197
--- /dev/null
+++ b/server/tests/api/driver_test.rb
@@ -0,0 +1,79 @@
+require_relative './common'
+require_relative '../../lib/deltacloud'
+
+begin
+  require 'arguments'
+rescue LoadError
+  puts "You don't have 'rdp-arguments' gems installed. (gem install rdp-arguments)"
+  exit(1)
+end
+require 'pp'
+
+describe 'Deltacloud drivers API' do
+
+  before do
+    @stderr = $stderr.clone
+    $stderr = StringIO.new
+  end
+
+  after do
+    $stderr = @stderr
+  end
+
+  it 'should pass the known method to Deltacloud driver' do
+    Deltacloud.new(:mock).hardware_profiles.must_be_kind_of Array
+    Deltacloud.new(:mock).hardware_profiles.wont_be_empty
+  end
+
+  it 'should raise NoMethodError when driver does not respond to method' do
+    lambda { Deltacloud.new(:mock).non_existing_method }.must_raise NoMethodError
+  end
+
+  it 'should apply the credentials to methods that require them' do
+    Deltacloud.new(:mock).realms.must_be_kind_of Array
+    Deltacloud.new(:mock).realms.wont_be_empty
+  end
+
+  it 'should allow to use different drivers' do
+    Deltacloud.new(:ec2).backend.must_be_instance_of Deltacloud::Drivers::Ec2::Ec2Driver
+    Deltacloud.new(:mock).backend.must_be_instance_of Deltacloud::Drivers::Mock::MockDriver
+  end
+
+  it 'should support loading all supported drivers' do
+    Deltacloud.drivers.keys.each do |key|
+      Deltacloud.new(key).current_driver.must_equal key.to_s
+    end
+  end
+
+  METHODS = {
+    :firewalls => [[:credentials], [:opts, "{  }"]],
+    :firewall  => [[:credentials], [:opts, "{  }"]],
+    :keys    => [[:credentials], [:opts, "{  }"]],
+    :key     => [[:credentials], [:opts]],
+    :storage_snapshots => [[:credentials], [:opts, "{  }"]],
+    :storage_snapshot  => [[:credentials], [:opts]],
+    :storage_volumes => [[:credentials], [:opts, "{  }"]],
+    :storage_volume  => [[:credentials], [:opts]],
+    :realms    => [[:credentials], [:opts, "{  }"]],
+    :realm     => [[:credentials], [:opts]],
+    :images    => [[:credentials], [:opts, "{  }"]],
+    :image     => [[:credentials], [:opts]],
+    :instances => [[:credentials], [:opts, "{  }"]],
+    :instance  => [[:credentials], [:opts]],
+    :create_instance => [[:credentials], [:image_id], [:opts, "{  }"]],
+    :destroy_instance => [[:credentials], [:id]],
+    :stop_instance => [[:credentials], [:id]],
+    :start_instance => [[:credentials], [:id]],
+    :reboot_instance => [[:credentials], [:id]],
+  }
+
+  Deltacloud.drivers.keys.each do |key|
+    METHODS.each do |m, definition|
+      it "should have the correct parameters for the :#{m} method in #{key} driver" do
+        next unless Deltacloud.new(key).backend.respond_to? m
+        Arguments.names(Deltacloud.new(key).backend.class, m).must_equal definition
+      end
+    end
+  end
+
+end

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/09cb8886/server/tests/api/library_test.rb
----------------------------------------------------------------------
diff --git a/server/tests/api/library_test.rb b/server/tests/api/library_test.rb
new file mode 100644
index 0000000..72d00ef
--- /dev/null
+++ b/server/tests/api/library_test.rb
@@ -0,0 +1,48 @@
+require_relative './common'
+require_relative '../../lib/deltacloud'
+
+require 'pp'
+
+describe 'Deltacloud API Library' do
+
+  it 'should return the driver configuration' do
+    Deltacloud.must_respond_to :drivers
+    Deltacloud.drivers.wont_be_nil
+    Deltacloud.drivers.must_be_kind_of Hash
+  end
+
+  it 'should be constructed just using the driver parameter' do
+    Deltacloud.new(:mock).must_be_instance_of Deltacloud::Library
+    Deltacloud.new(:mock).current_provider.must_be_nil
+    Deltacloud.new(:mock).current_driver.must_equal 'mock'
+    Deltacloud.new(:mock).backend.must_be_instance_of Deltacloud::Drivers::Mock::MockDriver
+    Deltacloud.new(:mock).credentials.user.must_equal 'mockuser'
+    Deltacloud.new(:mock).credentials.password.must_equal 'mockpassword'
+  end
+
+  it 'should allow to set credentials' do
+    Deltacloud.new(:mock, :user => 'testuser', :password => 'testpassword').credentials.user.must_equal 'testuser'
+    Deltacloud.new(:mock, :user => 'testuser', :password => 'testpassword').credentials.password.must_equal 'testpassword'
+  end
+
+  it 'should allow to set the provider' do
+    Deltacloud.new(:mock, :provider => 'someprovider').current_provider.must_equal 'someprovider'
+    Deltacloud.new(:mock).current_provider.must_be_nil
+  end
+
+  it 'should return pre-defined providers for the driver' do
+    Deltacloud.new(:ec2).providers[:entrypoints].must_be_kind_of Hash
+  end
+
+  it 'should yield the backend driver' do
+    Deltacloud.new :mock do |mock|
+      mock.must_be_instance_of Deltacloud::Drivers::Mock::MockDriver
+    end
+  end
+
+  it 'should return the API version' do
+    Deltacloud::API_VERSION.wont_be_empty
+    Deltacloud::new(:mock).version.wont_be_empty
+  end
+
+end