Class: ChefApply::Action::InstallChef

Inherits:
Base
  • Object
show all
Defined in:
lib/chef_apply/action/install_chef.rb,
lib/chef_apply/action/install_chef/minimum_chef_version.rb

Defined Under Namespace

Classes: MinimumChefVersion

Instance Attribute Summary

Attributes inherited from Base

#config, #target_host

Instance Method Summary collapse

Methods inherited from Base

#name, #notify, #run

Constructor Details

#initialize(opts = { check_only: false }) ⇒ InstallChef

Returns a new instance of InstallChef.



25
26
27
# File 'lib/chef_apply/action/install_chef.rb', line 25

def initialize(opts = { check_only: false })
  super
end

Instance Method Details

#download_to_workstation(url_path) ⇒ Object



106
107
108
109
# File 'lib/chef_apply/action/install_chef.rb', line 106

def download_to_workstation(url_path)
  require_relative "../file_fetcher"
  ChefApply::FileFetcher.fetch(url_path)
end

#lookup_artifactObject



66
67
68
69
70
71
72
# File 'lib/chef_apply/action/install_chef.rb', line 66

def lookup_artifact
  return @artifact_info if @artifact_info

  require "mixlib/install"
  c = train_to_mixlib(target_host.platform)
  Mixlib::Install.new(c).artifact_info
end

#perform_actionObject



29
30
31
32
33
34
35
# File 'lib/chef_apply/action/install_chef.rb', line 29

def perform_action
  if InstallChef::MinimumChefVersion.check!(target_host, config[:check_only]) == :minimum_version_met
    notify(:already_installed)
  else
    perform_local_install
  end
end

#perform_local_installObject



41
42
43
44
45
46
47
48
49
50
# File 'lib/chef_apply/action/install_chef.rb', line 41

def perform_local_install
  package = lookup_artifact
  notify(:downloading)
  local_path = download_to_workstation(package.url)
  notify(:uploading)
  remote_path = upload_to_target(local_path)
  notify(:installing)
  target_host.install_package(remote_path)
  notify(:install_complete)
end

#perform_remote_installObject

Raises:

  • (NotImplementedError)


52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/chef_apply/action/install_chef.rb', line 52

def perform_remote_install
  # TODO BOOTSTRAP - we'll need to implement this for both platforms
  # require "mixlib/install"
  # installer = Mixlib::Install.new({
  #   platform: "windows",/etc -
  #   product_name: "chef",
  #   channel: :stable,
  #   shell_type: :ps1,
  #   version: "13",
  # })
  # target_host.run_command! installer.install_command
  raise NotImplementedError
end

#train_to_mixlib(platform) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/chef_apply/action/install_chef.rb', line 78

def train_to_mixlib(platform)
  opts = {
    platform_version: platform.release,
    platform: platform.name,
    architecture: platform.arch,
    product_name: "chef",
    product_version: :latest,
    channel: :stable,
    platform_version_compatibility_mode: true,
  }
  case platform.name
  when /windows/
    opts[:platform] = "windows"
  when "redhat", "centos"
    opts[:platform] = "el"
  when "suse"
    opts[:platform] = "sles"
  when "amazon"
    opts[:platform] = "el"
    if platform.release.to_i > 2010 # legacy Amazon version 1
      opts[:platform_version] = "6"
    else
      opts[:platform_version] = "7"
    end
  end
  opts
end

#upgrading?Boolean

Returns:

  • (Boolean)


37
38
39
# File 'lib/chef_apply/action/install_chef.rb', line 37

def upgrading?
  @upgrading
end

#upload_to_target(local_path) ⇒ Object



111
112
113
114
115
116
# File 'lib/chef_apply/action/install_chef.rb', line 111

def upload_to_target(local_path)
  installer_dir = target_host.temp_dir
  remote_path = File.join(installer_dir, File.basename(local_path))
  target_host.upload_file(local_path, remote_path)
  remote_path
end

#version_to_installObject



74
75
76
# File 'lib/chef_apply/action/install_chef.rb', line 74

def version_to_install
  lookup_artifact.version
end