Class: Chef::Knife::PinningsSet

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

Overview

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

Instance Method Summary collapse

Instance Method Details

#runObject



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 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