Class: Chef::Knife::CookbookDelete

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

Constant Summary

Constants inherited from Chef::Knife

CHEF_ORGANIZATION_MANAGEMENT, KNIFE_ROOT, OFFICIAL_PLUGINS, OPSCODE_HOSTED_CHEF_ACCESS_CONTROL, VERSION

Instance Attribute Summary collapse

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, common_name, #config_file_defaults, #config_file_settings, config_loader, #config_source, #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, #root_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

Constructor Details

This class inherits a constructor from Chef::Knife

Instance Attribute Details

#cookbook_nameObject

Returns the value of attribute cookbook_name.



25
26
27
# File 'lib/chef/knife/cookbook_delete.rb', line 25

def cookbook_name
  @cookbook_name
end

#versionObject

Returns the value of attribute version.



25
26
27
# File 'lib/chef/knife/cookbook_delete.rb', line 25

def version
  @version
end

Instance Method Details

#ask_which_versions_to_deleteObject



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/chef/knife/cookbook_delete.rb', line 100

def ask_which_versions_to_delete
  question = "Which version(s) do you want to delete?\n"
  valid_responses = {}
  available_versions.each_with_index do |version, index|
    valid_responses[(index + 1).to_s] = version
    question << "#{index + 1}. #{@cookbook_name} #{version}\n"
  end
  valid_responses[(available_versions.size + 1).to_s] = :all
  question << "#{available_versions.size + 1}. All versions\n\n"
  responses = ask_question(question).split(",").map(&:strip)

  if responses.empty?
    ui.error("No versions specified, exiting")
    exit(1)
  end
  versions = responses.map do |response|
    if version = valid_responses[response]
      version
    else
      ui.error("#{response} is not a valid choice, skipping it")
    end
  end
  versions.compact
end

#available_versionsObject



87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/chef/knife/cookbook_delete.rb', line 87

def available_versions
  @available_versions ||= rest.get("cookbooks/#{@cookbook_name}").map do |name, url_and_version|
    url_and_version["versions"].map { |url_by_version| url_by_version["version"] }
  end.flatten
rescue Net::HTTPClientException => e
  if /^404/.match?(e.to_s)
    ui.error("Cannot find a cookbook named #{@cookbook_name} to delete.")
    nil
  else
    raise
  end
end

#delete_all_versionsObject



59
60
61
62
# File 'lib/chef/knife/cookbook_delete.rb', line 59

def delete_all_versions
  confirm("Do you really want to delete all versions of #{@cookbook_name}")
  delete_all_without_confirmation
end

#delete_all_without_confirmationObject



64
65
66
67
68
69
70
71
72
# File 'lib/chef/knife/cookbook_delete.rb', line 64

def delete_all_without_confirmation
  # look up the available versions again just in case the user
  # got to the list of versions to delete and selected 'all'
  # and also a specific version
  @available_versions = nil
  Array(available_versions).each do |version|
    delete_version_without_confirmation(version)
  end
end

#delete_explicit_versionObject



53
54
55
56
57
# File 'lib/chef/knife/cookbook_delete.rb', line 53

def delete_explicit_version
  delete_object(Chef::CookbookVersion, "#{@cookbook_name} version #{@version}", "cookbook") do
    delete_request("cookbooks/#{@cookbook_name}/#{@version}")
  end
end

#delete_version_without_confirmation(version) ⇒ Object



125
126
127
128
129
# File 'lib/chef/knife/cookbook_delete.rb', line 125

def delete_version_without_confirmation(version)
  object = delete_request("cookbooks/#{@cookbook_name}/#{version}")
  output(format_for_display(object)) if config[:print_after]
  ui.info("Deleted cookbook[#{@cookbook_name}][#{version}]")
end

#delete_versions_without_confirmation(versions) ⇒ Object



131
132
133
134
135
136
137
138
139
140
# File 'lib/chef/knife/cookbook_delete.rb', line 131

def delete_versions_without_confirmation(versions)
  versions.each do |version|
    if version == :all
      delete_all_without_confirmation
      break
    else
      delete_version_without_confirmation(version)
    end
  end
end

#delete_without_explicit_versionObject



74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/chef/knife/cookbook_delete.rb', line 74

def delete_without_explicit_version
  if available_versions.nil?
    # we already logged an error or 2 about it, so just bail
    exit(1)
  elsif available_versions.size == 1
    @version = available_versions.first
    delete_explicit_version
  else
    versions_to_delete = ask_which_versions_to_delete
    delete_versions_without_confirmation(versions_to_delete)
  end
end

#runObject



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/chef/knife/cookbook_delete.rb', line 37

def run
  confirm("Files that are common to multiple cookbooks are shared, so purging the files may disable other cookbooks. Are you sure you want to purge files instead of just deleting the cookbook") if config[:purge]
  @cookbook_name, @version = name_args
  if @cookbook_name && @version
    delete_explicit_version
  elsif @cookbook_name && config[:all]
    delete_all_versions
  elsif @cookbook_name && @version.nil?
    delete_without_explicit_version
  elsif @cookbook_name.nil?
    show_usage
    ui.fatal("You must provide the name of the cookbook to delete.")
    exit(1)
  end
end