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

'http://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
# File 'lib/beaker-puppet/install_utils/puppet5.rb', line 18

def fetch_build_details(sha_yaml_url)
  dst_folder          = Dir.mktmpdir
  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 )

  return 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



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/beaker-puppet/install_utils/puppet5.rb', line 41

def host_packaging_platform(host)
  packaging_platform = host[:packaging_platform]
  if ENV['BEAKER_PACKAGING_PLATFORMS']
    overrides = Hash[ENV['BEAKER_PACKAGING_PLATFORMS'].split(',').map { |e| e.split('=') }]
    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)



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/beaker-puppet/install_utils/puppet5.rb', line 63

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') if !artifact_url_correct

  return 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



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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
# File 'lib/beaker-puppet/install_utils/puppet5.rb', line 108

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
    if version == "7.2"
      aix_72_ignoreos_hack = "--ignoreos"
    end
    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



185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
# File 'lib/beaker-puppet/install_utils/puppet5.rb', line 185

def install_from_build_data_url(project_name, sha_yaml_url, local_hosts = nil)
  if !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 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)



213
214
215
216
217
218
219
220
221
# File 'lib/beaker-puppet/install_utils/puppet5.rb', line 213

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



164
165
166
167
168
169
170
171
# File 'lib/beaker-puppet/install_utils/puppet5.rb', line 164

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