From b14c25d3afac0db98e71143df8eac68f60bdf96a Mon Sep 17 00:00:00 2001 From: Chris Wuest Date: Mon, 26 Aug 2013 13:59:18 -0500 Subject: [PATCH 1/3] [rackspace|compute_v2] Flavor list returns details This avoids forcing iteration through the flavor list and calling get on each member to obtain the full details of flavors. --- lib/fog/rackspace/compute_v2.rb | 1 + .../rackspace/models/compute_v2/flavors.rb | 3 +- .../compute_v2/list_flavors_detail.rb | 39 +++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 lib/fog/rackspace/requests/compute_v2/list_flavors_detail.rb diff --git a/lib/fog/rackspace/compute_v2.rb b/lib/fog/rackspace/compute_v2.rb index 4cd6468af..cf2d68dd5 100644 --- a/lib/fog/rackspace/compute_v2.rb +++ b/lib/fog/rackspace/compute_v2.rb @@ -80,6 +80,7 @@ module Fog request :delete_image request :list_flavors + request :list_flavors_detail request :get_flavor request :attach_volume diff --git a/lib/fog/rackspace/models/compute_v2/flavors.rb b/lib/fog/rackspace/models/compute_v2/flavors.rb index d2a722df2..bebf3e938 100644 --- a/lib/fog/rackspace/models/compute_v2/flavors.rb +++ b/lib/fog/rackspace/models/compute_v2/flavors.rb @@ -15,9 +15,8 @@ module Fog # @raise [Fog::Compute::RackspaceV2::InternalServerError] - HTTP 500 # @raise [Fog::Compute::RackspaceV2::ServiceError] # @note Fog's currentl implementation only returns 1000 flavors. - # @note Fog does not retrieve all flavor details. Please use #get to retrieve all details for a specific flavor. def all - data = service.list_flavors.body['flavors'] + data = service.list_flavors_detail.body['flavors'] load(data) end diff --git a/lib/fog/rackspace/requests/compute_v2/list_flavors_detail.rb b/lib/fog/rackspace/requests/compute_v2/list_flavors_detail.rb new file mode 100644 index 000000000..198b7d474 --- /dev/null +++ b/lib/fog/rackspace/requests/compute_v2/list_flavors_detail.rb @@ -0,0 +1,39 @@ +module Fog + module Compute + class RackspaceV2 + class Real + + # Retrieves a list of flavors + # @return [Excon::Response] response: + # * body [Hash]: + # * flavors [Array]: + # * [Hash]: + # * id [String] - flavor id + # * links [Array] - flavor links + # * name [String] - flavor name + # * ram [Fixnum] - flavor ram + # * disk [Fixnum] - flavor disk + # * vcpus [Fixnum] - flavor vcpus + # @raise [Fog::Compute::RackspaceV2::NotFound] - HTTP 404 + # @raise [Fog::Compute::RackspaceV2::BadRequest] - HTTP 400 + # @raise [Fog::Compute::RackspaceV2::InternalServerError] - HTTP 500 + # @raise [Fog::Compute::RackspaceV2::ServiceError] + # @see http://docs.rackspace.com/servers/api/v2/cs-devguide/content/List_Flavors-d1e4188.html + def list_flavors_detail + request( + :expects => [200, 203], + :method => 'GET', + :path => 'flavors/detail' + ) + end + end + + class Mock + def list_flavors_detail + flavors = self.data[:flavors].values.map { |f| Fog::Rackspace::MockData.keep(f, 'id', 'name', 'links') } + response(:body => {"flavors" => flavors}) + end + end + end + end +end From c9b2fed02d7f06cf878ecfc1fc41c8113ff06880 Mon Sep 17 00:00:00 2001 From: Chris Wuest Date: Mon, 26 Aug 2013 18:42:14 -0500 Subject: [PATCH 2/3] [rackspace|compute_v2] Image list returns details Ensure consistency with detailed Flavor lists --- lib/fog/rackspace/compute_v2.rb | 1 + lib/fog/rackspace/models/compute_v2/images.rb | 3 +- .../requests/compute_v2/list_images_detail.rb | 53 +++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 lib/fog/rackspace/requests/compute_v2/list_images_detail.rb diff --git a/lib/fog/rackspace/compute_v2.rb b/lib/fog/rackspace/compute_v2.rb index cf2d68dd5..0f540fbe5 100644 --- a/lib/fog/rackspace/compute_v2.rb +++ b/lib/fog/rackspace/compute_v2.rb @@ -76,6 +76,7 @@ module Fog request :create_image request :list_images + request :list_images_detail request :get_image request :delete_image diff --git a/lib/fog/rackspace/models/compute_v2/images.rb b/lib/fog/rackspace/models/compute_v2/images.rb index a8ac32dcf..b2ffec678 100644 --- a/lib/fog/rackspace/models/compute_v2/images.rb +++ b/lib/fog/rackspace/models/compute_v2/images.rb @@ -39,7 +39,6 @@ module Fog # @raise [Fog::Compute::RackspaceV2::InternalServerError] - HTTP 500 # @raise [Fog::Compute::RackspaceV2::ServiceError] # @note Fog's current implementation only returns 1000 images. - # @note Fog does not retrieve all image details. Please use get to retrieve all details for a specific image. # @see http://docs.rackspace.com/servers/api/v2/cs-devguide/content/List_Images-d1e4435.html def all(options = {}) options = { @@ -51,7 +50,7 @@ module Fog }.merge!(options) merge_attributes(options) - data = service.list_images(options).body['images'] + data = service.list_images_detail(options).body['images'] load(data) end diff --git a/lib/fog/rackspace/requests/compute_v2/list_images_detail.rb b/lib/fog/rackspace/requests/compute_v2/list_images_detail.rb new file mode 100644 index 000000000..b5d3891a1 --- /dev/null +++ b/lib/fog/rackspace/requests/compute_v2/list_images_detail.rb @@ -0,0 +1,53 @@ +module Fog + module Compute + class RackspaceV2 + class Real + + # Retrieves a list of images + # ==== Parameters + # * options<~String>: + # * 'name'<~String> - Filters the list of images by image name + # * 'limit'<~String> - Maximum number of objects to return + # * 'marker'<~String> - Only return objects whose name is greater than marker + # * 'status'<~String> - Filters the list of images by status + # * 'type'<~String> - Filters base Rackspace images or anyn custom server images that have been created + # + # @return [Excon::Response] response: + # * body [Hash]: + # * images [Array]: + # * [Hash]: + # * id [String] - image id + # * links [Array] - image links + # * name [String] - image name + # * minDisk [Fixnum] - image minimum disk required + # * minRam [Fixnum] - image minimum ram required + # * created [String] - image creation date (ISO 8601 format) + # * updated [String] - date of most recent image update + # * state [String] - image status (e.g. ACTIVE, SAVING, ERROR) + # * progress [Fixnum] - image saving progress + # + # @raise [Fog::Compute::RackspaceV2::NotFound] - HTTP 404 + # @raise [Fog::Compute::RackspaceV2::BadRequest] - HTTP 400 + # @raise [Fog::Compute::RackspaceV2::InternalServerError] - HTTP 500 + # @raise [Fog::Compute::RackspaceV2::ServiceError] + # @see http://docs.rackspace.com/servers/api/v2/cs-devguide/content/List_Images-d1e4435.html + def list_images_detail(options = {}) + options = options.reject {|key, value| value.nil?} + request( + :expects => [200, 203], + :method => 'GET', + :path => 'images/detail', + :query => {'format' => 'json'}.merge!(options) + ) + end + end + + class Mock + def list_images_detail(options = {}) + images = self.data[:images].values + response(:body => {"images" => images}) + end + end + end + end +end From bec4940e703e8b60c6a5ff86cc3e35aec9b34a62 Mon Sep 17 00:00:00 2001 From: Chris Wuest Date: Mon, 26 Aug 2013 22:39:12 -0500 Subject: [PATCH 3/3] [rackspace|compute_v2] tests for new requests Add tests to cover the _detail variants of requests for flavor and image information. --- tests/rackspace/requests/compute_v2/flavor_tests.rb | 6 ++++++ tests/rackspace/requests/compute_v2/image_tests.rb | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/tests/rackspace/requests/compute_v2/flavor_tests.rb b/tests/rackspace/requests/compute_v2/flavor_tests.rb index e35b39c8a..74a376eea 100644 --- a/tests/rackspace/requests/compute_v2/flavor_tests.rb +++ b/tests/rackspace/requests/compute_v2/flavor_tests.rb @@ -34,6 +34,12 @@ Shindo.tests('Fog::Compute::RackspaceV2 | flavor_tests', ['rackspace']) do body end + tests('#list_flavors_detail').formats(list_flavor_format) do + body = service.list_flavors_detail.body + flavor_id = body['flavors'][0]['id'] + body + end + tests('#get_flavor').formats(get_flavor_format) do service.get_flavor(flavor_id).body end diff --git a/tests/rackspace/requests/compute_v2/image_tests.rb b/tests/rackspace/requests/compute_v2/image_tests.rb index ea3eb5a80..2c46f996a 100644 --- a/tests/rackspace/requests/compute_v2/image_tests.rb +++ b/tests/rackspace/requests/compute_v2/image_tests.rb @@ -48,6 +48,10 @@ Shindo.tests('Fog::Compute::RackspaceV2 | image_tests', ['rackspace']) do service.list_images.body end + tests('#list_images_detail').formats(list_image_format) do + service.list_images_detail.body + end + tests('#get_image').formats(get_image_format, false) do service.get_image(@image_id).body end