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.



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

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

Instance Method Details

#download_to_workstation(url_path) ⇒ Object



115
116
117
118
# File 'lib/chef_apply/action/install_chef.rb', line 115

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

#lookup_artifactObject



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

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



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

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



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

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)


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

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



77
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
105
106
107
108
109
110
111
112
113
# File 'lib/chef_apply/action/install_chef.rb', line 77

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 /mac_os_x/
    if platform.release.to_i >= 17
      opts[:platform_version] = "10.13"
    else
      raise NotImplementedError
    end
  when /windows/
    opts[:platform] = "windows"
  when "redhat", "centos"
    opts[:platform] = "el"
  when "suse"
    opts[:platform] = "sles"
  when "solaris"
    opts[:platform] = "solaris2"
  when "aix"
    opts[:platform] = "aix"
  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)


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

def upgrading?
  @upgrading
end

#upload_to_target(local_path) ⇒ Object



120
121
122
123
124
125
# File 'lib/chef_apply/action/install_chef.rb', line 120

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



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

def version_to_install
  lookup_artifact.version
end