# # Copyright (c) 2010 RightScale Inc # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # module RightAws class AcfInterface # List Invalidations # # acf.list_invalidations('E3LTBMK4EAQS7D') #=> # [{:status=>"InProgress", :aws_id=>"I3AW9PPQS0CBKV"}, # {:status=>"InProgress", :aws_id=>"I1HV23N5KD3XH9"}] # def list_invalidations(distribution_aws_id) result = [] incrementally_list_invalidations(distribution_aws_id) do |response| result += response[:invalidations] true end result end # Incrementally list Invalidations. # Optional params: +:marker+ and +:max_items+. # def incrementally_list_invalidations(distribution_aws_id, params={}, &block) opts = {} opts['MaxItems'] = params[:max_items] if params[:max_items] opts['Marker'] = params[:marker] if params[:marker] last_response = nil loop do link = generate_request('GET', "distribution/#{distribution_aws_id}/invalidation", opts) last_response = request_info(link, AcfInvalidationsListParser.new(:logger => @logger)) opts['Marker'] = last_response[:next_marker] break unless block && block.call(last_response) && !last_response[:next_marker].right_blank? end last_response end #----------------------------------------------------------------- # Origin Access Identity #----------------------------------------------------------------- # Create a new Invalidation batch. # # acf.create_invalidation('E3LTBMK4EAQS7D', :path => ['/boot.jpg', '/kd/boot.public.1.jpg']) #=> # {:status=>"InProgress", # :create_time=>"2010-12-08T14:03:38.449Z", # :location=> "https://cloudfront.amazonaws.com/2010-11-01/distribution/E3LTBMK4EAQS7D/invalidation/I3AW9PPQS0CBKV", # :aws_id=>"I3AW9PPQS0CBKV", # :invalidation_batch=> # {:caller_reference=>"201012081703372555972012", # :path=>["/boot.jpg", "/kd/boot.public.1.jpg"]}} # def create_invalidation(distribution_aws_id, invalidation_batch) invalidation_batch[:caller_reference] ||= generate_call_reference link = generate_request('POST', "/distribution/#{distribution_aws_id}/invalidation", {}, invalidation_batch_to_xml(invalidation_batch)) merge_headers(request_info(link, AcfInvalidationsListParser.new(:logger => @logger))[:invalidations].first) end # Get Invalidation # # acf.get_invalidation('E3LTBMK4EAQS7D', 'I3AW9PPQS0CBKV') #=> # {:create_time=>"2010-12-08T14:03:38.449Z", # :status=>"InProgress", # :aws_id=>"I3AW9PPQS0CBKV", # :invalidation_batch=> # {:caller_reference=>"201012081703372555972012", # :path=>["/boot.jpg", "/kd/boot.public.1.jpg"]}} # def get_invalidation(distribution_aws_id, aws_id) link = generate_request('GET', "distribution/#{distribution_aws_id}/invalidation/#{aws_id}") merge_headers(request_info(link, AcfInvalidationsListParser.new(:logger => @logger))[:invalidations].first) end #----------------------------------------------------------------- # Batch #----------------------------------------------------------------- def invalidation_batch_to_xml(invalidation_batch) # :nodoc: paths = '' Array(invalidation_batch[:path]).each do |path| paths << " #{AwsUtils::xml_escape(path)}\n" end "\n" + "\n" + " #{invalidation_batch[:caller_reference]}\n" + paths + "" end #----------------------------------------------------------------- # PARSERS: #----------------------------------------------------------------- class AcfInvalidationsListParser < RightAWSParser # :nodoc: def reset @result = { :invalidations => [] } end def tagstart(name, attributes) case name when %r{(InvalidationSummary|Invalidation)$} then @item = {} when %r{InvalidationBatch} then @item[:invalidation_batch] = {} end end def tagend(name) case name when 'Marker' then @result[:marker] = @text when 'NextMarker' then @result[:next_marker] = @text when 'MaxItems' then @result[:max_items] = @text.to_i when 'IsTruncated' then @result[:is_truncated] = (@text == 'true') when 'Id' then @item[:aws_id] = @text when 'Status' then @item[:status] = @text when 'CreateTime' then @item[:create_time] = @text when 'Path' then (@item[:invalidation_batch][:path] ||= []) << @text when 'CallerReference' then @item[:invalidation_batch][:caller_reference] = @text when %r{(InvalidationSummary|Invalidation)$} @item[:invalidation_batch][:path].sort! if @item[:invalidation_batch] && !@item[:invalidation_batch][:path].right_blank? @result[:invalidations] << @item end end end end end