class Chef::Knife::PinningsSet

This class implements knife pinnings set <environment> [cookbook version]

Public Instance Methods

run() click to toggle source
# File lib/chef/knife/pinnings_set.rb, line 23
def run
  case name_args.length
  when 1 # Just environment was specified so get name/version from metadata
    @metadata = Chef::Cookbook::Metadata.new
    @metadata.from_file(File.join(Dir.pwd, 'metadata.rb'))
    @cookbook_name    = @metadata.name
    @cookbook_version = @metadata.version
  when 3 # Environment, Cookbook and Version explicitly specified so use those
    @cookbook_name    = name_args[1]
    @cookbook_version = name_args[2]
  else
    ui.fatal('You must specify ENVIRONMENT (to take COOKBOOK/VERSION from matadata.rb) or ENVIRONMENT COOKBOOK VERSION')
    exit 255
  end
  @environment_name   = name_args[0]
  @environment = Environment.load(@environment_name)

  cookbook_data = rest.get_rest("/cookbooks/#{@cookbook_name}").to_hash
  cookbook_version_exists = false
  cookbook_data[@cookbook_name]['versions'].each do |item|
    cookbook_version_exists = true if item['version'] == @cookbook_version
  end

  unless cookbook_version_exists
    ui.fatal("Cookbook #{@cookbook_name} version #{@cookbook_version} is not on Chef server. Cannot pin in #{@environment_name}")
    exit 127
  end

  if @environment.cookbook_versions[@cookbook_name]
    ui.info("Existing pinning for #{@cookbook_name} in #{@environment_name } #{@environment.cookbook_versions[@cookbook_name]}")
  end

  ui.info("Pinning #{@cookbook_name} to version #{@cookbook_version} in #{@environment_name}")
  @environment.cookbook_versions[@cookbook_name] = "= #{@cookbook_version}"
  @environment.save
end