diff --git a/lib/fog/aws/requests/dns/change_resource_record_sets.rb b/lib/fog/aws/requests/dns/change_resource_record_sets.rb index 10396601d..409e47418 100644 --- a/lib/fog/aws/requests/dns/change_resource_record_sets.rb +++ b/lib/fog/aws/requests/dns/change_resource_record_sets.rb @@ -151,6 +151,19 @@ module Fog end class Mock + SET_PREFIX = 'SET_' + def record_exist?(zone,change,change_name) + return false if zone[:records][change[:type]].nil? + current_records = zone[:records][change[:type]][change_name] + return false if current_records.nil? + + if !change[:set_identifier].empty? + !current_records[change[:SetIdentifier]].nil? + else + !current_records.empty? + end + end + def change_resource_record_sets(zone_id, change_batch, options = {}) response = Excon::Response.new errors = [] @@ -171,9 +184,9 @@ module Fog zone[:records][change[:type]] = {} end - if zone[:records][change[:type]][change_name].nil? + if !record_exist?(zone, change, change_name) # raise change.to_s if change[:resource_records].nil? - zone[:records][change[:type]][change_name] = + new_record = if change[:alias_target] record = { :alias_target => change[:alias_target] @@ -183,17 +196,35 @@ module Fog :ttl => change[:ttl].to_s, } end - zone[:records][change[:type]][change_name] = { + + new_record = { :change_id => change_id, :resource_records => change[:resource_records] || [], :name => change_name, - :type => change[:type] + :type => change[:type], + :set_identifier => change[:set_identifier], + :weight => change[:weight] }.merge(record) + + if change[:set_identifier].nil? + zone[:records][change[:type]][change_name] = new_record + else + zone[:records][change[:type]][change_name] = {} if zone[:records][change[:type]][change_name].nil? + zone[:records][change[:type]][change_name][SET_PREFIX + change[:set_identifier]] = new_record + end else errors << "Tried to create resource record set #{change[:name]}. type #{change[:type]}, but it already exists" end when "DELETE" - if zone[:records][change[:type]].nil? || zone[:records][change[:type]].delete(change_name).nil? + action_performed = false + if !zone[:records][change[:type]].nil? && !zone[:records][change[:type]][change_name].nil? && !change[:set_identifier].nil? + action_performed = true unless zone[:records][change[:type]][change_name].delete(SET_PREFIX + change[:set_identifier]).nil? + zone[:records][change[:type]].delete(change_name) if zone[:records][change[:type]][change_name].empty? + elsif !zone[:records][change[:type]].nil? + action_performed = true unless zone[:records][change[:type]].delete(change_name).nil? + end + + if !action_performed errors << "Tried to delete resource record set #{change[:name]}. type #{change[:type]}, but it was not found" end end diff --git a/lib/fog/aws/requests/dns/list_resource_record_sets.rb b/lib/fog/aws/requests/dns/list_resource_record_sets.rb index 4425b7c14..243b19f5d 100644 --- a/lib/fog/aws/requests/dns/list_resource_record_sets.rb +++ b/lib/fog/aws/requests/dns/list_resource_record_sets.rb @@ -59,6 +59,22 @@ module Fog end class Mock + def list_all_records(record, zone, name) + [].tap do |tmp_records| + tmp_records.push(record) if !record[:name].nil? && ( name.nil? || record[:name].gsub(zone[:name],"") >= name) + record.each do |key,subr| + if subr.is_a?(Hash) && key.is_a?(String) && + key.start_with?(Fog::DNS::AWS::Mock::SET_PREFIX) + if name.nil? + tmp_records.append(subr) + else + tmp_records.append(subr) if !subr[:name].nil? && subr[:name].gsub(zone[:name],"") >= name + end + end + end + end + end + def list_resource_record_sets(zone_id, options = {}) maxitems = [options[:max_items]||100,100].min @@ -76,13 +92,23 @@ module Fog records ||= [] + tmp_records = [] + if options[:name] + name = options[:name].gsub(zone[:name],"") + + records.each do |r| + tmp_records += list_all_records(r, zone, name) + end + else + records.each do |r| + tmp_records += list_all_records(r, zone, nil) + end + end + records = tmp_records + # sort for pagination records.sort! { |a,b| a[:name].gsub(zone[:name],"") <=> b[:name].gsub(zone[:name],"") } - if options[:name] - name = options[:name].gsub(zone[:name],"") - records = records.select{|r| r[:name].gsub(zone[:name],"") >= name } - end next_record = records[maxitems] records = records[0, maxitems] @@ -106,7 +132,9 @@ module Fog { 'ResourceRecords' => r[:resource_records], 'Name' => r[:name], - 'Type' => r[:type] + 'Type' => r[:type], + 'SetIdentifier' => r[:set_identifier], + 'Weight' => r[:weight] }.merge(record) end, 'MaxItems' => maxitems,