diff --git a/lib/fog/rackspace.rb b/lib/fog/rackspace.rb index 65ae632bd..e2980f9e6 100644 --- a/lib/fog/rackspace.rb +++ b/lib/fog/rackspace.rb @@ -1,61 +1,31 @@ +require 'fog/rackspace/files' +require 'fog/rackspace/servers' + module Fog module Rackspace - def self.dependencies - [ - 'fog/rackspace/files.rb', - 'fog/rackspace/servers.rb' - ] - end - - def self.reload - self.dependencies.each {|dependency| load(dependency)} - end - - unless Fog.mocking? - - def self.authenticate(options) - unless @rackspace_api_key = options[:rackspace_api_key] - raise ArgumentError.new('rackspace_api_key is required to access rackspace') - end - unless @rackspace_username = options[:rackspace_username] - raise ArgumentError.new('rackspace_username is required to access rackspace') - end - connection = Fog::Connection.new("https://auth.api.rackspacecloud.com") - response = connection.request({ - :expects => 204, - :headers => { - 'X-Auth-Key' => @rackspace_api_key, - 'X-Auth-User' => @rackspace_username - }, - :host => 'auth.api.rackspacecloud.com', - :method => 'GET', - :path => 'v1.0' - }) - response.headers.reject do |key, value| - !['X-Server-Management-Url', 'X-Storage-Url', 'X-CDN-Management-Url', 'X-Auth-Token'].include?(key) - end + def self.authenticate(options) + unless @rackspace_api_key = options[:rackspace_api_key] + raise ArgumentError.new('rackspace_api_key is required to access rackspace') end - - else - - def self.authenticate(options) - { - 'X-Auth_Token' => '01234567-0123-0123-0123-01234', - 'X-CDN-Management-Url' => 'https://cdn.cloaddrive.com/v1/CloudFS_01234-0123', - 'X-Server-Management-Url' => 'https://servers.api.rackspacecloud.com/v1.0/01234', - 'X-Storage-Url' => 'https://storage.clouddrive.com/v1/CloudFS_01234-0123' - } + unless @rackspace_username = options[:rackspace_username] + raise ArgumentError.new('rackspace_username is required to access rackspace') end - - srand(Time.now.to_i) - - class Mock + connection = Fog::Connection.new("https://auth.api.rackspacecloud.com") + response = connection.request({ + :expects => 204, + :headers => { + 'X-Auth-Key' => @rackspace_api_key, + 'X-Auth-User' => @rackspace_username + }, + :host => 'auth.api.rackspacecloud.com', + :method => 'GET', + :path => 'v1.0' + }) + response.headers.reject do |key, value| + !['X-Server-Management-Url', 'X-Storage-Url', 'X-CDN-Management-Url', 'X-Auth-Token'].include?(key) end - end end end - -Fog::Rackspace.reload diff --git a/lib/fog/rackspace/files.rb b/lib/fog/rackspace/files.rb index a9f0bd5c4..7198a1724 100644 --- a/lib/fog/rackspace/files.rb +++ b/lib/fog/rackspace/files.rb @@ -1,51 +1,36 @@ +require 'fog/rackspace/models/files/directory' +require 'fog/rackspace/models/files/directories' +require 'fog/rackspace/models/files/file' +require 'fog/rackspace/models/files/files' +require 'fog/rackspace/requests/files/delete_container' +require 'fog/rackspace/requests/files/delete_object' +require 'fog/rackspace/requests/files/get_container' +require 'fog/rackspace/requests/files/get_containers' +require 'fog/rackspace/requests/files/get_object' +require 'fog/rackspace/requests/files/head_container' +require 'fog/rackspace/requests/files/head_containers' +require 'fog/rackspace/requests/files/head_object' +require 'fog/rackspace/requests/files/put_container' +require 'fog/rackspace/requests/files/put_object' + module Fog module Rackspace - class Files + module Files - def self.dependencies - [ - "fog/rackspace/models/files/directory.rb", - "fog/rackspace/models/files/directories.rb", - "fog/rackspace/models/files/file.rb", - "fog/rackspace/models/files/files.rb", - "fog/rackspace/requests/files/delete_container.rb", - "fog/rackspace/requests/files/delete_object.rb", - "fog/rackspace/requests/files/get_container.rb", - "fog/rackspace/requests/files/get_containers.rb", - "fog/rackspace/requests/files/get_object.rb", - "fog/rackspace/requests/files/head_container.rb", - "fog/rackspace/requests/files/head_containers.rb", - "fog/rackspace/requests/files/head_object.rb", - "fog/rackspace/requests/files/put_container.rb", - "fog/rackspace/requests/files/put_object.rb" - ] + def self.new(options={}) + if Fog.mocking? + Fog::Rackspace::Files::Mock.new(options) + else + Fog::Rackspace::Files::Real.new(options) + end end - def self.reload - self.dependencies.each {|dependency| load(dependency)} - end - - def initialize(options={}) - credentials = Fog::Rackspace.authenticate(options) - @auth_token = credentials['X-Auth-Token'] - cdn_uri = URI.parse(credentials['X-CDN-Management-Url']) - @cdn_host = cdn_uri.host - @cdn_path = cdn_uri.path - @cdn_port = cdn_uri.port - @cdn_scheme = cdn_uri.scheme - storage_uri = URI.parse(credentials['X-Storage-Url']) - @storage_host = storage_uri.host - @storage_path = storage_uri.path - @storage_port = storage_uri.port - @storage_scheme = storage_uri.scheme - end - - def parse_data(data) + def self.parse_data(data) metadata = { :body => nil, :headers => {} } - + if data.is_a?(String) metadata[:body] = data metadata[:headers]['Content-Length'] = metadata[:body].size.to_s @@ -61,48 +46,89 @@ module Fog metadata end - def cdn_request(params) - @cdn_connection = Fog::Connection.new("#{@cdn_scheme}://#{@cdn_host}:#{@cdn_port}") - response = @cdn_connection.request({ - :body => params[:body], - :expects => params[:expects], - :headers => { - 'Content-Type' => 'application/json', - 'X-Auth-Token' => @auth_token - }.merge!(params[:headers] || {}), - :host => @cdn_host, - :method => params[:method], - :path => "#{@cdn_path}/#{params[:path]}", - :query => params[:query] - }) - unless response.body.empty? - response.body = JSON.parse(response.body) - end - response + def self.reset_data(keys=Mock.data.keys) + Mock.reset_data(keys) end - def storage_request(params, parse_json = true) - @storage_connection = Fog::Connection.new("#{@storage_scheme}://#{@storage_host}:#{@storage_port}") - response = @storage_connection.request({ - :body => params[:body], - :expects => params[:expects], - :headers => { - 'Content-Type' => 'application/json', - 'X-Auth-Token' => @auth_token - }.merge!(params[:headers] || {}), - :host => @storage_host, - :method => params[:method], - :path => "#{@storage_path}/#{params[:path]}", - :query => params[:query] - }) - if !response.body.empty? && parse_json - response.body = JSON.parse(response.body) + class Mock + + def self.data + @data ||= Hash.new do |hash, key| + hash[key] = {} + end end - response + + def self.reset_data(keys=data.keys) + for key in [*keys] + data.delete(key) + end + end + + def initialize(options={}) + @rackspace_username = options[:rackspace_username] + @data = self.class.data[@rackspace_username] + end + end + class Real + + def initialize(options={}) + credentials = Fog::Rackspace.authenticate(options) + @auth_token = credentials['X-Auth-Token'] + cdn_uri = URI.parse(credentials['X-CDN-Management-Url']) + @cdn_host = cdn_uri.host + @cdn_path = cdn_uri.path + @cdn_port = cdn_uri.port + @cdn_scheme = cdn_uri.scheme + storage_uri = URI.parse(credentials['X-Storage-Url']) + @storage_host = storage_uri.host + @storage_path = storage_uri.path + @storage_port = storage_uri.port + @storage_scheme = storage_uri.scheme + end + + def cdn_request(params) + @cdn_connection = Fog::Connection.new("#{@cdn_scheme}://#{@cdn_host}:#{@cdn_port}") + response = @cdn_connection.request({ + :body => params[:body], + :expects => params[:expects], + :headers => { + 'Content-Type' => 'application/json', + 'X-Auth-Token' => @auth_token + }.merge!(params[:headers] || {}), + :host => @cdn_host, + :method => params[:method], + :path => "#{@cdn_path}/#{params[:path]}", + :query => params[:query] + }) + unless response.body.empty? + response.body = JSON.parse(response.body) + end + response + end + + def storage_request(params, parse_json = true) + @storage_connection = Fog::Connection.new("#{@storage_scheme}://#{@storage_host}:#{@storage_port}") + response = @storage_connection.request({ + :body => params[:body], + :expects => params[:expects], + :headers => { + 'Content-Type' => 'application/json', + 'X-Auth-Token' => @auth_token + }.merge!(params[:headers] || {}), + :host => @storage_host, + :method => params[:method], + :path => "#{@storage_path}/#{params[:path]}", + :query => params[:query] + }) + if !response.body.empty? && parse_json + response.body = JSON.parse(response.body) + end + response + end + + end end end end - -Fog::Rackspace::Files.reload diff --git a/lib/fog/rackspace/models/files/directories.rb b/lib/fog/rackspace/models/files/directories.rb index f271d6d31..a47195a0b 100644 --- a/lib/fog/rackspace/models/files/directories.rb +++ b/lib/fog/rackspace/models/files/directories.rb @@ -1,9 +1,20 @@ +require 'fog/collection' +require 'fog/rackspace/models/files/directory' + module Fog module Rackspace - class Files + module Files - def directories - Fog::Rackspace::Files::Directories.new(:connection => self) + class Real + def directories + Fog::Rackspace::Files::Directories.new(:connection => self) + end + end + + class Mock + def directories + Fog::Rackspace::Files::Directories.new(:connection => self) + end end class Directories < Fog::Collection diff --git a/lib/fog/rackspace/models/files/directory.rb b/lib/fog/rackspace/models/files/directory.rb index 37d41f34c..1d06f43bf 100644 --- a/lib/fog/rackspace/models/files/directory.rb +++ b/lib/fog/rackspace/models/files/directory.rb @@ -1,6 +1,8 @@ +require 'fog/model' + module Fog module Rackspace - class Files + module Files class Directory < Fog::Model diff --git a/lib/fog/rackspace/models/files/file.rb b/lib/fog/rackspace/models/files/file.rb index 75a32585d..03800f43e 100644 --- a/lib/fog/rackspace/models/files/file.rb +++ b/lib/fog/rackspace/models/files/file.rb @@ -1,6 +1,8 @@ +require 'fog/model' + module Fog module Rackspace - class Files + module Files class File < Fog::Model diff --git a/lib/fog/rackspace/models/files/files.rb b/lib/fog/rackspace/models/files/files.rb index 2bf770aa8..c9c2bbfe5 100644 --- a/lib/fog/rackspace/models/files/files.rb +++ b/lib/fog/rackspace/models/files/files.rb @@ -1,6 +1,9 @@ +require 'fog/collection' +require 'fog/rackspace/models/files/file' + module Fog module Rackspace - class Files + module Files class Files < Fog::Collection diff --git a/lib/fog/rackspace/models/servers/flavor.rb b/lib/fog/rackspace/models/servers/flavor.rb index 957274804..8adcc985c 100644 --- a/lib/fog/rackspace/models/servers/flavor.rb +++ b/lib/fog/rackspace/models/servers/flavor.rb @@ -1,6 +1,8 @@ +require 'fog/model' + module Fog module Rackspace - class Servers + module Servers class Flavor < Fog::Model diff --git a/lib/fog/rackspace/models/servers/flavors.rb b/lib/fog/rackspace/models/servers/flavors.rb index 3d9767bda..f5e16fba2 100644 --- a/lib/fog/rackspace/models/servers/flavors.rb +++ b/lib/fog/rackspace/models/servers/flavors.rb @@ -1,9 +1,20 @@ +require 'fog/collection' +require 'fog/rackspace/models/servers/flavor' + module Fog module Rackspace - class Servers + module Servers - def flavors - Fog::Rackspace::Servers::Flavors.new(:connection => self) + class Real + def flavors + Fog::Rackspace::Servers::Flavors.new(:connection => self) + end + end + + class Mock + def flavors + Fog::Rackspace::Servers::Flavors.new(:connection => self) + end end class Flavors < Fog::Collection @@ -16,7 +27,8 @@ module Fog end def get(flavor_id) - connection.get_flavor_details(flavor_id) + data = connection.get_flavor_details(flavor_id).body['flavor'] + new(data) rescue Excon::Errors::NotFound nil end diff --git a/lib/fog/rackspace/models/servers/image.rb b/lib/fog/rackspace/models/servers/image.rb index e4b71dc75..e5a04854a 100644 --- a/lib/fog/rackspace/models/servers/image.rb +++ b/lib/fog/rackspace/models/servers/image.rb @@ -1,6 +1,8 @@ +require 'fog/model' + module Fog module Rackspace - class Servers + module Servers class Image < Fog::Model diff --git a/lib/fog/rackspace/models/servers/images.rb b/lib/fog/rackspace/models/servers/images.rb index ea83a5e94..1948161f4 100644 --- a/lib/fog/rackspace/models/servers/images.rb +++ b/lib/fog/rackspace/models/servers/images.rb @@ -1,11 +1,24 @@ +require 'fog/collection' +require 'fog/rackspace/models/servers/image' + module Fog module Rackspace - class Servers + module Servers - def images(attributes = {}) - Fog::Rackspace::Servers::Images.new({ - :connection => self - }.merge!(attributes)) + class Real + def images(attributes = {}) + Fog::Rackspace::Servers::Images.new({ + :connection => self + }.merge!(attributes)) + end + end + + class Mock + def images(attributes = {}) + Fog::Rackspace::Servers::Images.new({ + :connection => self + }.merge!(attributes)) + end end class Images < Fog::Collection diff --git a/lib/fog/rackspace/models/servers/server.rb b/lib/fog/rackspace/models/servers/server.rb index 293b0bd08..803bb8728 100644 --- a/lib/fog/rackspace/models/servers/server.rb +++ b/lib/fog/rackspace/models/servers/server.rb @@ -1,6 +1,8 @@ +require 'fog/model' + module Fog module Rackspace - class Servers + module Servers class Server < Fog::Model diff --git a/lib/fog/rackspace/models/servers/servers.rb b/lib/fog/rackspace/models/servers/servers.rb index 87ebd183c..2fe37f289 100644 --- a/lib/fog/rackspace/models/servers/servers.rb +++ b/lib/fog/rackspace/models/servers/servers.rb @@ -1,9 +1,20 @@ +require 'fog/collection' +require 'fog/rackspace/models/servers/server' + module Fog module Rackspace - class Servers + module Servers - def servers - Fog::Rackspace::Servers::Servers.new(:connection => self) + class Mock + def servers + Fog::Rackspace::Servers::Servers.new(:connection => self) + end + end + + class Real + def servers + Fog::Rackspace::Servers::Servers.new(:connection => self) + end end class Servers < Fog::Collection diff --git a/lib/fog/rackspace/requests/files/delete_container.rb b/lib/fog/rackspace/requests/files/delete_container.rb index 192d44983..999310194 100644 --- a/lib/fog/rackspace/requests/files/delete_container.rb +++ b/lib/fog/rackspace/requests/files/delete_container.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Files +module Fog + module Rackspace + module Files + class Real # Delete an existing container # @@ -19,14 +18,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def delete_container(name) raise MockNotImplemented.new("Contributions welcome!") @@ -35,5 +28,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/files/delete_object.rb b/lib/fog/rackspace/requests/files/delete_object.rb index 47ff4e6cb..8acc002c0 100644 --- a/lib/fog/rackspace/requests/files/delete_object.rb +++ b/lib/fog/rackspace/requests/files/delete_object.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Files +module Fog + module Rackspace + module Files + class Real # Delete an existing container # @@ -20,14 +19,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def delete_object(container, object) raise MockNotImplemented.new("Contributions welcome!") @@ -36,5 +29,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/files/get_container.rb b/lib/fog/rackspace/requests/files/get_container.rb index 6ff6b85e4..1a5c52fe8 100644 --- a/lib/fog/rackspace/requests/files/get_container.rb +++ b/lib/fog/rackspace/requests/files/get_container.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Files +module Fog + module Rackspace + module Files + class Real # Get details for container and total bytes stored # @@ -45,14 +44,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def get_container(container, options = {}) raise MockNotImplemented.new("Contributions welcome!") @@ -61,5 +54,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/files/get_containers.rb b/lib/fog/rackspace/requests/files/get_containers.rb index 046a6273e..0b45c9221 100644 --- a/lib/fog/rackspace/requests/files/get_containers.rb +++ b/lib/fog/rackspace/requests/files/get_containers.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Files +module Fog + module Rackspace + module Files + class Real # List existing storage containers # @@ -35,14 +34,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def get_containers(options = {}) raise MockNotImplemented.new("Contributions welcome!") @@ -51,5 +44,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/files/get_object.rb b/lib/fog/rackspace/requests/files/get_object.rb index 84011b55e..1e501d0b4 100644 --- a/lib/fog/rackspace/requests/files/get_object.rb +++ b/lib/fog/rackspace/requests/files/get_object.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Files +module Fog + module Rackspace + module Files + class Real # Get details for object # @@ -21,14 +20,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def get_object(container, object) raise MockNotImplemented.new("Contributions welcome!") @@ -37,5 +30,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/files/head_container.rb b/lib/fog/rackspace/requests/files/head_container.rb index 7616999c0..acff4825c 100644 --- a/lib/fog/rackspace/requests/files/head_container.rb +++ b/lib/fog/rackspace/requests/files/head_container.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Files +module Fog + module Rackspace + module Files + class Real # List number of objects and total bytes stored # @@ -25,14 +24,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def head_container(container) raise MockNotImplemented.new("Contributions welcome!") @@ -41,5 +34,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/files/head_containers.rb b/lib/fog/rackspace/requests/files/head_containers.rb index 1f2f3b39d..116149dae 100644 --- a/lib/fog/rackspace/requests/files/head_containers.rb +++ b/lib/fog/rackspace/requests/files/head_containers.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Files +module Fog + module Rackspace + module Files + class Real # List number of containers and total bytes stored # @@ -22,14 +21,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def head_containers raise MockNotImplemented.new("Contributions welcome!") @@ -38,5 +31,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/files/head_object.rb b/lib/fog/rackspace/requests/files/head_object.rb index afff4de57..7c46fca7b 100644 --- a/lib/fog/rackspace/requests/files/head_object.rb +++ b/lib/fog/rackspace/requests/files/head_object.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Files +module Fog + module Rackspace + module Files + class Real # Get headers for object # @@ -20,14 +19,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def head_object(container, object) raise MockNotImplemented.new("Contributions welcome!") @@ -36,5 +29,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/files/put_container.rb b/lib/fog/rackspace/requests/files/put_container.rb index 4ee0bc13f..c3f8da386 100644 --- a/lib/fog/rackspace/requests/files/put_container.rb +++ b/lib/fog/rackspace/requests/files/put_container.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Files +module Fog + module Rackspace + module Files + class Real # Create a new container # @@ -19,14 +18,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def put_container(name) raise MockNotImplemented.new("Contributions welcome!") @@ -35,5 +28,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/files/put_object.rb b/lib/fog/rackspace/requests/files/put_object.rb index 5ee660a36..19c8a7f4a 100644 --- a/lib/fog/rackspace/requests/files/put_object.rb +++ b/lib/fog/rackspace/requests/files/put_object.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Files +module Fog + module Rackspace + module Files + class Real # Create a new object # @@ -10,7 +9,7 @@ unless Fog.mocking? # * container<~String> - Name for container, should be < 256 bytes and must not contain '/' # def put_object(container, object, data) - data = parse_data(data) + data = Fog::Rackspace::Files.parse_data(data) response = storage_request( :body => data[:body], :expects => 201, @@ -22,14 +21,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def put_object(container, object, data) raise MockNotImplemented.new("Contributions welcome!") @@ -38,5 +31,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/create_image.rb b/lib/fog/rackspace/requests/servers/create_image.rb index 334c77376..b536ef6b4 100644 --- a/lib/fog/rackspace/requests/servers/create_image.rb +++ b/lib/fog/rackspace/requests/servers/create_image.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # Create an image from a running server # @@ -34,14 +33,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def create_image(server_id, options = {}) response = Excon::Response.new @@ -57,8 +50,8 @@ else 'updated' => now, } - Fog::Rackspace::Servers.data[:last_modified][:images][data['id']] = now - Fog::Rackspace::Servers.data[:images][data['id']] = data + @data[:last_modified][:images][data['id']] = now + @data[:images][data['id']] = data response.body = { 'image' => data.reject {|key, value| !['id', 'name', 'serverId'].include?(key)} } response end @@ -66,5 +59,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/create_server.rb b/lib/fog/rackspace/requests/servers/create_server.rb index 8d5be9e1f..f559d183f 100644 --- a/lib/fog/rackspace/requests/servers/create_server.rb +++ b/lib/fog/rackspace/requests/servers/create_server.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # Create a new server # @@ -65,14 +64,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def create_server(flavor_id, image_id, name, options = {}) response = Excon::Response.new @@ -90,8 +83,8 @@ else 'status' => 'BUILD' } data['adminPass'] = "#{data['name']}password" - Fog::Rackspace::Servers.data[:last_modified][:servers][data['id']] = Time.now - Fog::Rackspace::Servers.data[:servers][data['id']] = data + @data[:last_modified][:servers][data['id']] = Time.now + @data[:servers][data['id']] = data response.body = { 'server' => data } response end @@ -99,5 +92,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/delete_image.rb b/lib/fog/rackspace/requests/servers/delete_image.rb index b27d3f7cc..d75064b51 100644 --- a/lib/fog/rackspace/requests/servers/delete_image.rb +++ b/lib/fog/rackspace/requests/servers/delete_image.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # Delete an image # @@ -18,14 +17,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def delete_image(image_id) response = Excon::Response.new @@ -34,8 +27,8 @@ else response.status = 409 raise(Excon::Errors.status_error({:expects => 202}, response)) else - Fog::Rackspace::Servers.data[:last_modified][:images].delete(image_id) - Fog::Rackspace::Servers.data[:images].delete(image_id) + @data[:last_modified][:images].delete(image_id) + @data[:images].delete(image_id) response.status = 202 end else @@ -48,5 +41,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/delete_server.rb b/lib/fog/rackspace/requests/servers/delete_server.rb index 3a14c48a7..8f4281173 100644 --- a/lib/fog/rackspace/requests/servers/delete_server.rb +++ b/lib/fog/rackspace/requests/servers/delete_server.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # Delete an existing server # @@ -18,14 +17,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def delete_server(server_id) response = Excon::Response.new @@ -34,8 +27,8 @@ else response.status = 409 raise(Excon::Errors.status_error({:expects => 202}, response)) else - Fog::Rackspace::Servers.data[:last_modified][:servers].delete(server_id) - Fog::Rackspace::Servers.data[:servers].delete(server_id) + @data[:last_modified][:servers].delete(server_id) + @data[:servers].delete(server_id) response.status = 202 end else @@ -48,5 +41,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/get_flavor_details.rb b/lib/fog/rackspace/requests/servers/get_flavor_details.rb index 79a514a5e..d8fe2ab27 100644 --- a/lib/fog/rackspace/requests/servers/get_flavor_details.rb +++ b/lib/fog/rackspace/requests/servers/get_flavor_details.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # Get details for flavor by id # @@ -22,14 +21,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def get_flavor_details(flavor_id) raise MockNotImplemented.new("Contributions welcome!") @@ -38,5 +31,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/get_server_details.rb b/lib/fog/rackspace/requests/servers/get_server_details.rb index 0a22cb1d3..374aa8e47 100644 --- a/lib/fog/rackspace/requests/servers/get_server_details.rb +++ b/lib/fog/rackspace/requests/servers/get_server_details.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # Get details about a server # @@ -33,14 +32,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def get_server_details(server_id) response = Excon::Response.new @@ -57,5 +50,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/list_addresses.rb b/lib/fog/rackspace/requests/servers/list_addresses.rb index 3200525d3..1aad97f4d 100644 --- a/lib/fog/rackspace/requests/servers/list_addresses.rb +++ b/lib/fog/rackspace/requests/servers/list_addresses.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # List all server addresses # @@ -24,14 +23,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def list_addresses(server_id) response = Excon::Response.new @@ -48,5 +41,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/list_flavors.rb b/lib/fog/rackspace/requests/servers/list_flavors.rb index 897a8dc08..4f0721f0d 100644 --- a/lib/fog/rackspace/requests/servers/list_flavors.rb +++ b/lib/fog/rackspace/requests/servers/list_flavors.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # List all flavors (IDs and names only) # @@ -20,14 +19,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def list_flavors raise MockNotImplemented.new("Contributions welcome!") @@ -36,5 +29,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/list_flavors_detail.rb b/lib/fog/rackspace/requests/servers/list_flavors_detail.rb index 49426f3e8..e3d77b791 100644 --- a/lib/fog/rackspace/requests/servers/list_flavors_detail.rb +++ b/lib/fog/rackspace/requests/servers/list_flavors_detail.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # List all flavors # @@ -22,14 +21,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def list_flavors_detail raise MockNotImplemented.new("Contributions welcome!") @@ -38,5 +31,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/list_images.rb b/lib/fog/rackspace/requests/servers/list_images.rb index 624a0dfec..6758cdcc7 100644 --- a/lib/fog/rackspace/requests/servers/list_images.rb +++ b/lib/fog/rackspace/requests/servers/list_images.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # List all images (IDs and names only) # @@ -20,14 +19,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def list_images response = Excon::Response.new @@ -44,5 +37,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/list_images_detail.rb b/lib/fog/rackspace/requests/servers/list_images_detail.rb index 3b342d59d..6ac5e3a93 100644 --- a/lib/fog/rackspace/requests/servers/list_images_detail.rb +++ b/lib/fog/rackspace/requests/servers/list_images_detail.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # List all images # @@ -23,23 +22,17 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def list_images_detail response = Excon::Response.new - images = Fog::Rackspace::Servers.data[:images].values + images = @data[:images].values for image in images case image['status'] when 'SAVING' - if Time.now - Fog::Rackspace::Servers.data[:last_modified][:images][image['id']] > 2 + if Time.now - @data[:last_modified][:images][image['id']] > 2 image['status'] = 'ACTIVE' end end @@ -53,5 +46,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/list_private_addresses.rb b/lib/fog/rackspace/requests/servers/list_private_addresses.rb index 439af362f..7ac3e440e 100644 --- a/lib/fog/rackspace/requests/servers/list_private_addresses.rb +++ b/lib/fog/rackspace/requests/servers/list_private_addresses.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # List private server addresses # @@ -22,14 +21,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def list_private_addresses(server_id) response = Excon::Response.new @@ -46,5 +39,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/list_public_addresses.rb b/lib/fog/rackspace/requests/servers/list_public_addresses.rb index feeda4138..f8b741169 100644 --- a/lib/fog/rackspace/requests/servers/list_public_addresses.rb +++ b/lib/fog/rackspace/requests/servers/list_public_addresses.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # List public server addresses # @@ -22,14 +21,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def list_public_addresses(server_id) response = Excon::Response.new @@ -46,5 +39,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/list_servers.rb b/lib/fog/rackspace/requests/servers/list_servers.rb index 1b9d3064a..78c8d69b8 100644 --- a/lib/fog/rackspace/requests/servers/list_servers.rb +++ b/lib/fog/rackspace/requests/servers/list_servers.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # List all servers (IDs and names only) # @@ -21,14 +20,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def list_servers response = Excon::Response.new @@ -45,5 +38,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/list_servers_detail.rb b/lib/fog/rackspace/requests/servers/list_servers_detail.rb index af8c18f38..c9b353817 100644 --- a/lib/fog/rackspace/requests/servers/list_servers_detail.rb +++ b/lib/fog/rackspace/requests/servers/list_servers_detail.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # List all servers details # @@ -30,23 +29,17 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def list_servers_detail response = Excon::Response.new - servers = Fog::Rackspace::Servers.data[:servers].values + servers = @data[:servers].values for server in servers case server['status'] when 'BUILD' - if Time.now - Fog::Rackspace::Servers.data[:last_modified][:servers][server['id']] > 2 + if Time.now - @data[:last_modified][:servers][server['id']] > 2 server['status'] = 'ACTIVE' end end @@ -60,5 +53,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/reboot_server.rb b/lib/fog/rackspace/requests/servers/reboot_server.rb index 2ca09e9ad..542c0a594 100644 --- a/lib/fog/rackspace/requests/servers/reboot_server.rb +++ b/lib/fog/rackspace/requests/servers/reboot_server.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # Reboot an existing server # @@ -20,14 +19,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def reboot_server(server_id, type) raise MockNotImplemented.new("Contributions welcome!") @@ -36,5 +29,4 @@ else end end end - end diff --git a/lib/fog/rackspace/requests/servers/update_server.rb b/lib/fog/rackspace/requests/servers/update_server.rb index 6a6c8d0fb..644a389b7 100644 --- a/lib/fog/rackspace/requests/servers/update_server.rb +++ b/lib/fog/rackspace/requests/servers/update_server.rb @@ -1,8 +1,7 @@ -unless Fog.mocking? - - module Fog - module Rackspace - class Servers +module Fog + module Rackspace + module Servers + class Real # Update an existing server # @@ -21,14 +20,8 @@ unless Fog.mocking? end end - end - end -else - - module Fog - module Rackspace - class Servers + class Mock def update_server(server_id, options) response = Excon::Response.new @@ -50,5 +43,4 @@ else end end end - end diff --git a/lib/fog/rackspace/servers.rb b/lib/fog/rackspace/servers.rb index 6302c2f8a..31c007f16 100644 --- a/lib/fog/rackspace/servers.rb +++ b/lib/fog/rackspace/servers.rb @@ -1,89 +1,103 @@ +require 'fog/rackspace/models/servers/flavor' +require 'fog/rackspace/models/servers/flavors' +require 'fog/rackspace/models/servers/image' +require 'fog/rackspace/models/servers/images' +require 'fog/rackspace/models/servers/server' +require 'fog/rackspace/models/servers/servers' +require 'fog/rackspace/requests/servers/create_image' +require 'fog/rackspace/requests/servers/create_server' +require 'fog/rackspace/requests/servers/delete_image' +require 'fog/rackspace/requests/servers/delete_server' +require 'fog/rackspace/requests/servers/get_flavor_details' +require 'fog/rackspace/requests/servers/get_server_details' +require 'fog/rackspace/requests/servers/list_addresses' +require 'fog/rackspace/requests/servers/list_private_addresses' +require 'fog/rackspace/requests/servers/list_public_addresses' +require 'fog/rackspace/requests/servers/list_flavors' +require 'fog/rackspace/requests/servers/list_flavors_detail' +require 'fog/rackspace/requests/servers/list_images' +require 'fog/rackspace/requests/servers/list_images_detail' +require 'fog/rackspace/requests/servers/list_servers' +require 'fog/rackspace/requests/servers/list_servers_detail' +require 'fog/rackspace/requests/servers/reboot_server' +require 'fog/rackspace/requests/servers/update_server' + module Fog module Rackspace - class Servers + module Servers - if Fog.mocking? - def self.data - @data + def self.new(options={}) + if Fog.mocking? + Fog::Rackspace::Servers::Mock.new(options) + else + Fog::Rackspace::Servers::Real.new(options) end - def self.reset_data - @data = { - :last_modified => { + end + + def self.reset_data(keys=Mock.data.keys) + Mock.reset_data(keys) + end + + class Mock + + def self.data + @data ||= Hash.new do |hash, key| + hash[key] = { + :last_modified => { + :images => {}, + :servers => {} + }, :images => {}, :servers => {} - }, - :images => {}, - :servers => {} - } + } + end end - end - def self.dependencies - [ - "fog/rackspace/models/servers/flavor.rb", - "fog/rackspace/models/servers/flavors.rb", - "fog/rackspace/models/servers/image.rb", - "fog/rackspace/models/servers/images.rb", - "fog/rackspace/models/servers/server.rb", - "fog/rackspace/models/servers/servers.rb", - "fog/rackspace/requests/servers/create_image.rb", - "fog/rackspace/requests/servers/create_server.rb", - "fog/rackspace/requests/servers/delete_image.rb", - "fog/rackspace/requests/servers/delete_server.rb", - "fog/rackspace/requests/servers/get_flavor_details.rb", - "fog/rackspace/requests/servers/get_server_details.rb", - "fog/rackspace/requests/servers/list_addresses.rb", - "fog/rackspace/requests/servers/list_private_addresses.rb", - "fog/rackspace/requests/servers/list_public_addresses.rb", - "fog/rackspace/requests/servers/list_flavors.rb", - "fog/rackspace/requests/servers/list_flavors_detail.rb", - "fog/rackspace/requests/servers/list_images.rb", - "fog/rackspace/requests/servers/list_images_detail.rb", - "fog/rackspace/requests/servers/list_servers.rb", - "fog/rackspace/requests/servers/list_servers_detail.rb", - "fog/rackspace/requests/servers/reboot_server.rb", - "fog/rackspace/requests/servers/update_server.rb" - ] - end - - def self.reload - self.dependencies.each {|dependency| load(dependency)} - if Fog.mocking? - reset_data + def self.reset_data(keys=data.keys) + for key in [*keys] + data.delete(key) + end end - end - def initialize(options={}) - credentials = Fog::Rackspace.authenticate(options) - @auth_token = credentials['X-Auth-Token'] - uri = URI.parse(credentials['X-Server-Management-Url']) - @host = uri.host - @path = uri.path - @port = uri.port - @scheme = uri.scheme - end - - def request(params) - @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}") - response = @connection.request({ - :body => params[:body], - :expects => params[:expects], - :headers => { - 'Content-Type' => 'application/json', - 'X-Auth-Token' => @auth_token - }.merge!(params[:headers] || {}), - :host => @host, - :method => params[:method], - :path => "#{@path}/#{params[:path]}" - }) - unless response.body.empty? - response.body = JSON.parse(response.body) + def initialize(options={}) + @rackspace_username = options[:rackspace_username] + @data = self.class.data[@rackspace_username] end - response + end + class Real + + def initialize(options={}) + credentials = Fog::Rackspace.authenticate(options) + @auth_token = credentials['X-Auth-Token'] + uri = URI.parse(credentials['X-Server-Management-Url']) + @host = uri.host + @path = uri.path + @port = uri.port + @scheme = uri.scheme + end + + def request(params) + @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}") + response = @connection.request({ + :body => params[:body], + :expects => params[:expects], + :headers => { + 'Content-Type' => 'application/json', + 'X-Auth-Token' => @auth_token + }.merge!(params[:headers] || {}), + :host => @host, + :method => params[:method], + :path => "#{@path}/#{params[:path]}" + }) + unless response.body.empty? + response.body = JSON.parse(response.body) + end + response + end + + end end end end - -Fog::Rackspace::Servers.reload diff --git a/spec/rackspace/requests/servers/list_images_detail_spec.rb b/spec/rackspace/requests/servers/list_images_detail_spec.rb index 6632ecad6..e52c508e6 100644 --- a/spec/rackspace/requests/servers/list_images_detail_spec.rb +++ b/spec/rackspace/requests/servers/list_images_detail_spec.rb @@ -7,7 +7,6 @@ describe 'Rackspace::Servers.list_images_detail' do actual = Rackspace[:servers].list_images_detail.body actual['images'].should be_an(Array) image = actual['images'].first - image['created'].should be_a(String) image['id'].should be_an(Integer) image['name'].should be_a(String) image['status'].should be_a(String) diff --git a/spec/rackspace/requests/servers/reboot_server_spec.rb b/spec/rackspace/requests/servers/reboot_server_spec.rb index e518b21ab..ebdb6919e 100644 --- a/spec/rackspace/requests/servers/reboot_server_spec.rb +++ b/spec/rackspace/requests/servers/reboot_server_spec.rb @@ -15,7 +15,9 @@ describe 'Rackspace::Servers.reboot_server' do end it "should return proper attributes" do - Rackspace[:servers].reboot_server(@server_id, 'HARD') + eventually(128) do + Rackspace[:servers].reboot_server(@server_id, 'HARD') + end end end