class KnifeUploader::UploaderDataBagDiff

Public Instance Methods

diff_data_bag_item_files(bag_name1, bag_name2) click to toggle source
# File lib/chef/knife/uploader_data_bag.rb, line 233
def diff_data_bag_item_files(bag_name1, bag_name2)
  ensure_data_bag_dir_exists(bag_name1)
  ensure_data_bag_dir_exists(bag_name2)

  items_to_compare = {}
  processed_items = Set.new()
  list_data_bag_item_ids(bag_name1).each do |item_id|
    item2 = load_data_bag_item_file(bag_name2, item_id, :can_skip)
    if item2
      item1 = load_data_bag_item_file(bag_name1, item_id, :must_exist)
      processed_items << item_id
      items_to_compare[item_id] = [item1, item2]
    end
  end
  list_data_bag_item_ids(bag_name2).each do |item_id|
    unless processed_items.include?(item_id)
      item1 = load_data_bag_item_file(bag_name1, item_id, :can_skip)
      if item1
        item2 = load_data_bag_item_file(bag_name2, item_id, :must_exist)
        items_to_compare[item_id] = [item1, item2]
      end
    end
  end

  if items_to_compare.empty?
    ui.error("Did not find any data bag items to compare between #{bag_name1} and #{bag_name2}")
    return
  end

  # Find at least one data bag item on the Chef server. This is necessary to be able to
  # decrypt data bags for comparison.
  data_bag1 = ridley.data_bag.find(bag_name1)
  item = nil
  items_to_compare.keys.sort.each do |item_id|
    item = data_bag1.item.find(item_id)
    break if item
  end
  unless item
    fatal_error("Could not find any of the following items in the data bag #{bag_name1}: " +
                items_to_compare.keys.sort.join(', '))
  end

  items_to_compare.sort.each do |item_id, attributes_pair|
    item.id = item_id
    diff_data_bag_item(item, item_id, *attributes_pair, 'Differences for',
                       "local #{bag_name1}", "local #{bag_name2}")
  end
end
run_internal() click to toggle source
# File lib/chef/knife/uploader_data_bag.rb, line 282
def run_internal
  if name_args.size < 1 || name_args.size > 2
    ui.fatal("One or two arguments (data bag names) expected")
    show_usage
    exit(1)
  end

  report_errors do
    if name_args.size == 1
      @dry_run = true
      report_errors { set_data_bag_items(name_args.first) }
    else
      diff_data_bag_item_files(name_args[0], name_args[1])
    end
  end
end