beaker-puppet 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +25 -0
  3. data/.simplecov +9 -0
  4. data/Gemfile +25 -0
  5. data/HISTORY.md +8 -0
  6. data/LICENSE +202 -0
  7. data/README.md +55 -0
  8. data/Rakefile +299 -0
  9. data/acceptance/config/acceptance-options.rb +6 -0
  10. data/acceptance/config/gem/acceptance-options.rb +9 -0
  11. data/acceptance/config/git/acceptance-options.rb +9 -0
  12. data/acceptance/config/nodes/vagrant-ubuntu-1404.yml +8 -0
  13. data/acceptance/config/pkg/acceptance-options.rb +8 -0
  14. data/acceptance/lib/beaker/acceptance/install_utils.rb +58 -0
  15. data/acceptance/pre_suite/gem/install.rb +8 -0
  16. data/acceptance/pre_suite/git/install.rb +97 -0
  17. data/acceptance/pre_suite/pkg/install.rb +9 -0
  18. data/acceptance/tests/README.md +3 -0
  19. data/acceptance/tests/backwards_compatible.rb +19 -0
  20. data/acceptance/tests/install_smoke_test.rb +21 -0
  21. data/acceptance/tests/stub_host.rb +47 -0
  22. data/acceptance/tests/web_helpers_test.rb +54 -0
  23. data/acceptance/tests/with_puppet_running_on.rb +26 -0
  24. data/beaker-puppet.gemspec +38 -0
  25. data/bin/beaker-puppet +32 -0
  26. data/lib/beaker-puppet.rb +46 -0
  27. data/lib/beaker-puppet/helpers/facter_helpers.rb +57 -0
  28. data/lib/beaker-puppet/helpers/puppet_helpers.rb +865 -0
  29. data/lib/beaker-puppet/helpers/tk_helpers.rb +89 -0
  30. data/lib/beaker-puppet/install_utils/aio_defaults.rb +93 -0
  31. data/lib/beaker-puppet/install_utils/ezbake_utils.rb +256 -0
  32. data/lib/beaker-puppet/install_utils/foss_defaults.rb +211 -0
  33. data/lib/beaker-puppet/install_utils/foss_utils.rb +1309 -0
  34. data/lib/beaker-puppet/install_utils/module_utils.rb +244 -0
  35. data/lib/beaker-puppet/install_utils/puppet_utils.rb +157 -0
  36. data/lib/beaker-puppet/version.rb +3 -0
  37. data/lib/beaker-puppet/wrappers.rb +93 -0
  38. data/lib/beaker/dsl/helpers/facter_helpers.rb +1 -0
  39. data/lib/beaker/dsl/helpers/puppet_helpers.rb +1 -0
  40. data/lib/beaker/dsl/helpers/tk_helpers.rb +1 -0
  41. data/lib/beaker/dsl/install_utils/aio_defaults.rb +1 -0
  42. data/lib/beaker/dsl/install_utils/ezbake_utils.rb +1 -0
  43. data/lib/beaker/dsl/install_utils/foss_defaults.rb +1 -0
  44. data/lib/beaker/dsl/install_utils/foss_utils.rb +1 -0
  45. data/lib/beaker/dsl/install_utils/module_utils.rb +1 -0
  46. data/lib/beaker/dsl/install_utils/puppet_utils.rb +1 -0
  47. data/spec/beaker-puppet/helpers/facter_helpers_spec.rb +64 -0
  48. data/spec/beaker-puppet/helpers/puppet_helpers_spec.rb +1287 -0
  49. data/spec/beaker-puppet/helpers/tk_helpers_spec.rb +86 -0
  50. data/spec/helpers.rb +109 -0
  51. data/spec/spec_helper.rb +23 -0
  52. metadata +249 -0
@@ -0,0 +1,89 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'hocon'
3
+ require 'hocon/config_error'
4
+ require 'inifile'
5
+
6
+ module Beaker
7
+ module DSL
8
+ module Helpers
9
+ # Convenience methods for modifying and reading TrapperKeeper configs
10
+ module TKHelpers
11
+
12
+ # Modify the given TrapperKeeper config file.
13
+ #
14
+ # @param [Host] host A host object
15
+ # @param [OptionsHash] options_hash New hash which will be merged into
16
+ # the given TrapperKeeper config.
17
+ # @param [String] config_file_path Path to the TrapperKeeper config on
18
+ # the given host which is to be
19
+ # modified.
20
+ # @param [Bool] replace If set true, instead of updating the existing
21
+ # TrapperKeeper configuration, replace it entirely
22
+ # with the contents of the given hash.
23
+ #
24
+ # @note TrapperKeeper config files can be HOCON, JSON, or Ini. We don't
25
+ # particularly care which of these the file named by `config_file_path` on
26
+ # the SUT actually is, just that the contents can be parsed into a map.
27
+ #
28
+ def modify_tk_config(host, config_file_path, options_hash, replace=false)
29
+ if options_hash.empty?
30
+ return nil
31
+ end
32
+
33
+ new_hash = Beaker::Options::OptionsHash.new
34
+
35
+ if replace
36
+ new_hash.merge!(options_hash)
37
+ else
38
+ if not host.file_exist?( config_file_path )
39
+ raise "Error: #{config_file_path} does not exist on #{host}"
40
+ end
41
+ file_string = host.exec( Command.new( "cat #{config_file_path}" )).stdout
42
+
43
+ begin
44
+ tk_conf_hash = read_tk_config_string(file_string)
45
+ rescue RuntimeError
46
+ raise "Error reading trapperkeeper config: #{config_file_path} at host: #{host}"
47
+ end
48
+
49
+ new_hash.merge!(tk_conf_hash)
50
+ new_hash.merge!(options_hash)
51
+ end
52
+
53
+ file_string = JSON.pretty_generate(new_hash)
54
+ create_remote_file host, config_file_path, file_string
55
+ end
56
+
57
+ # The Trapperkeeper config service will accept HOCON (aka typesafe), JSON,
58
+ # or Ini configuration files which means we need to safely handle the the
59
+ # exceptions that might come from parsing the given string with the wrong
60
+ # parser and fall back to the next valid parser in turn. We finally raise
61
+ # a RuntimeException if none of the parsers succeed.
62
+ #
63
+ # @!visibility private
64
+ def read_tk_config_string( string )
65
+ begin
66
+ return Hocon.parse(string)
67
+ rescue Hocon::ConfigError
68
+ nil
69
+ end
70
+
71
+ begin
72
+ return JSON.parse(string)
73
+ rescue JSON::JSONError
74
+ nil
75
+ end
76
+
77
+ begin
78
+ return IniFile.new(content: string)
79
+ rescue IniFile::Error
80
+ nil
81
+ end
82
+
83
+ raise "Failed to read TrapperKeeper config!"
84
+ end
85
+ end
86
+
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,93 @@
1
+ module Beaker
2
+ module DSL
3
+ module InstallUtils
4
+ #
5
+ # This module contains default values for aio paths and directorys per-platform
6
+ #
7
+ module AIODefaults
8
+
9
+ #Here be the pathing and default values for AIO installs
10
+ #
11
+ AIO_DEFAULTS = {
12
+ 'unix' => {
13
+ 'puppetbindir' => '/opt/puppetlabs/bin',
14
+ 'privatebindir' => '/opt/puppetlabs/puppet/bin',
15
+ 'distmoduledir' => '/etc/puppetlabs/code/modules',
16
+ 'sitemoduledir' => '/opt/puppetlabs/puppet/modules',
17
+ },
18
+ 'windows' => { #windows
19
+ 'puppetbindir' => '/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet/bin',
20
+ 'privatebindir' => '/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/sys/ruby/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet/sys/ruby/bin',
21
+ 'distmoduledir' => '`cygpath -smF 35`/PuppetLabs/code/modules',
22
+ # sitemoduledir not included (check PUP-4049 for more info)
23
+ },
24
+ 'pwindows' => { #pure windows
25
+ 'puppetbindir' => '"C:\\Program Files (x86)\\Puppet Labs\\Puppet\\bin";"C:\\Program Files\\Puppet Labs\\Puppet\\bin"',
26
+ 'privatebindir' => '"C:\\Program Files (x86)\\Puppet Labs\\Puppet\\sys\\ruby\\bin";"C:\\Program Files\\Puppet Labs\\Puppet\\sys\\ruby\\bin"',
27
+ 'distmoduledir' => 'C:\\ProgramData\\PuppetLabs\\code\\modules',
28
+ }
29
+ }
30
+
31
+ # Add the appropriate aio defaults to the host object so that they can be accessed using host[option], set host[:type] = aio
32
+ # @param [Host] host A single host to act upon
33
+ # @param [String] platform The platform type of this host, one of windows or unix
34
+ def add_platform_aio_defaults(host, platform)
35
+ AIO_DEFAULTS[platform].each_pair do |key, val|
36
+ host[key] = val
37
+ end
38
+ # add group and type here for backwards compatability
39
+ if host['platform'] =~ /windows/
40
+ host['group'] = 'Administrators'
41
+ else
42
+ host['group'] = 'puppet'
43
+ end
44
+ end
45
+
46
+ # Add the appropriate aio defaults to an array of hosts
47
+ # @param [Host, Array<Host>, String, Symbol] hosts One or more hosts to act upon,
48
+ # or a role (String or Symbol) that identifies one or more hosts.
49
+ def add_aio_defaults_on(hosts)
50
+ block_on hosts do | host |
51
+ if host.is_powershell?
52
+ platform = 'pwindows'
53
+ elsif host['platform'] =~ /windows/
54
+ platform = 'windows'
55
+ else
56
+ platform = 'unix'
57
+ end
58
+ add_platform_aio_defaults(host, platform)
59
+ end
60
+ end
61
+
62
+ # Remove the appropriate aio defaults from the host object so that they can no longer be accessed using host[option], set host[:type] = nil
63
+ # @param [Host] host A single host to act upon
64
+ # @param [String] platform The platform type of this host, one of windows, pswindows, freebsd, mac & unix
65
+ def remove_platform_aio_defaults(host, platform)
66
+ AIO_DEFAULTS[platform].each_pair do |key, val|
67
+ host.delete(key)
68
+ end
69
+ host['group'] = nil
70
+ end
71
+
72
+ # Remove the appropriate aio defaults from an array of hosts
73
+ # @param [Host, Array<Host>, String, Symbol] hosts One or more hosts to act upon,
74
+ # or a role (String or Symbol) that identifies one or more hosts.
75
+ def remove_aio_defaults_on(hosts)
76
+ block_on hosts do | host |
77
+ if host.is_powershell?
78
+ platform = 'pswindows'
79
+ elsif host['platform'] =~ /windows/
80
+ platform = 'windows'
81
+ else
82
+ platform = 'unix'
83
+ end
84
+ remove_platform_aio_defaults(host, platform)
85
+ end
86
+ end
87
+
88
+
89
+ end
90
+ end
91
+ end
92
+ end
93
+
@@ -0,0 +1,256 @@
1
+ require 'fileutils'
2
+
3
+ module Beaker
4
+ module DSL
5
+ module InstallUtils
6
+ # This module contains methods to assist in installing projects from source
7
+ # that use ezbake for packaging.
8
+ #
9
+ module EZBakeUtils
10
+
11
+ # @!group Public DSL Methods
12
+
13
+ # Installs leiningen project with given name and version on remote host.
14
+ #
15
+ # @param [Host] host A single remote host on which to install the
16
+ # specified leiningen project.
17
+ def install_from_ezbake host
18
+ ezbake_validate_support host
19
+ ezbake_tools_available?
20
+ install_ezbake_tarball_on_host host
21
+ ezbake_installsh host, "service"
22
+ end
23
+
24
+ # Installs termini with given name and version on remote host.
25
+ #
26
+ # @param [Host] host A single remote host on which to install the
27
+ # specified leiningen project.
28
+ def install_termini_from_ezbake host
29
+ ezbake_validate_support host
30
+ ezbake_tools_available?
31
+ install_ezbake_tarball_on_host host
32
+ ezbake_installsh host, "termini"
33
+ end
34
+
35
+ # Install a development version of ezbake into the local m2 repository
36
+ #
37
+ # This can be useful if you want to work on a development branch of
38
+ # ezbake that hasn't been released yet. Ensure your project dependencies
39
+ # in your development branch include a reference to the -SNAPSHOT
40
+ # version of the project for it to successfully pickup a pre-shipped
41
+ # version of ezbake.
42
+ #
43
+ # @param url [String] git url
44
+ # @param branch [String] git branch
45
+ def ezbake_dev_build url = "git@github.com:puppetlabs/ezbake.git",
46
+ branch = "master"
47
+ ezbake_dir = 'tmp/ezbake'
48
+ conditionally_clone url, ezbake_dir, branch
49
+ lp = ezbake_lein_prefix
50
+
51
+ Dir.chdir(ezbake_dir) do
52
+ ezbake_local_cmd "#{lp} install",
53
+ :throw_on_failure => true
54
+ end
55
+ end
56
+
57
+ # @!endgroup
58
+
59
+ class << self
60
+ attr_accessor :config
61
+ end
62
+
63
+ # @!group Private helpers
64
+
65
+ # Test for support in one place
66
+ #
67
+ # @param [Host] host host to check for support
68
+ # @raise [RuntimeError] if OS is not supported
69
+ # @api private
70
+ def ezbake_validate_support host
71
+ variant, version, _, _ = host['platform'].to_array
72
+ unless variant =~ /^(fedora|el|centos|debian|ubuntu)$/
73
+ raise RuntimeError,
74
+ "No support for #{variant} within ezbake_utils ..."
75
+ end
76
+ end
77
+
78
+ # Build, copy & unpack tarball on remote host
79
+ #
80
+ # @param [Host] host installation destination
81
+ # @api private
82
+ def install_ezbake_tarball_on_host host
83
+ if not ezbake_config
84
+ ezbake_stage
85
+ end
86
+
87
+ # Skip installation if the remote directory exists
88
+ result = on host, "test -d #{ezbake_install_dir}", :acceptable_exit_codes => [0, 1]
89
+ return if result.exit_code == 0
90
+
91
+ ezbake_staging_dir = File.join('target', 'staging')
92
+ Dir.chdir(ezbake_staging_dir) do
93
+ ezbake_local_cmd 'rake package:tar'
94
+ end
95
+
96
+ local_tarball = ezbake_staging_dir + "/pkg/" + ezbake_install_name + ".tar.gz"
97
+ remote_tarball = ezbake_install_dir + ".tar.gz"
98
+ scp_to host, local_tarball, remote_tarball
99
+
100
+ # untar tarball on host
101
+ on host, "tar -xzf " + remote_tarball
102
+
103
+ # Check to ensure directory exists
104
+ on host, "test -d #{ezbake_install_dir}"
105
+ end
106
+
107
+ LOCAL_COMMANDS_REQUIRED = [
108
+ ['leiningen', 'lein --version', nil],
109
+ ['lein-pprint', 'lein with-profile ci pprint :version',
110
+ 'Must have lein-pprint installed under the :ci profile.'],
111
+ ['java', 'java -version', nil],
112
+ ['git', 'git --version', nil],
113
+ ['rake', 'rake --version', nil],
114
+ ]
115
+
116
+ # Checks given host for the tools necessary to perform
117
+ # install_from_ezbake.
118
+ #
119
+ # @raise [RuntimeError] if tool is not found
120
+ # @api private
121
+ def ezbake_tools_available?
122
+ LOCAL_COMMANDS_REQUIRED.each do |software_name, command, additional_error_message|
123
+ if not system command
124
+ error_message = "Must have #{software_name} installed on development system.\n"
125
+ if additional_error_message
126
+ error_message += additional_error_message
127
+ end
128
+ raise RuntimeError, error_message
129
+ end
130
+ end
131
+ end
132
+
133
+ # Return the ezbake config.
134
+ #
135
+ # @return [Hash] configuration for ezbake, usually from ezbake.rb
136
+ # @api private
137
+ def ezbake_config
138
+ EZBakeUtils.config
139
+ end
140
+
141
+ # Returns a leiningen prefix with local m2 repo capability
142
+ #
143
+ # @return [String] lein prefix command that uses a local build
144
+ # m2 repository.
145
+ # @api private
146
+ def ezbake_lein_prefix
147
+ # Get the absolute path to the local repo
148
+ m2_repo = File.join(Dir.pwd, 'tmp', 'm2-local')
149
+
150
+ 'lein update-in : assoc :local-repo "\"' + m2_repo + '\"" --'
151
+ end
152
+
153
+ # Prepares a staging directory for the specified project.
154
+ #
155
+ # @api private
156
+ def ezbake_stage
157
+ # Install the PuppetDB jar into the local repository
158
+ ezbake_local_cmd "#{ezbake_lein_prefix} install",
159
+ :throw_on_failure => true
160
+
161
+ # Run ezbake stage
162
+ ezbake_local_cmd "#{ezbake_lein_prefix} with-profile ezbake ezbake stage",
163
+ :throw_on_failure => true
164
+
165
+ # Boostrap packaging, and grab configuration info from project
166
+ staging_dir = File.join('target','staging')
167
+ Dir.chdir(staging_dir) do
168
+ ezbake_local_cmd 'rake package:bootstrap'
169
+
170
+ load 'ezbake.rb'
171
+ ezbake = EZBake::Config
172
+ ezbake[:package_version] = `printf $(rake pl:print_build_param[ref] | tail -n 1)`
173
+ EZBakeUtils.config = ezbake
174
+ end
175
+ end
176
+
177
+ # Executes a local command using system, logging the prepared command
178
+ #
179
+ # @param [String] cmd command to execute
180
+ # @param [Hash] opts options
181
+ # @option opts [bool] :throw_on_failure If true, throws an
182
+ # exception if the exit code is non-zero. Defaults to false.
183
+ # @return [bool] true if exit == 0 false if otherwise
184
+ # @raise [RuntimeError] if :throw_on_failure is true and
185
+ # command fails
186
+ # @api private
187
+ def ezbake_local_cmd cmd, opts={}
188
+ opts = {
189
+ :throw_on_failure => false,
190
+ }.merge(opts)
191
+
192
+ logger.notify "localhost $ #{cmd}"
193
+ result = system cmd
194
+ if opts[:throw_on_failure] && result == false
195
+ raise RuntimeError, "Command failure #{cmd}"
196
+ end
197
+ result
198
+ end
199
+
200
+ # Retrieve the tarball installation name. This is the name of
201
+ # the tarball without the .tar.gz extension, and the name of the
202
+ # path where it will unpack to.
203
+ #
204
+ # @return [String] name of the tarball and directory
205
+ # @api private
206
+ def ezbake_install_name
207
+ ezbake = ezbake_config
208
+ project_package_version = ezbake[:package_version]
209
+ project_name = ezbake[:project]
210
+ "%s-%s" % [ project_name, project_package_version ]
211
+ end
212
+
213
+ # Returns the full path to the installed software on the remote host.
214
+ #
215
+ # This only returns the path, it doesn't work out if its installed or
216
+ # not.
217
+ #
218
+ # @return [String] path to the installation dir
219
+ # @api private
220
+ def ezbake_install_dir
221
+ "/root/#{ezbake_install_name}"
222
+ end
223
+
224
+ # A helper that wraps the execution of install.sh in the proper
225
+ # ezbake installation directory.
226
+ #
227
+ # @param [Host] host Host to run install.sh on
228
+ # @param [String] task Task to execute with install.sh
229
+ # @api private
230
+ def ezbake_installsh host, task=""
231
+ on host, "cd #{ezbake_install_dir}; bash install.sh #{task}"
232
+ end
233
+
234
+ # Only clone from given git URI if there is no existing git clone at the
235
+ # given local_path location.
236
+ #
237
+ # @param [String] upstream_uri git URI
238
+ # @param [String] local_path path to conditionally install to
239
+ # @param [String] branch to checkout
240
+ # @api private
241
+ def conditionally_clone upstream_uri, local_path, branch="origin/HEAD"
242
+ if ezbake_local_cmd "git --work-tree=#{local_path} --git-dir=#{local_path}/.git status"
243
+ ezbake_local_cmd "git --work-tree=#{local_path} --git-dir=#{local_path}/.git fetch origin"
244
+ ezbake_local_cmd "git --work-tree=#{local_path} --git-dir=#{local_path}/.git checkout #{branch}"
245
+ else
246
+ parent_dir = File.dirname(local_path)
247
+ FileUtils.mkdir_p(parent_dir)
248
+ ezbake_local_cmd "git clone #{upstream_uri} #{local_path}"
249
+ ezbake_local_cmd "git --work-tree=#{local_path} --git-dir=#{local_path}/.git checkout #{branch}"
250
+ end
251
+ end
252
+
253
+ end
254
+ end
255
+ end
256
+ end
@@ -0,0 +1,211 @@
1
+ module Beaker
2
+ module DSL
3
+ module InstallUtils
4
+ #
5
+ # This module contains default values for FOSS puppet paths and directorys per-platform
6
+ #
7
+ module FOSSDefaults
8
+
9
+ #Here be the default download URLs
10
+ FOSS_DEFAULT_DOWNLOAD_URLS = {
11
+ :win_download_url => "http://downloads.puppetlabs.com/windows",
12
+ :mac_download_url => "http://downloads.puppetlabs.com/mac",
13
+ :pe_promoted_builds_url => "http://pm.puppetlabs.com",
14
+ :release_apt_repo_url => "http://apt.puppetlabs.com",
15
+ :release_yum_repo_url => "http://yum.puppetlabs.com",
16
+ :dev_builds_url => "http://builds.delivery.puppetlabs.net",
17
+ }
18
+
19
+ #Here be the pathing and default values for FOSS installs
20
+ #
21
+ FOSS_DEFAULTS = {
22
+ 'freebsd' => {
23
+ 'puppetserver-confdir' => '/etc/puppetserver/conf.d',
24
+ 'puppetservice' => 'puppetmaster',
25
+ 'puppetpath' => '/usr/local/etc/puppet/modules',
26
+ 'puppetvardir' => '/var/lib/puppet',
27
+ 'puppetbin' => '/usr/bin/puppet',
28
+ 'puppetbindir' => '/usr/bin',
29
+ 'hieralibdir' => '/opt/puppet-git-repos/hiera/lib',
30
+ 'hierapuppetlibdir' => '/opt/puppet-git-repos/hiera-puppet/lib',
31
+ 'hierabindir' => '/opt/puppet-git-repos/hiera/bin',
32
+ 'hieradatadir' => '/usr/local/etc/puppet/modules/hieradata',
33
+ 'hieraconf' => '/usr/local/etc/puppet/modules/hiera.yaml',
34
+ 'distmoduledir' => '/usr/local/etc/puppet/modules',
35
+ 'sitemoduledir' => '/usr/share/puppet/modules',
36
+ },
37
+ 'openbsd' => {
38
+ 'puppetserver-confdir' => '/etc/puppetserver/conf.d',
39
+ 'puppetservice' => 'puppetmaster',
40
+ 'puppetpath' => '/etc/puppet/modules',
41
+ 'puppetvardir' => '/var/puppet',
42
+ 'puppetbin' => '/usr/local/bin/puppet',
43
+ 'puppetbindir' => '/usr/local/bin',
44
+ 'hieralibdir' => '/opt/puppet-git-repos/hiera/lib',
45
+ 'hierapuppetlibdir' => '/opt/puppet-git-repos/hiera-puppet/lib',
46
+ 'hierabindir' => '/opt/puppet-git-repos/hiera/bin',
47
+ 'hieradatadir' => '/etc/puppet/hieradata',
48
+ 'hieraconf' => '/etc/puppet/hiera.yaml',
49
+ 'distmoduledir' => '/etc/puppet/modules',
50
+ 'sitemoduledir' => '/usr/local/share/puppet/modules',
51
+ },
52
+ 'mac' => {
53
+ 'puppetserver-confdir' => '/etc/puppetserver/conf.d',
54
+ 'puppetservice' => 'puppetmaster',
55
+ 'puppetpath' => '/etc/puppet',
56
+ 'puppetconfdir' => '/etc/puppet',
57
+ 'puppetcodedir' => '/etc/puppet',
58
+ 'puppetvardir' => '/var/lib/puppet',
59
+ 'puppetbin' => '/usr/bin/puppet',
60
+ 'puppetbindir' => '/usr/bin',
61
+ 'hieralibdir' => '/opt/puppet-git-repos/hiera/lib',
62
+ 'hierapuppetlibdir' => '/opt/puppet-git-repos/hiera-puppet/lib',
63
+ 'hierabindir' => '/opt/puppet-git-repos/hiera/bin',
64
+ 'hieradatadir' => '/etc/puppet/hieradata',
65
+ 'hieraconf' => '/etc/puppet/hiera.yaml',
66
+ 'distmoduledir' => '/etc/puppet/modules',
67
+ 'sitemoduledir' => '/usr/share/puppet/modules',
68
+ },
69
+ 'unix' => {
70
+ 'puppetserver-confdir' => '/etc/puppetserver/conf.d',
71
+ 'puppetservice' => 'puppetmaster',
72
+ 'puppetpath' => '/etc/puppet',
73
+ 'puppetconfdir' => '/etc/puppet',
74
+ 'puppetvardir' => '/var/lib/puppet',
75
+ 'puppetbin' => '/usr/bin/puppet',
76
+ 'puppetbindir' => '/usr/bin',
77
+ 'privatebindir' => '/usr/bin',
78
+ 'hieralibdir' => '/opt/puppet-git-repos/hiera/lib',
79
+ 'hierapuppetlibdir' => '/opt/puppet-git-repos/hiera-puppet/lib',
80
+ 'hierabindir' => '/opt/puppet-git-repos/hiera/bin',
81
+ 'hieradatadir' => '/etc/puppet/hieradata',
82
+ 'hieraconf' => '/etc/puppet/hiera.yaml',
83
+ 'distmoduledir' => '/etc/puppet/modules',
84
+ 'sitemoduledir' => '/usr/share/puppet/modules',
85
+ },
86
+ 'archlinux' => {
87
+ 'puppetserver-confdir' => '/etc/puppetserver/conf.d',
88
+ 'puppetservice' => 'puppetmaster',
89
+ 'puppetpath' => '/etc/puppetlabs/puppet',
90
+ 'puppetconfdir' => '/etc/puppetlabs/puppet',
91
+ 'puppetvardir' => '/opt/puppetlabs/puppet/cache',
92
+ 'puppetbin' => '/usr/bin/puppet',
93
+ 'puppetbindir' => '/usr/bin',
94
+ 'privatebindir' => '/usr/bin',
95
+ 'hieralibdir' => '/var/lib/hiera',
96
+ 'hierapuppetlibdir' => '/opt/puppet-git-repos/hiera-puppet/lib',
97
+ 'hierabindir' => '/usr/bin',
98
+ 'hieradatadir' => '/etc/puppetlabs/code/hiera',
99
+ 'hieraconf' => '/etc/hiera.yaml',
100
+ 'distmoduledir' => '/etc/puppetlabs/code/modules',
101
+ 'sitemoduledir' => '/usr/share/puppet/modules',
102
+ },
103
+ 'windows' => { #cygwin windows
104
+ 'puppetpath' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
105
+ 'puppetconfdir' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
106
+ 'puppetcodedir' => '`cygpath -smF 35`/PuppetLabs/puppet/etc',
107
+ 'hieraconf' => '`cygpath -smF 35`/Puppetlabs/puppet/etc/hiera.yaml',
108
+ 'puppetvardir' => '`cygpath -smF 35`/PuppetLabs/puppet/var',
109
+ 'distmoduledir' => '`cygpath -smF 35`/PuppetLabs/puppet/etc/modules',
110
+ 'sitemoduledir' => 'C:/usr/share/puppet/modules',
111
+ 'hieralibdir' => '`cygpath -w /opt/puppet-git-repos/hiera/lib`',
112
+ 'hierapuppetlibdir' => '`cygpath -w /opt/puppet-git-repos/hiera-puppet/lib`',
113
+ #let's just add both potential bin dirs to the path
114
+ 'puppetbindir' => '/cygdrive/c/Program Files (x86)/Puppet Labs/Puppet/bin:/cygdrive/c/Program Files/Puppet Labs/Puppet/bin',
115
+ 'privatebindir' => '/usr/bin',
116
+ 'hierabindir' => '/opt/puppet-git-repos/hiera/bin',
117
+ },
118
+ 'pswindows' => { #windows windows
119
+ 'distmoduledir' => 'C:\\ProgramData\\PuppetLabs\\puppet\\etc\\modules',
120
+ 'sitemoduledir' => 'C:\\usr\\share\\puppet\\modules',
121
+ 'hieralibdir' => 'C:\\opt\\puppet-git-repos\\hiera\\lib',
122
+ 'hierapuppetlibdir' => 'C:\\opt\\puppet-git-repos\\hiera-puppet\\lib',
123
+ 'hierabindir' => 'C:\\opt\\puppet-git-repos\\hiera\\bin',
124
+ 'puppetpath' => '"C:\\Program Files (x86)\\Puppet Labs\\Puppet\\etc";"C:\\Program Files\\Puppet Labs\\Puppet\\etc"',
125
+ 'hieraconf' => '"C:\\Program Files (x86)\\Puppet Labs\\Puppet\\etc\\hiera.yaml";"C:\\Program Files\\Puppet Labs\\Puppet\\etc\\hiera.yaml"',
126
+ 'puppetvardir' => '"C:\\Program Files (x86)\\Puppet Labs\\Puppet\\var";"C:\\Program Files\\Puppet Labs\\Puppet\\var"',
127
+ 'puppetbindir' => '"C:\\Program Files (x86)\\Puppet Labs\\Puppet\\bin";"C:\\Program Files\\Puppet Labs\\Puppet\\bin"',
128
+ },
129
+ }
130
+
131
+
132
+ # Add the appropriate foss defaults to the host object so that they can be accessed using host[option], set host[:type] = foss
133
+ # @param [Host] host A single host to act upon
134
+ # @param [String] platform The platform type of this host, one of windows, pswindows, freebsd, mac & unix
135
+ def add_platform_foss_defaults(host, platform)
136
+ FOSS_DEFAULTS[platform].each_pair do |key, val|
137
+ host[key] = val
138
+ end
139
+ # add the group and type for backwards compatability
140
+ if host['platform'] =~ /windows/
141
+ host['group'] = 'Administrators'
142
+ else
143
+ host['group'] = 'puppet'
144
+ end
145
+ host['type'] = 'foss'
146
+ end
147
+
148
+ # Add the appropriate foss defaults to an array of hosts
149
+ # @param [Host, Array<Host>, String, Symbol] hosts One or more hosts to act upon,
150
+ # or a role (String or Symbol) that identifies one or more hosts.
151
+ def add_foss_defaults_on(hosts)
152
+ block_on hosts do | host |
153
+ case host.class.to_s.downcase
154
+ when /aix|unix/
155
+ platform = 'unix'
156
+ when /freebsd/
157
+ platform = 'freebsd'
158
+ when /openbsd/
159
+ platform = 'openbsd'
160
+ when /mac/
161
+ platform = 'mac'
162
+ when /pswindows/
163
+ platform = 'pswindows'
164
+ when /archlinux/
165
+ platform = 'archlinux'
166
+ else
167
+ platform = 'windows'
168
+ end
169
+ add_platform_foss_defaults(host, platform)
170
+ end
171
+ end
172
+
173
+ # Remove the appropriate foss defaults from the host object so that they can no longer be accessed using host[option], set host[:type] = nil
174
+ # @param [Host] host A single host to act upon
175
+ # @param [String] platform The platform type of this host, one of windows, pswindows, freebsd, mac & unix
176
+ def remove_platform_foss_defaults(host, platform)
177
+ FOSS_DEFAULTS[platform].each_pair do |key, val|
178
+ host.delete(key)
179
+ end
180
+ host['group'] = nil
181
+ host['type'] = nil
182
+ end
183
+
184
+ # Remove the appropriate foss defaults from an array of hosts
185
+ # @param [Host, Array<Host>, String, Symbol] hosts One or more hosts to act upon,
186
+ # or a role (String or Symbol) that identifies one or more hosts.
187
+ def remove_foss_defaults_on(hosts)
188
+ block_on hosts do | host |
189
+ case host.class.to_s.downcase
190
+ when /aix|unix/
191
+ platform = 'unix'
192
+ when /freebsd/
193
+ platform = 'freebsd'
194
+ when /openbsd/
195
+ platform = 'openbsd'
196
+ when /mac/
197
+ platform = 'mac'
198
+ when /pswindows/
199
+ platform = 'pswindows'
200
+ else
201
+ platform = 'windows'
202
+ end
203
+ remove_platform_foss_defaults(host, platform)
204
+ end
205
+ end
206
+
207
+ end
208
+ end
209
+ end
210
+ end
211
+