Class: ChefApply::Action::InstallChef::Base

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

Direct Known Subclasses

Linux, Windows

Constant Summary collapse

MIN_CHEF_VERSION =
Gem::Version.new("13.0.0")

Constants inherited from Base

Base::PATH_MAPPING

Instance Attribute Summary

Attributes inherited from Base

#config, #target_host

Instance Method Summary collapse

Methods inherited from Base

#escape_windows_path, #initialize, #notify, #run, #run_chef

Constructor Details

This class inherits a constructor from ChefApply::Action::Base

Instance Method Details

#download_to_workstation(url_path) ⇒ Object



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

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

#install_chef_to_target(remote_path) ⇒ Object

Raises:

  • (NotImplementedError)


123
124
125
# File 'lib/chef_apply/action/install_chef/base.rb', line 123

def install_chef_to_target(remote_path)
  raise NotImplementedError
end

#lookup_artifactObject



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

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

#nameObject



43
44
45
46
47
# File 'lib/chef_apply/action/install_chef/base.rb', line 43

def name
  # We have subclasses - so this'll take the qualified name
  # eg InstallChef::Windows, etc
  self.class.name.split("::")[-2..-1].join("::")
end

#perform_actionObject



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/chef_apply/action/install_chef/base.rb', line 25

def perform_action
  if target_host.installed_chef_version >= MIN_CHEF_VERSION
    notify(:already_installed)
    return
  end
  raise ClientOutdated.new(target_host.installed_chef_version, MIN_CHEF_VERSION)
  # NOTE: 2018-05-10 below is an intentionally dead code path that
  #       will get re-visited once we determine how we want automatic
  #       upgrades to behave.
  # @upgrading = true
  # perform_local_install
rescue ChefApply::TargetHost::ChefNotInstalled
  if config[:check_only]
    raise ClientNotInstalled.new()
  end
  perform_local_install
end

#perform_local_installObject



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

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)
  install_chef_to_target(remote_path)
  notify(:install_complete)
end

#perform_remote_installObject

Raises:

  • (NotImplementedError)


64
65
66
# File 'lib/chef_apply/action/install_chef/base.rb', line 64

def perform_remote_install
  raise NotImplementedError
end

#setup_remote_temp_pathObject

Raises:

  • (NotImplementedError)


119
120
121
# File 'lib/chef_apply/action/install_chef/base.rb', line 119

def setup_remote_temp_path
  raise NotImplementedError
end

#train_to_mixlib(platform) ⇒ Object



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
# File 'lib/chef_apply/action/install_chef/base.rb', line 79

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



49
50
51
# File 'lib/chef_apply/action/install_chef/base.rb', line 49

def upgrading?
  @upgrading
end

#upload_to_target(local_path) ⇒ Object



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

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

#version_to_installObject



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

def version_to_install
  lookup_artifact.version
end