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



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



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

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
105
106
107
108
109
110
# 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 /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 "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



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

def upgrading?
  @upgrading
end

#upload_to_target(local_path) ⇒ Object



117
118
119
120
121
122
# File 'lib/chef_apply/action/install_chef.rb', line 117

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