Class: Chef::Knife::CookbookDelete

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

Instance Attribute Summary

Attributes inherited from Chef::Knife

#name_args, #ui

Instance Method Summary collapse

Methods inherited from Chef::Knife

#api_key, category, common_name, #configure_chef, #create_object, #delete_object, deps, #format_rest_error, guess_category, #highlight_config_error, #humanize_exception, #humanize_http_exception, inherited, #initialize, list_commands, load_commands, load_deps, msg, #noauth_rest, #parse_options, #read_config_file, reset_subcommands!, #rest, run, #run_with_pretty_exceptions, #server_url, #show_usage, snake_case_name, subcommand_category, subcommand_class_from, subcommand_loader, subcommands, subcommands_by_category, ui, unnamed?, #username

Methods included from Mixin::ConvertToClassName

#convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #snake_case_basename

Constructor Details

This class inherits a constructor from Chef::Knife

Instance Method Details

#ask_which_versions_to_deleteObject



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

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 { |response| response.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



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

def available_versions
  @available_versions ||= rest.get_rest("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::HTTPServerException => e
  if e.to_s =~ /^404/
    ui.error("Cannot find a cookbook named #{@cookbook_name} to delete")
    nil
  else
    raise
  end
end

#delete_all_versionsObject



57
58
59
60
# File 'lib/chef/knife/cookbook_delete.rb', line 57

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



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

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



51
52
53
54
55
# File 'lib/chef/knife/cookbook_delete.rb', line 51

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



123
124
125
126
127
# File 'lib/chef/knife/cookbook_delete.rb', line 123

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



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

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



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

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



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

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