Module: Beaker::DSL::InstallUtils::Puppet5

Includes:
FOSSDefaults
Included in:
BeakerPuppet
Defined in:
lib/beaker-puppet/install_utils/puppet5.rb

Constant Summary collapse

DEFAULT_DEV_BUILDS_URL =

Base URL for internal Puppet Inc. builds

'https://builds.delivery.puppetlabs.net'

Constants included from FOSSDefaults

FOSSDefaults::FOSS_DEFAULTS, FOSSDefaults::FOSS_DEFAULT_DOWNLOAD_URLS

Instance Method Summary collapse

Methods included from FOSSDefaults

#add_foss_defaults_on, #add_platform_foss_defaults, #remove_foss_defaults_on, #remove_platform_foss_defaults

Instance Method Details

#fetch_build_details(sha_yaml_url) ⇒ Hash{String=>String}

grab build json from the builds server

Parameters:

  • sha_yaml_url (String)

    URL to the <SHA>.yaml file containing the build details

Returns:

  • (Hash{String=>String})

    build json parsed into a ruby hash



18
19
20
21
22
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
# File 'lib/beaker-puppet/install_utils/puppet5.rb', line 18

def fetch_build_details(sha_yaml_url)
  dst_folder = Dir.mktmpdir

  at_exit do
    if ($!.nil? || ($!.is_a?(SystemExit) && $!.success?)) && File.directory?(dst_folder)
      require 'fileutils'

      FileUtils.rm_rf(dst_folder)
    end
  end

  sha_yaml_filename   = File.basename(sha_yaml_url)
  sha_yaml_folder_url = File.dirname(sha_yaml_url)

  sha_yaml_file_local_path = fetch_http_file(
    sha_yaml_folder_url,
    sha_yaml_filename,
    dst_folder,
  )

  file_hash = YAML.load_file(sha_yaml_file_local_path)

  unless file_hash.is_a?(Hash)
    message = <<-EOF
      Data fetched from #{sha_yaml_url} is invalid

      If the URL appears to be something that you should not normally
      access, your ISP may be hijacking failed web results. Updating
      your DNS settings to use a public DNS resolver should remedy the
      issue.
    EOF

    fail_test(message)
  end

  [sha_yaml_folder_url, file_hash[:platform_data]]
end

#host_packaging_platform(host) ⇒ String

Get the host’s packaging platform, based on beaker-hostgenerator’s osinfo hash and the environment. Set ENV to override the default packaging platform specified by beaker-hostgenerator. This should be a comma-separated string with entries of the format ‘<host-platform>=<override-platform>`

Parameters:

  • host (Host)

    Host whose packaging platform to determine

Returns:

  • (String)

    The packaging platform



64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/beaker-puppet/install_utils/puppet5.rb', line 64

def host_packaging_platform(host)
  packaging_platform = host[:packaging_platform]
  if ENV['BEAKER_PACKAGING_PLATFORMS']
    overrides = ENV['BEAKER_PACKAGING_PLATFORMS'].split(',').map { |e| e.split('=') }.to_h
    logger.debug("Found packaging platform overrides: #{overrides}")
    if overrides[host[:platform]]
      platform = overrides[host[:platform]]
      logger.debug("Default beaker packaging platform '#{host[:packaging_platform]}' for '#{host[:platform]}' overridden as '#{platform}'")
      packaging_platform = platform
    end
  end
  packaging_platform
end

#host_urls(host, build_details, build_url) ⇒ String

Gets the artifact & repo_config URLs for this host in the build.

Parameters:

  • host (Host)

    Host to get artifact URL for

  • build_details (Hash)

    Details of the build in a hash

  • build_url (String)

    URL to the build

Returns:

  • (String, String)

    URL to the build artifact, URL to the repo_config (nil if there is no repo_config for this platform for this build)



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
114
115
116
117
118
119
120
121
122
# File 'lib/beaker-puppet/install_utils/puppet5.rb', line 86

def host_urls(host, build_details, build_url)
  packaging_platform = host_packaging_platform(host)
  if packaging_platform.nil?
    message = <<-EOF
      :packaging_platform not provided for host '#{host}', platform '#{host[:platform]}'
      :packaging_platform should be the platform-specific key from this list:
        #{build_details.keys}
    EOF
    fail_test(message)
  end

  logger.debug('Platforms available for this build:')
  logger.debug("#{build_details.keys}")
  logger.debug("PLATFORM SPECIFIC INFO for #{host} (packaging name '#{packaging_platform}'):")
  packaging_data = build_details[packaging_platform]
  logger.debug("- #{packaging_data}, isnil? #{packaging_data.nil?}")
  if packaging_data.nil?
    message = <<-EOF
      :packaging_platform '#{packaging_platform}' for host '#{host}' not in build details
      :packaging_platform should be the platform-specific key from this list:
        #{build_details.keys}
    EOF
    fail_test(message)
  end

  artifact_buildserver_path   = packaging_data[:artifact]
  repoconfig_buildserver_path = packaging_data[:repo_config]
  fail_test('no artifact_buildserver_path found') if artifact_buildserver_path.nil?

  artifact_url    = "#{build_url}/#{artifact_buildserver_path}"
  repoconfig_url  = "#{build_url}/#{repoconfig_buildserver_path}" unless repoconfig_buildserver_path.nil?
  artifact_url_correct = link_exists?(artifact_url)
  logger.debug("- artifact url: '#{artifact_url}'. Exists? #{artifact_url_correct}")
  fail_test('artifact url built incorrectly') unless artifact_url_correct

  [artifact_url, repoconfig_url]
end

#install_artifact_on(host, artifact_url, project_name) ⇒ Object

install build artifact on the given host

Parameters:

  • host (Host)

    Host to install artifact on

  • artifact_url (String)

    URL of the project install artifact

  • project_name (String)

    Name of project for artifact. Needed for OSX installs

Returns:

  • nil



131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
# File 'lib/beaker-puppet/install_utils/puppet5.rb', line 131

def install_artifact_on(host, artifact_url, project_name)
  variant, version, = host[:platform].to_array
  case variant
  when 'eos'
    host.get_remote_file(artifact_url)
    onhost_package_file = File.basename(artifact_url)
    # TODO: Will be refactored into {Beaker::Host#install_local_package}
    #   immediately following this work. The release timing makes it
    #   necessary to have this here separately for a short while
    host.install_from_file(onhost_package_file)
  when 'solaris'
    artifact_filename = File.basename(artifact_url)
    artifact_folder = File.dirname(artifact_url)
    fetch_http_file(artifact_folder, artifact_filename, '.')
    onhost_package_dir = host.tmpdir('puppet_installer')
    scp_to host, artifact_filename, onhost_package_dir
    onhost_package_file = "#{onhost_package_dir}/#{artifact_filename}"
    host.install_local_package(onhost_package_file, '.')
  when 'osx'
    on host, "curl -O #{artifact_url}"
    onhost_package_file = "#{project_name}*"
    host.install_local_package(onhost_package_file)
  when 'windows'
    if project_name == 'puppet-agent'
      install_msi_on(host, artifact_url)
    else
      generic_install_msi_on(host, artifact_url)
    end
  when 'aix'
    artifact_filename = File.basename(artifact_url)
    artifact_folder = File.dirname(artifact_url)
    fetch_http_file(artifact_folder, artifact_filename, '.')
    onhost_package_dir = host.tmpdir('puppet_installer')
    scp_to host, artifact_filename, onhost_package_dir
    onhost_package_file = "#{onhost_package_dir}/#{artifact_filename}"

    # TODO: Will be refactored into {Beaker::Host#install_local_package}
    #   immediately following this work. The release timing makes it
    #   necessary to have this here seperately for a short while
    # NOTE: the AIX 7.1 package will only install on 7.2 with
    # --ignoreos. This is a bug in package building on AIX 7.1's RPM
    aix_72_ignoreos_hack = '--ignoreos' if version == '7.2'
    on host, "rpm -ivh #{aix_72_ignoreos_hack} #{onhost_package_file}"
  else
    host.install_package(artifact_url)
  end
end

#install_from_build_data_url(project_name, sha_yaml_url, local_hosts = nil) ⇒ Object

Note:

This install method only works for Puppet versions >= 5.0

Installs a specified puppet project on all hosts. Gets build information

from the provided YAML file located at the +sha_yaml_url+ parameter.

Parameters:

  • project_name (String)

    Name of the project to install

  • sha_yaml_url (String)

    URL to the <SHA>.yaml file containing the build details

  • hosts (String or Array)

    Optional string or array of host or hosts to install on

Returns:

  • nil



206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
# File 'lib/beaker-puppet/install_utils/puppet5.rb', line 206

def install_from_build_data_url(project_name, sha_yaml_url, local_hosts = nil)
  unless link_exists?(sha_yaml_url)
    message = <<-EOF
      Unable to locate a downloadable build of #{project_name} (tried #{sha_yaml_url})
    EOF
    fail_test(message)
  end

  base_url, build_details = fetch_build_details(sha_yaml_url)

  install_targets = local_hosts.nil? ? hosts : Array(local_hosts)

  install_targets.each do |host|
    artifact_url, repoconfig_url = host_urls(host, build_details, base_url)
    if host.platform.variant == 'ubuntu' && host.platform.version.to_f >= 24.04
      # install the specific artifact we built, not based on how its repos are configured
      tmp_file = host.tmpfile('puppet-agent')
      on(host, "curl -L --output #{tmp_file} #{artifact_url}")
      host.install_local_package(tmp_file)
    elsif repoconfig_url.nil?
      install_artifact_on(host, artifact_url, project_name)
    else
      install_repo_configs_on(host, repoconfig_url)
      host.install_package(project_name)
    end
    configure_type_defaults_on(host)
  end
end

#install_puppet_agent_from_dev_builds_on(one_or_more_hosts, ref) ⇒ Object

Install puppet-agent from an internal Puppet development build. This method only works inside Puppet’s corporate VPN.

Parameters:

  • one_or_more_hosts (Host|Array<Host>)

    to install the agent on

  • ref (String)

    to install (this can be a tag or a long SHA)



239
240
241
242
243
244
245
246
247
# File 'lib/beaker-puppet/install_utils/puppet5.rb', line 239

def install_puppet_agent_from_dev_builds_on(one_or_more_hosts, ref)
  block_on(one_or_more_hosts, run_in_parallel: true) do |host|
    unless dev_builds_accessible_on?(host)
      fail_test("Can't install puppet-agent #{ref}: unable to access Puppet's internal builds")
    end
  end
  sha_yaml_url = File.join(DEFAULT_DEV_BUILDS_URL, 'puppet-agent', ref, 'artifacts', "#{ref}.yaml")
  install_from_build_data_url('puppet-agent', sha_yaml_url, one_or_more_hosts)
end

#install_repo_configs_on(host, repoconfig_url) ⇒ Object

Sets up the repo_configs on the host for this build

Parameters:

  • host (Host)

    Host to install repo_configs on

  • repoconfig_url (String)

    URL to the repo_config

Returns:

  • nil



185
186
187
188
189
190
191
192
# File 'lib/beaker-puppet/install_utils/puppet5.rb', line 185

def install_repo_configs_on(host, repoconfig_url)
  if repoconfig_url.nil?
    logger.warn("No repo_config for host '#{host}'. Skipping repo_config install")
    return
  end

  install_repo_configs_from_url(host, repoconfig_url)
end