diff --git a/lib/fog/aws/compute.rb b/lib/fog/aws/compute.rb index 2fe1fc6cb..5bbb29164 100644 --- a/lib/fog/aws/compute.rb +++ b/lib/fog/aws/compute.rb @@ -78,6 +78,7 @@ module Fog request :describe_subnets request :describe_tags request :describe_volumes + request :describe_volume_status request :describe_vpcs request :detach_volume request :disassociate_address @@ -309,7 +310,7 @@ module Fog :host => @host, :path => @path, :port => @port, - :version => '2011-12-15' + :version => '2012-03-01' } ) diff --git a/lib/fog/aws/parsers/compute/describe_volume_status.rb b/lib/fog/aws/parsers/compute/describe_volume_status.rb new file mode 100644 index 000000000..ab5257d28 --- /dev/null +++ b/lib/fog/aws/parsers/compute/describe_volume_status.rb @@ -0,0 +1,70 @@ +module Fog + module Parsers + module Compute + module AWS + class DescribeVolumeStatus < Fog::Parsers::Base + + def new_volume + @volume = { 'volumeStatus' => { 'details' => [] }, 'eventSet' => {}, 'actionSet' => {} } + end + + def reset + @volume_status = {} + @response = { 'volumeStatusSet' => [] } + @inside = nil + end + + def start_element(name, attrs=[]) + super + case name + when 'item' + new_volume if @inside.nil? + when 'volumeStatus' + @inside = :volume_status + when 'details' + @inside = :details + when 'eventSet' + @inside = :event + when 'actionSet' + @inside = :action + end + end + + def end_element(name) + case name + #Simple closers + when 'details' + @inside = nil + when 'volumeStatus' + @inside = nil + when 'eventSet' + @inside = nil + when 'actionSet' + @inside = nil + when 'item' + @response['volumeStatusSet'] << @volume if @inside.nil? + #Top level + when 'nextToken', 'requestId' + @response[name] = value + # Volume Stuff + when 'volumeId', 'availabilityZone' + @volume[name] = value + #The mess... + when 'name', 'status' + case @inside + when :details + @volume['volumeStatus']['details'] << {name => value } + when :volume_status + @volume['volumeStatus'][name] = value + end + when 'code', 'eventId', 'eventType', 'description' + @volume["#{@inside}Set"][name] = value.strip + when 'notAfter', 'notBefore' + @volume["#{@inside}Set"][name] = Time.parse(value) + end + end + end + end + end + end +end diff --git a/lib/fog/aws/requests/compute/describe_volume_status.rb b/lib/fog/aws/requests/compute/describe_volume_status.rb new file mode 100644 index 000000000..997e5d4f0 --- /dev/null +++ b/lib/fog/aws/requests/compute/describe_volume_status.rb @@ -0,0 +1,50 @@ +module Fog + module Compute + class AWS + class Real + + require 'fog/aws/parsers/compute/describe_volume_status' + + # http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeVolumeStatus.html + def describe_volume_status(filters = {}) + raise ArgumentError.new("Filters must be a hash, but is a #{filters.class}.") unless filters.is_a?(Hash) + next_token = filters.delete('nextToken') || filters.delete('NextToken') + max_results = filters.delete('maxResults') || filters.delete('MaxResults') + volume_ids = filters.delete('VolumeId') + + params = Fog::AWS.indexed_filters(filters) + + params['NextToken'] = next_token if next_token + params['MaxResults'] = max_results if max_results + + Array(volume_ids).inject(1) do |idx, vid| + params["VolumeId.#{idx}"] = vid + idx += 1 + end + + pp params + request({ + 'Action' => 'DescribeVolumeStatus', + :idempotent => true, + :parser => Fog::Parsers::Compute::AWS::DescribeVolumeStatus.new + }.merge!(params)) + end + end + + class Mock + def describe_volume_status(filters = {}) + response = Excon::Response.new + response.status = 200 + + response.body = { + 'volumeStatusSet' => [], + 'requestId' => Fog::AWS::Mock.request_id + } + + response + + end + end + end + end +end