|
6 | 6 | # third argument to the ensure_resource() function.
|
7 | 7 | Puppet::Functions.create_function(:ensure_packages, Puppet::Functions::InternalFunction) do
|
8 | 8 | # @param packages
|
9 |
| - # The packages to ensure are installed. If it's a Hash it will be passed to `ensure_resource` |
| 9 | + # The packages to ensure are installed. |
10 | 10 | # @param default_attributes
|
11 | 11 | # Default attributes to be passed to the `ensure_resource()` function
|
12 | 12 | # @return [Undef] Returns nothing.
|
13 | 13 | dispatch :ensure_packages do
|
14 | 14 | scope_param
|
15 |
| - param 'Variant[String[1], Array[String[1]], Hash[String[1], Any]]', :packages |
| 15 | + param 'Variant[String[1], Array[String[1]]]', :packages |
16 | 16 | optional_param 'Hash', :default_attributes
|
17 | 17 | return_type 'Undef'
|
18 | 18 | end
|
19 | 19 |
|
20 |
| - def ensure_packages(scope, packages, default_attributes = nil) |
21 |
| - if default_attributes |
| 20 | + # @param packages |
| 21 | + # The packages to ensure are installed. The keys are packages and values are the attributes specific to that package. |
| 22 | + # @param default_attributes |
| 23 | + # Default attributes. Package specific attributes from the `packages` parameter will take precedence. |
| 24 | + # @return [Undef] Returns nothing. |
| 25 | + dispatch :ensure_packages_hash do |
| 26 | + scope_param |
| 27 | + param 'Hash[String[1], Any]', :packages |
| 28 | + optional_param 'Hash', :default_attributes |
| 29 | + return_type 'Undef' |
| 30 | + end |
| 31 | + |
| 32 | + def ensure_packages(scope, packages, default_attributes = {}) |
| 33 | + Array(packages).each do |package_name| |
22 | 34 | defaults = { 'ensure' => 'installed' }.merge(default_attributes)
|
23 |
| - if defaults['ensure'] == 'present' |
24 |
| - defaults['ensure'] = 'installed' |
25 |
| - end |
26 |
| - else |
27 |
| - defaults = { 'ensure' => 'installed' } |
| 35 | + |
| 36 | + # `present` and `installed` are aliases for the `ensure` attribute. If `ensure` is set to either of these values replace |
| 37 | + # with `installed` by default but `present` if this package is already in the catalog with `ensure => present` |
| 38 | + defaults['ensure'] = default_ensure(package_name) if ['present', 'installed'].include?(defaults['ensure']) |
| 39 | + |
| 40 | + scope.call_function('ensure_resource', ['package', package_name, defaults]) |
28 | 41 | end
|
| 42 | + nil |
| 43 | + end |
29 | 44 |
|
30 |
| - if packages.is_a?(Hash) |
31 |
| - scope.call_function('ensure_resources', ['package', packages.dup, defaults]) |
32 |
| - else |
33 |
| - Array(packages).each do |package_name| |
34 |
| - scope.call_function('ensure_resource', ['package', package_name, defaults]) |
35 |
| - end |
| 45 | + def ensure_packages_hash(scope, packages, default_attributes = {}) |
| 46 | + packages.each do |package, attributes| |
| 47 | + ensure_packages(scope, package, default_attributes.merge(attributes)) |
36 | 48 | end
|
37 | 49 | nil
|
38 | 50 | end
|
| 51 | + |
| 52 | + private |
| 53 | + |
| 54 | + def default_ensure(package_name) |
| 55 | + if call_function('defined_with_params', "Package[#{package_name}]", { 'ensure' => 'present' }) |
| 56 | + 'present' |
| 57 | + else |
| 58 | + 'installed' |
| 59 | + end |
| 60 | + end |
39 | 61 | end
|
0 commit comments