From d5a75dbe04cc510557bae756175f9846d3e66539 Mon Sep 17 00:00:00 2001 From: Matt Griffin Date: Tue, 6 Sep 2011 11:21:46 -0400 Subject: [PATCH] [compute|aws] Add mocking for describe_tags --- lib/fog/aws/requests/compute/describe_tags.rb | 73 ++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/lib/fog/aws/requests/compute/describe_tags.rb b/lib/fog/aws/requests/compute/describe_tags.rb index d9dcee60b..f490fa87f 100644 --- a/lib/fog/aws/requests/compute/describe_tags.rb +++ b/lib/fog/aws/requests/compute/describe_tags.rb @@ -29,8 +29,79 @@ module Fog :parser => Fog::Parsers::Compute::AWS::DescribeTags.new }.merge!(params)) end - end + + class Mock + + def describe_tags(filters = {}) + response = Excon::Response.new + + tag_set = deep_clone(self.data[:tags]) + + aliases = { + 'key' => 'key', + 'resource-id' => 'resourceId', + 'resource-type' => 'resourceType', + 'value' => 'value' + } + + for filter_key, filter_value in filters + filter_attribute = aliases[filter_key] + case filter_attribute + when 'key' + tag_set.reject! { |k,_| k != filter_value } + when 'value' + tag_set.each { |k,values| values.reject! { |v, _| v != filter_value } } + when 'resourceId' + filter_resources(tag_set, 'resourceId', filter_value) + when 'resourceType' + filter_resources(tag_set, 'resourceType', filter_value) + end + end + + tagged_resources = [] + tag_set.each do |key, values| + values.each do |value, resources| + resources.each do |resource| + tagged_resources << resource.merge({ + 'key' => key, + 'value' => value + }) + end + end + end + + response.status = 200 + response.body = { + 'requestId' => Fog::AWS::Mock.request_id, + 'tagSet' => tagged_resources + } + response + end + + private + + def filter_resources(tag_set, filter, value) + value_hash_list = tag_set.values + value_hash_list.each do |value_hash| + value_hash.each do |_, resource_list| + resource_list.reject! { |resource| resource[filter] != value } + end + end + end + + def deep_clone(obj) + case obj + when Hash + obj.inject({}) { |h, pair| h[pair.first] = deep_clone(pair.last); h } + when Array + obj.map { |o| deep_clone(o) } + else + obj + end + end + end + end end end