openstack-compute 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +6 -4
- data/VERSION +1 -1
- data/lib/openstack/compute.rb +1 -1
- data/lib/openstack/compute/authentication.rb +66 -13
- data/lib/openstack/compute/connection.rb +20 -15
- data/test/authentication_test.rb +36 -0
- data/test/connection_test.rb +39 -0
- data/test/exception_test.rb +49 -0
- data/test/servers_test.rb +123 -0
- data/test/test_helper.rb +23 -0
- metadata +15 -6
    
        data/README.rdoc
    CHANGED
    
    | @@ -1,8 +1,10 @@ | |
| 1 | 
            -
            = Ruby OpenStack
         | 
| 1 | 
            +
            = Ruby OpenStack Compute
         | 
| 2 2 |  | 
| 3 3 | 
             
            == Description
         | 
| 4 4 |  | 
| 5 | 
            -
            Ruby Openstack Compute binding.
         | 
| 5 | 
            +
            Ruby Openstack Compute binding for the v1.0 OSAPI.
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            Currently supports both v1.0 and v2.0 (keystone) auth.
         | 
| 6 8 |  | 
| 7 9 | 
             
            == Examples
         | 
| 8 10 |  | 
| @@ -10,7 +12,7 @@ See the class definitions for documentation on specific methods and operations. | |
| 10 12 |  | 
| 11 13 | 
             
              require 'openstack/compute'
         | 
| 12 14 |  | 
| 13 | 
            -
              cs = OpenStack::Compute::Connection.new(:username => USERNAME, :api_key => API_KEY, : | 
| 15 | 
            +
              cs = OpenStack::Compute::Connection.new(:username => USERNAME, :api_key => API_KEY, :auth_url => API_URL)	
         | 
| 14 16 |  | 
| 15 17 | 
             
              # Get a listing of all current servers
         | 
| 16 18 | 
             
              >> cs.servers
         | 
| @@ -63,7 +65,7 @@ See the class definitions for documentation on specific methods and operations. | |
| 63 65 |  | 
| 64 66 | 
             
            == Authors
         | 
| 65 67 |  | 
| 66 | 
            -
            By Dan Prince <dan.prince@rackspace.com | 
| 68 | 
            +
            By Dan Prince <dan.prince@rackspace.com>, Naveed Massjouni <naveedm9@gmail.com>
         | 
| 67 69 |  | 
| 68 70 | 
             
            Based on the Rackspace Cloud Servers Ruby API.
         | 
| 69 71 |  | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            1.0. | 
| 1 | 
            +
            1.0.1
         | 
    
        data/lib/openstack/compute.rb
    CHANGED
    
    | @@ -9,7 +9,7 @@ | |
| 9 9 | 
             
            # To begin reviewing the available methods and examples, view the README.rdoc file, or begin by looking at documentation for the OpenStack::Compute::Connection class.
         | 
| 10 10 | 
             
            #
         | 
| 11 11 | 
             
            # Example:
         | 
| 12 | 
            -
            # OpenStack::Compute::Connection.new(:username => USERNAME, :api_key => API_KEY, : | 
| 12 | 
            +
            # OpenStack::Compute::Connection.new(:username => USERNAME, :api_key => API_KEY, :auth_url => API_URL) method.
         | 
| 13 13 | 
             
            module OpenStack
         | 
| 14 14 | 
             
            module Compute
         | 
| 15 15 |  | 
| @@ -1,19 +1,70 @@ | |
| 1 1 | 
             
            module OpenStack
         | 
| 2 2 | 
             
            module Compute
         | 
| 3 | 
            +
             | 
| 3 4 | 
             
              class Authentication
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                # Performs an authentication to the OpenStack auth server.
         | 
| 7 | 
            +
                # If it succeeds, it sets the svrmgmthost, svrmgtpath, svrmgmtport,
         | 
| 8 | 
            +
                # svrmgmtscheme, authtoken, and authok variables on the connection.
         | 
| 9 | 
            +
                # If it fails, it raises an exception.
         | 
| 10 | 
            +
                def self.init(conn)
         | 
| 11 | 
            +
                  if conn.auth_path =~ /.*v2.0\/tokens$/
         | 
| 12 | 
            +
                    AuthV20.new(conn)
         | 
| 13 | 
            +
                  else
         | 
| 14 | 
            +
                    AuthV10.new(conn)
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              private
         | 
| 21 | 
            +
              class AuthV20
         | 
| 22 | 
            +
                
         | 
| 23 | 
            +
                def initialize(connection)
         | 
| 24 | 
            +
                  begin
         | 
| 25 | 
            +
                    server = Net::HTTP::Proxy(connection.proxy_host, connection.proxy_port).new(connection.auth_host, connection.auth_port)
         | 
| 26 | 
            +
                    if connection.auth_scheme == "https"
         | 
| 27 | 
            +
                      server.use_ssl = true
         | 
| 28 | 
            +
                      server.verify_mode = OpenSSL::SSL::VERIFY_NONE
         | 
| 29 | 
            +
                    end
         | 
| 30 | 
            +
                    server.start
         | 
| 31 | 
            +
                  rescue
         | 
| 32 | 
            +
                    raise OpenStack::Compute::Exception::Connection, "Unable to connect to #{server}"
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  auth_data = JSON.generate({ "passwordCredentials" => { "username" => connection.authuser, "password" => connection.authkey }})
         | 
| 36 | 
            +
                  response = server.post(connection.auth_path, auth_data, {'Content-Type' => 'application/json'})
         | 
| 37 | 
            +
                  if (response.code =~ /^20./)
         | 
| 38 | 
            +
                    resp_data=JSON.parse(response.body)
         | 
| 39 | 
            +
                    connection.authtoken = resp_data['auth']['token']['id']
         | 
| 40 | 
            +
                    if resp_data['auth']['serviceCatalog'] and resp_data['auth']['serviceCatalog'][connection.service_name] and resp_data['auth']['serviceCatalog'][connection.service_name][0] then
         | 
| 41 | 
            +
                      uri = URI.parse(resp_data['auth']['serviceCatalog'][connection.service_name][0]['publicURL'])
         | 
| 42 | 
            +
                      connection.svrmgmthost = uri.host
         | 
| 43 | 
            +
                      connection.svrmgmtpath = uri.path
         | 
| 44 | 
            +
                      # Force the path into the v1.0 URL space
         | 
| 45 | 
            +
                      connection.svrmgmtpath.sub!(/\/.*\/?/, '/v1.0/')
         | 
| 46 | 
            +
                      connection.svrmgmtport = uri.port
         | 
| 47 | 
            +
                      connection.svrmgmtscheme = uri.scheme
         | 
| 48 | 
            +
                      connection.authok = true
         | 
| 49 | 
            +
                    else
         | 
| 50 | 
            +
                      connection.authok = false
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
                  else
         | 
| 53 | 
            +
                    connection.authtoken = false
         | 
| 54 | 
            +
                    raise OpenStack::Compute::Exception::Authentication, "Authentication failed with response code #{response.code}"
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
                  server.finish
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
              class AuthV10
         | 
| 4 61 |  | 
| 5 | 
            -
                # Performs an authentication to the OpenStack authorization servers.  Opens a new HTTP connection to the API server,
         | 
| 6 | 
            -
                # sends the credentials, and looks for a successful authentication.  If it succeeds, it sets the svrmgmthost,
         | 
| 7 | 
            -
                # svrmgtpath, svrmgmtport, svrmgmtscheme, authtoken, and authok variables on the connection.  If it fails, it raises
         | 
| 8 | 
            -
                # an exception.
         | 
| 9 | 
            -
                #
         | 
| 10 | 
            -
                # Should probably never be called directly.
         | 
| 11 62 | 
             
                def initialize(connection)
         | 
| 12 63 | 
             
                  path = '/v1.0'
         | 
| 13 64 | 
             
                  hdrhash = { "X-Auth-User" => connection.authuser, "X-Auth-Key" => connection.authkey }
         | 
| 14 65 | 
             
                  begin
         | 
| 15 | 
            -
                    server = Net::HTTP::Proxy(connection.proxy_host, connection.proxy_port).new(connection. | 
| 16 | 
            -
                    if connection. | 
| 66 | 
            +
                    server = Net::HTTP::Proxy(connection.proxy_host, connection.proxy_port).new(connection.auth_host, connection.auth_port)
         | 
| 67 | 
            +
                    if connection.auth_scheme == "https"
         | 
| 17 68 | 
             
                      server.use_ssl = true
         | 
| 18 69 | 
             
                      server.verify_mode = OpenSSL::SSL::VERIFY_NONE
         | 
| 19 70 | 
             
                    end
         | 
| @@ -24,12 +75,13 @@ module Compute | |
| 24 75 | 
             
                  response = server.get(path,hdrhash)
         | 
| 25 76 | 
             
                  if (response.code =~ /^20./)
         | 
| 26 77 | 
             
                    connection.authtoken = response["x-auth-token"]
         | 
| 27 | 
            -
                     | 
| 28 | 
            -
                    connection. | 
| 78 | 
            +
                    uri = URI.parse(response["x-server-management-url"])
         | 
| 79 | 
            +
                    connection.svrmgmthost = uri.host
         | 
| 80 | 
            +
                    connection.svrmgmtpath = uri.path
         | 
| 29 81 | 
             
                    # Force the path into the v1.0 URL space
         | 
| 30 | 
            -
                    connection.svrmgmtpath.sub!( | 
| 31 | 
            -
                    connection.svrmgmtport =  | 
| 32 | 
            -
                    connection.svrmgmtscheme =  | 
| 82 | 
            +
                    connection.svrmgmtpath.sub!(/\/.*\/?/, '/v1.0/')
         | 
| 83 | 
            +
                    connection.svrmgmtport = uri.port
         | 
| 84 | 
            +
                    connection.svrmgmtscheme = uri.scheme
         | 
| 33 85 | 
             
                    connection.authok = true
         | 
| 34 86 | 
             
                  else
         | 
| 35 87 | 
             
                    connection.authtoken = false
         | 
| @@ -38,5 +90,6 @@ module Compute | |
| 38 90 | 
             
                  server.finish
         | 
| 39 91 | 
             
                end
         | 
| 40 92 | 
             
              end
         | 
| 93 | 
            +
             | 
| 41 94 | 
             
            end
         | 
| 42 95 | 
             
            end
         | 
| @@ -10,9 +10,11 @@ module Compute | |
| 10 10 | 
             
                attr_accessor :svrmgmtpath
         | 
| 11 11 | 
             
                attr_accessor :svrmgmtport
         | 
| 12 12 | 
             
                attr_accessor :svrmgmtscheme
         | 
| 13 | 
            -
                attr_reader   : | 
| 14 | 
            -
                attr_reader   : | 
| 15 | 
            -
                attr_reader   : | 
| 13 | 
            +
                attr_reader   :auth_host
         | 
| 14 | 
            +
                attr_reader   :auth_port
         | 
| 15 | 
            +
                attr_reader   :auth_scheme
         | 
| 16 | 
            +
                attr_reader   :auth_path
         | 
| 17 | 
            +
                attr_accessor :service_name
         | 
| 16 18 | 
             
                attr_reader   :proxy_host
         | 
| 17 19 | 
             
                attr_reader   :proxy_port
         | 
| 18 20 |  | 
| @@ -22,34 +24,37 @@ module Compute | |
| 22 24 | 
             
                #
         | 
| 23 25 | 
             
                #   :username - Your Openstack username *required*
         | 
| 24 26 | 
             
                #   :api_key - Your Openstack API key *required*
         | 
| 25 | 
            -
                #   : | 
| 27 | 
            +
                #   :auth_url - Configurable auth_url endpoint.
         | 
| 28 | 
            +
                #   :service_name - (Optional for v2.0 auth only). The name of the compute service to use. Defaults to 'nova'.
         | 
| 26 29 | 
             
                #   :retry_auth - Whether to retry if your auth token expires (defaults to true)
         | 
| 27 30 | 
             
                #   :proxy_host - If you need to connect through a proxy, supply the hostname here
         | 
| 28 31 | 
             
                #   :proxy_port - If you need to connect through a proxy, supply the port here
         | 
| 29 32 | 
             
                #
         | 
| 30 | 
            -
                #   cf = OpenStack::Compute::Connection.new(:username => 'USERNAME', :api_key => 'API_KEY', : | 
| 33 | 
            +
                #   cf = OpenStack::Compute::Connection.new(:username => 'USERNAME', :api_key => 'API_KEY', :auth_url => 'AUTH_URL')
         | 
| 31 34 | 
             
                def initialize(options = {:retry_auth => true}) 
         | 
| 32 35 | 
             
                  @authuser = options[:username] || (raise Exception::MissingArgument, "Must supply a :username")
         | 
| 33 36 | 
             
                  @authkey = options[:api_key] || (raise Exception::MissingArgument, "Must supply an :api_key")
         | 
| 34 | 
            -
                  @ | 
| 37 | 
            +
                  @auth_url = options[:auth_url] || (raise Exception::MissingArgument, "Must supply an :auth_url")
         | 
| 38 | 
            +
                  @service_name = options[:service_name] || "nova"
         | 
| 35 39 |  | 
| 36 | 
            -
                   | 
| 40 | 
            +
                  auth_uri=nil
         | 
| 37 41 | 
             
                  begin
         | 
| 38 | 
            -
                     | 
| 42 | 
            +
                    auth_uri=URI.parse(@auth_url)
         | 
| 39 43 | 
             
                  rescue Exception => e
         | 
| 40 | 
            -
                    raise Exception::InvalidArgument, "Invalid : | 
| 44 | 
            +
                    raise Exception::InvalidArgument, "Invalid :auth_url parameter: #{e.message}"
         | 
| 41 45 | 
             
                  end
         | 
| 42 | 
            -
                  raise Exception::InvalidArgument, "Invalid : | 
| 43 | 
            -
                  @ | 
| 44 | 
            -
                  @ | 
| 45 | 
            -
                  @ | 
| 46 | 
            +
                  raise Exception::InvalidArgument, "Invalid :auth_url parameter." if auth_uri.nil? or auth_uri.host.nil?
         | 
| 47 | 
            +
                  @auth_host = auth_uri.host
         | 
| 48 | 
            +
                  @auth_port = auth_uri.port
         | 
| 49 | 
            +
                  @auth_scheme = auth_uri.scheme
         | 
| 50 | 
            +
                  @auth_path = auth_uri.path
         | 
| 46 51 |  | 
| 47 52 | 
             
                  @retry_auth = options[:retry_auth]
         | 
| 48 53 | 
             
                  @proxy_host = options[:proxy_host]
         | 
| 49 54 | 
             
                  @proxy_port = options[:proxy_port]
         | 
| 50 55 | 
             
                  @authok = false
         | 
| 51 56 | 
             
                  @http = {}
         | 
| 52 | 
            -
                  OpenStack::Compute::Authentication. | 
| 57 | 
            +
                  OpenStack::Compute::Authentication.init(self)
         | 
| 53 58 | 
             
                end
         | 
| 54 59 |  | 
| 55 60 | 
             
                # Returns true if the authentication was successful and returns false otherwise.
         | 
| @@ -79,7 +84,7 @@ module Compute | |
| 79 84 | 
             
                  retry
         | 
| 80 85 | 
             
                rescue OpenStack::Compute::Exception::ExpiredAuthToken
         | 
| 81 86 | 
             
                  raise OpenStack::Compute::Exception::Connection, "Authentication token expired and you have requested not to retry" if @retry_auth == false
         | 
| 82 | 
            -
                  OpenStack::Compute::Authentication. | 
| 87 | 
            +
                  OpenStack::Compute::Authentication.init(self)
         | 
| 83 88 | 
             
                  retry
         | 
| 84 89 | 
             
                end
         | 
| 85 90 |  | 
| @@ -0,0 +1,36 @@ | |
| 1 | 
            +
            require File.dirname(__FILE__) + '/test_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class AuthenticationTest < Test::Unit::TestCase
         | 
| 4 | 
            +
             
         | 
| 5 | 
            +
              def test_good_authentication
         | 
| 6 | 
            +
                response = {'x-server-management-url' => 'http://server-manage.example.com/path', 'x-auth-token' => 'dummy_token'}
         | 
| 7 | 
            +
                response.stubs(:code).returns('204')
         | 
| 8 | 
            +
                server = mock(:use_ssl= => true, :verify_mode= => true, :start => true, :finish => true)
         | 
| 9 | 
            +
                server.stubs(:get).returns(response)
         | 
| 10 | 
            +
                Net::HTTP.stubs(:new).returns(server)
         | 
| 11 | 
            +
                connection = stub(:authuser => 'bad_user', :authkey => 'bad_key', :auth_host => "a.b.c", :auth_port => "443", :auth_scheme => "https", :auth_path => "/v1.0", :authok= => true, :authtoken= => true, :svrmgmthost= => "", :svrmgmtpath= => "", :svrmgmtpath => "", :svrmgmtport= => "", :svrmgmtscheme= => "", :proxy_host => nil, :proxy_port => nil)
         | 
| 12 | 
            +
                result = OpenStack::Compute::Authentication.init(connection)
         | 
| 13 | 
            +
                assert_equal result.class, OpenStack::Compute::AuthV10
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
              
         | 
| 16 | 
            +
              def test_bad_authentication
         | 
| 17 | 
            +
                response = mock()
         | 
| 18 | 
            +
                response.stubs(:code).returns('499')
         | 
| 19 | 
            +
                server = mock(:use_ssl= => true, :verify_mode= => true, :start => true)
         | 
| 20 | 
            +
                server.stubs(:get).returns(response)
         | 
| 21 | 
            +
                Net::HTTP.stubs(:new).returns(server)
         | 
| 22 | 
            +
                connection = stub(:authuser => 'bad_user', :authkey => 'bad_key', :auth_host => "a.b.c", :auth_port => "443", :auth_scheme => "https", :auth_path => "/v1.0", :authok= => true, :authtoken= => true, :proxy_host => nil, :proxy_port => nil)
         | 
| 23 | 
            +
                assert_raises(OpenStack::Compute::Exception::Authentication) do
         | 
| 24 | 
            +
                  result = OpenStack::Compute::Authentication.init(connection)
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
                
         | 
| 28 | 
            +
              def test_bad_hostname
         | 
| 29 | 
            +
                Net::HTTP.stubs(:new).raises(OpenStack::Compute::Exception::Connection)
         | 
| 30 | 
            +
                connection = stub(:authuser => 'bad_user', :authkey => 'bad_key', :auth_host => "a.b.c", :auth_port => "443", :auth_scheme => "https", :auth_path => "/v1.0", :authok= => true, :authtoken= => true, :proxy_host => nil, :proxy_port => nil)
         | 
| 31 | 
            +
                assert_raises(OpenStack::Compute::Exception::Connection) do
         | 
| 32 | 
            +
                  result = OpenStack::Compute::Authentication.init(connection)
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
                
         | 
| 36 | 
            +
            end
         | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            require File.dirname(__FILE__) + '/test_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class ComputeConnectionTest < Test::Unit::TestCase
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              def setup
         | 
| 6 | 
            +
                connection = stub()
         | 
| 7 | 
            +
                OpenStack::Compute::Authentication.stubs(:init).returns(connection)
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
              
         | 
| 10 | 
            +
              def test_init_connection_no_credentials
         | 
| 11 | 
            +
                assert_raises(OpenStack::Compute::Exception::MissingArgument) do
         | 
| 12 | 
            +
                  conn = OpenStack::Compute::Connection.new(:api_key => "AABBCCDD11", :auth_url => "a.b.c")
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              def test_init_connection_no_password
         | 
| 17 | 
            +
                assert_raises(OpenStack::Compute::Exception::MissingArgument) do
         | 
| 18 | 
            +
                  conn = OpenStack::Compute::Connection.new(:username => "test_account", :auth_url => "a.b.c")
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              def test_init_connection_no_auth_url
         | 
| 23 | 
            +
                assert_raises(OpenStack::Compute::Exception::MissingArgument) do
         | 
| 24 | 
            +
                  conn = OpenStack::Compute::Connection.new(:username => "test_account", :api_key => "AABBCCDD11")
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              def test_init_connection_bad_auth_url
         | 
| 29 | 
            +
                assert_raises(OpenStack::Compute::Exception::InvalidArgument) do
         | 
| 30 | 
            +
                  conn = OpenStack::Compute::Connection.new(:username => "test_account", :api_key => "AABBCCDD11", :auth_url => "***")
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              def test_init_connection
         | 
| 35 | 
            +
                  conn = OpenStack::Compute::Connection.new(:username => "test_account", :api_key => "AABBCCDD11", :auth_url => "https://a.b.c")
         | 
| 36 | 
            +
                  assert_not_nil conn, "Connection.new returned nil."
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
                
         | 
| 39 | 
            +
            end
         | 
| @@ -0,0 +1,49 @@ | |
| 1 | 
            +
            require File.dirname(__FILE__) + '/test_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class ExceptionTest < Test::Unit::TestCase
         | 
| 4 | 
            +
              
         | 
| 5 | 
            +
              def test_400_cloud_servers_fault
         | 
| 6 | 
            +
                response = mock()
         | 
| 7 | 
            +
                response.stubs(:code => "400", :body => "{\"ComputeFault\":{\"message\":\"422 Unprocessable Entity: We could not process your request at this time. We have been notified and are looking into the issue.  [E03]\",\"details\":\"com.rackspace.cloud.service.servers.OpenStack::ComputeFault: Fault occured\",\"code\":400}}" )
         | 
| 8 | 
            +
                exception=nil
         | 
| 9 | 
            +
                begin
         | 
| 10 | 
            +
                  OpenStack::Compute::Exception.raise_exception(response)
         | 
| 11 | 
            +
                rescue Exception => e
         | 
| 12 | 
            +
                  exception=e
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
                assert_equal(OpenStack::Compute::Exception::ComputeFault, e.class)
         | 
| 15 | 
            +
                assert_equal("400", e.response_code)
         | 
| 16 | 
            +
                assert_not_nil(e.response_body)
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              def test_413_over_limit
         | 
| 20 | 
            +
                response = mock()
         | 
| 21 | 
            +
                response.stubs(:code => "413", :body => "{\"overLimit\":{\"message\":\"Too many requests...\",\"code\":413,\"retryAfter\":\"2010-08-25T10:47:57.890-05:00\"}}")
         | 
| 22 | 
            +
                exception=nil
         | 
| 23 | 
            +
                begin
         | 
| 24 | 
            +
                  OpenStack::Compute::Exception.raise_exception(response)
         | 
| 25 | 
            +
                rescue Exception => e
         | 
| 26 | 
            +
                  exception=e
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
                assert_equal(OpenStack::Compute::Exception::OverLimit, e.class)
         | 
| 29 | 
            +
                assert_equal("413", e.response_code)
         | 
| 30 | 
            +
                assert_not_nil(e.response_body)
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              def test_other
         | 
| 34 | 
            +
                response = mock()
         | 
| 35 | 
            +
                body="{\"blahblah\":{\"message\":\"Failed...\",\"code\":500}}"
         | 
| 36 | 
            +
                response.stubs(:code => "500", :body => body)
         | 
| 37 | 
            +
                exception=nil
         | 
| 38 | 
            +
                begin
         | 
| 39 | 
            +
                  OpenStack::Compute::Exception.raise_exception(response)
         | 
| 40 | 
            +
                rescue Exception => e
         | 
| 41 | 
            +
                  exception=e
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
                assert_equal(OpenStack::Compute::Exception::Other, exception.class)
         | 
| 44 | 
            +
                assert_equal("500", exception.response_code)
         | 
| 45 | 
            +
                assert_not_nil(exception.response_body)
         | 
| 46 | 
            +
                assert_equal(body, exception.response_body)
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            end
         | 
| @@ -0,0 +1,123 @@ | |
| 1 | 
            +
            require File.dirname(__FILE__) + '/test_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class ServersTest < Test::Unit::TestCase
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              include TestConnection
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              def setup
         | 
| 8 | 
            +
                @conn=get_test_connection
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
              
         | 
| 11 | 
            +
              def test_list_servers
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            json_response = %{{
         | 
| 14 | 
            +
              "servers" : [
         | 
| 15 | 
            +
                  {
         | 
| 16 | 
            +
                 "id" : 1234,
         | 
| 17 | 
            +
                  "name" : "sample-server",
         | 
| 18 | 
            +
                  "imageId" : 2,
         | 
| 19 | 
            +
                  "flavorId" : 1,
         | 
| 20 | 
            +
                  "hostId" : "e4d909c290d0fb1ca068ffaddf22cbd0",
         | 
| 21 | 
            +
                  "status" : "BUILD",
         | 
| 22 | 
            +
                  "progress" : 60,
         | 
| 23 | 
            +
                  "addresses" : {
         | 
| 24 | 
            +
                      "public" : [
         | 
| 25 | 
            +
                          "67.23.10.132",
         | 
| 26 | 
            +
                          "67.23.10.131"
         | 
| 27 | 
            +
                      ],
         | 
| 28 | 
            +
                      "private" : [
         | 
| 29 | 
            +
                          "10.176.42.16"
         | 
| 30 | 
            +
                      ]
         | 
| 31 | 
            +
                  },
         | 
| 32 | 
            +
                  "metadata" : {
         | 
| 33 | 
            +
                      "Server Label" : "Web Head 1",
         | 
| 34 | 
            +
                      "Image Version" : "2.1"
         | 
| 35 | 
            +
                  }
         | 
| 36 | 
            +
                  },
         | 
| 37 | 
            +
                  {
         | 
| 38 | 
            +
                "id" : 5678,
         | 
| 39 | 
            +
                  "name" : "sample-server2",
         | 
| 40 | 
            +
                  "imageId" : 2,
         | 
| 41 | 
            +
                  "flavorId" : 1,
         | 
| 42 | 
            +
                  "hostId" : "9e107d9d372bb6826bd81d3542a419d6",
         | 
| 43 | 
            +
                  "status" : "ACTIVE",
         | 
| 44 | 
            +
                  "addresses" : {
         | 
| 45 | 
            +
                      "public" : [
         | 
| 46 | 
            +
                          "67.23.10.133"
         | 
| 47 | 
            +
                      ],
         | 
| 48 | 
            +
                      "private" : [
         | 
| 49 | 
            +
                          "10.176.42.17"
         | 
| 50 | 
            +
                      ]
         | 
| 51 | 
            +
                  },
         | 
| 52 | 
            +
                  "metadata" : {
         | 
| 53 | 
            +
                      "Server Label" : "DB 1"
         | 
| 54 | 
            +
                  }
         | 
| 55 | 
            +
                  }
         | 
| 56 | 
            +
              ]
         | 
| 57 | 
            +
            }}
         | 
| 58 | 
            +
                response = mock()
         | 
| 59 | 
            +
                response.stubs(:code => "200", :body => json_response)
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                @conn.stubs(:csreq).returns(response)
         | 
| 62 | 
            +
                servers=@conn.list_servers
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                assert_equal 2, servers.size
         | 
| 65 | 
            +
                assert_equal 1234, servers[0][:id]
         | 
| 66 | 
            +
                assert_equal "sample-server", servers[0][:name]
         | 
| 67 | 
            +
             | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
              def test_get_server
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                server=get_test_server
         | 
| 73 | 
            +
                assert "sample-server", server.name
         | 
| 74 | 
            +
                assert "2", server.imageId
         | 
| 75 | 
            +
                assert "1", server.flavorId
         | 
| 76 | 
            +
                assert "e4d909c290d0fb1ca068ffaddf22cbd0", server.hostId
         | 
| 77 | 
            +
                assert "BUILD", server.status
         | 
| 78 | 
            +
                assert "60", server.progress
         | 
| 79 | 
            +
                assert "67.23.10.132", server.addresses[:public][0]
         | 
| 80 | 
            +
                assert "67.23.10.131", server.addresses[:public][1]
         | 
| 81 | 
            +
                assert "10.176.42.16", server.addresses[:private][1]
         | 
| 82 | 
            +
             | 
| 83 | 
            +
              end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
            private
         | 
| 86 | 
            +
              def get_test_server
         | 
| 87 | 
            +
             | 
| 88 | 
            +
            json_response = %{{
         | 
| 89 | 
            +
              "server" : {
         | 
| 90 | 
            +
                  "id" : 1234,
         | 
| 91 | 
            +
                  "name" : "sample-server",
         | 
| 92 | 
            +
                  "imageId" : 2,
         | 
| 93 | 
            +
                  "flavorId" : 1,
         | 
| 94 | 
            +
                  "hostId" : "e4d909c290d0fb1ca068ffaddf22cbd0",
         | 
| 95 | 
            +
                  "status" : "BUILD",
         | 
| 96 | 
            +
                  "progress" : 60,
         | 
| 97 | 
            +
                  "addresses" : {
         | 
| 98 | 
            +
                      "public" : [
         | 
| 99 | 
            +
                           "67.23.10.132",
         | 
| 100 | 
            +
                           "67.23.10.131"
         | 
| 101 | 
            +
                      ],
         | 
| 102 | 
            +
                      "private" : [
         | 
| 103 | 
            +
                           "10.176.42.16"
         | 
| 104 | 
            +
                      ]
         | 
| 105 | 
            +
                  },
         | 
| 106 | 
            +
                  "metadata" : {
         | 
| 107 | 
            +
                      "Server Label" : "Web Head 1",
         | 
| 108 | 
            +
                      "Image Version" : "2.1"
         | 
| 109 | 
            +
                  }
         | 
| 110 | 
            +
              }
         | 
| 111 | 
            +
            }}
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                response = mock()
         | 
| 114 | 
            +
                response.stubs(:code => "200", :body => json_response)
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                @conn=get_test_connection
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                @conn.stubs(:csreq).returns(response)
         | 
| 119 | 
            +
                return @conn.server(1234) 
         | 
| 120 | 
            +
             | 
| 121 | 
            +
              end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
            end
         | 
    
        data/test/test_helper.rb
    ADDED
    
    | @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            require 'test/unit'
         | 
| 2 | 
            +
            $:.unshift File.dirname(__FILE__) + '/../lib'
         | 
| 3 | 
            +
            require 'openstack/compute'
         | 
| 4 | 
            +
            require 'rubygems'
         | 
| 5 | 
            +
            require 'mocha'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module TestConnection
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            def get_test_connection 
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                conn_response = {'x-server-management-url' => 'http://server-manage.example.com/path', 'x-auth-token' => 'dummy_token'}
         | 
| 12 | 
            +
                conn_response.stubs(:code).returns('204')
         | 
| 13 | 
            +
                #server = mock(:use_ssl= => true, :verify_mode= => true, :start => true, :finish => true)
         | 
| 14 | 
            +
                server = mock(:start => true, :finish => true)
         | 
| 15 | 
            +
                server.stubs(:get => conn_response, :use_ssl= => true, :verify_mode= => true)
         | 
| 16 | 
            +
                #server.stubs(:get).returns(conn_response)
         | 
| 17 | 
            +
                Net::HTTP.stubs(:new).returns(server)
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                OpenStack::Compute::Connection.new(:username => "test_account", :api_key => "AABBCCDD11", :auth_url => "http://a.b.c")
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,13 +1,13 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: openstack-compute
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              hash:  | 
| 4 | 
            +
              hash: 21
         | 
| 5 5 | 
             
              prerelease: false
         | 
| 6 6 | 
             
              segments: 
         | 
| 7 7 | 
             
              - 1
         | 
| 8 8 | 
             
              - 0
         | 
| 9 | 
            -
              -  | 
| 10 | 
            -
              version: 1.0. | 
| 9 | 
            +
              - 1
         | 
| 10 | 
            +
              version: 1.0.1
         | 
| 11 11 | 
             
            platform: ruby
         | 
| 12 12 | 
             
            authors: 
         | 
| 13 13 | 
             
            - Dan Prince
         | 
| @@ -15,7 +15,7 @@ autorequire: | |
| 15 15 | 
             
            bindir: bin
         | 
| 16 16 | 
             
            cert_chain: []
         | 
| 17 17 |  | 
| 18 | 
            -
            date: 2011-08- | 
| 18 | 
            +
            date: 2011-08-29 00:00:00 -04:00
         | 
| 19 19 | 
             
            default_executable: 
         | 
| 20 20 | 
             
            dependencies: 
         | 
| 21 21 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| @@ -51,6 +51,11 @@ files: | |
| 51 51 | 
             
            - lib/openstack/compute/flavor.rb
         | 
| 52 52 | 
             
            - lib/openstack/compute/image.rb
         | 
| 53 53 | 
             
            - lib/openstack/compute/server.rb
         | 
| 54 | 
            +
            - test/authentication_test.rb
         | 
| 55 | 
            +
            - test/exception_test.rb
         | 
| 56 | 
            +
            - test/test_helper.rb
         | 
| 57 | 
            +
            - test/connection_test.rb
         | 
| 58 | 
            +
            - test/servers_test.rb
         | 
| 54 59 | 
             
            has_rdoc: true
         | 
| 55 60 | 
             
            homepage: https://launchpad.net/ruby-openstack-compute
         | 
| 56 61 | 
             
            licenses: []
         | 
| @@ -85,5 +90,9 @@ rubygems_version: 1.3.7 | |
| 85 90 | 
             
            signing_key: 
         | 
| 86 91 | 
             
            specification_version: 3
         | 
| 87 92 | 
             
            summary: OpenStack Compute Ruby API
         | 
| 88 | 
            -
            test_files:  | 
| 89 | 
            -
             | 
| 93 | 
            +
            test_files: 
         | 
| 94 | 
            +
            - test/authentication_test.rb
         | 
| 95 | 
            +
            - test/exception_test.rb
         | 
| 96 | 
            +
            - test/test_helper.rb
         | 
| 97 | 
            +
            - test/connection_test.rb
         | 
| 98 | 
            +
            - test/servers_test.rb
         |