Class: Chef::Knife::CookbookBulkDelete

Inherits:
Chef::Knife show all
Defined in:
lib/chef/knife/cookbook_bulk_delete.rb

Constant Summary

Constants inherited from Chef::Knife

OFFICIAL_PLUGINS

Instance Attribute Summary

Attributes inherited from Chef::Knife

#name_args, #ui

Instance Method Summary collapse

Methods inherited from Chef::Knife

#api_key, #apply_computed_config, category, chef_config_dir, #cli_keys, common_name, #config_file_settings, config_loader, #configure_chef, #create_object, #delete_object, dependency_loaders, deps, #format_rest_error, guess_category, #humanize_exception, #humanize_http_exception, inherited, #initialize, list_commands, load_commands, load_config, load_deps, #maybe_setup_fips, #merge_configs, msg, #noauth_rest, #parse_options, reset_config_loader!, reset_subcommands!, #rest, run, #run_with_pretty_exceptions, #server_url, #show_usage, snake_case_name, subcommand_category, subcommand_class_from, subcommand_files, subcommand_loader, subcommands, subcommands_by_category, #test_mandatory_field, ui, unnamed?, use_separate_defaults?, #username

Methods included from Mixin::ConvertToClassName

#constantize, #convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #normalize_snake_case_name, #snake_case_basename

Methods included from Mixin::PathSanity

#enforce_path_sanity, #sanitized_path

Constructor Details

This class inherits a constructor from Chef::Knife

Instance Method Details

#runObject


35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/chef/knife/cookbook_bulk_delete.rb', line 35

def run
  unless regex_str = @name_args.first
    ui.fatal("You must supply a regular expression to match the results against")
    exit 42
  end

  regex = Regexp.new(regex_str)

  all_cookbooks = Chef::CookbookVersion.list
  cookbooks_names = all_cookbooks.keys.grep(regex)
  cookbooks_to_delete = cookbooks_names.inject({}) { |hash, name| hash[name] = all_cookbooks[name]; hash }
  ui.msg "All versions of the following cookbooks will be deleted:"
  ui.msg ""
  ui.msg ui.list(cookbooks_to_delete.keys.sort, :columns_down)
  ui.msg ""

  unless config[:yes]
    ui.confirm("Do you really want to delete these cookbooks")

    if config[:purge]
      ui.msg("Files that are common to multiple cookbooks are shared, so purging the files may break other cookbooks.")
      ui.confirm("Are you sure you want to purge files instead of just deleting the cookbooks")
    end
    ui.msg ""
  end

  cookbooks_names.each do |cookbook_name|
    versions = rest.get("cookbooks/#{cookbook_name}")[cookbook_name]["versions"].map { |v| v["version"] }.flatten
    versions.each do |version|
      rest.delete("cookbooks/#{cookbook_name}/#{version}#{config[:purge] ? "?purge=true" : ""}")
      ui.info("Deleted cookbook  #{cookbook_name.ljust(25)} [#{version}]")
    end
  end
end