]> gitweb.fluxo.info Git - puppet-stdlib.git/commitdiff
Add ensure_resources() function
authorNikhil Yadav <nikhil.yadav@amdocs.com>
Thu, 10 Mar 2016 05:03:35 +0000 (10:33 +0530)
committerNikhil Yadav <nikhil.yadav@amdocs.com>
Tue, 15 Mar 2016 03:59:38 +0000 (09:29 +0530)
New function "ensure_resources()" to support passing hash as parameter OR from hiera backend

This new function is extension of ensure_resource() which will now support to pass multiple values as hash/array OR from hiera backend variables in title argument with additional parameters needed.

It will
process multiple values for a resource type from the passed argument & pass each entry (type, title, params) to ensure_resource() in required format for further processing.
Now user can have duplicate resource check functionality extended to multiple entries with this new function.

Use:
For multiple resources using
hash:
ensure_resources('user', {'dan' => { gid => 'mygroup', uid =>'600' } ,  'alex' => { gid => 'mygroup' }}, {'ensure' =>'present'})

From Hiera Backend:

userlist:
  dan:
    gid: 'mygroup'

uid: '600'
  alex:
 gid: 'mygroup'

Call:
ensure_resources('user',hiera_hash('userlist'), {'ensure' => 'present'})

ensure_packages()
Modified to also support Hash type argument for packages

This modification will call newly added ensure_resources() for processing Hash as second argument.
The original functionality remains same for Array type arguments.

Use:
hiera:

packagelist:
  ksh:
    ensure: latest
  mlocate: {}
  myrpm:
    provider: rpm
    source: "/tmp/myrpm-1.0.0.x86_64.rpm"
    install_options:
      --prefix:
        /users/home
  openssl:
    provider: rpm
    source: "/tmp/openssl-1.0.1e-42.el7.x86_64.rpm"

Call:
ensure_packages($packagelist)

README.markdown
lib/puppet/parser/functions/ensure_packages.rb
lib/puppet/parser/functions/ensure_resources.rb [new file with mode: 0644]

index 994c22eda5c9f03edf9d2a59a83435903ce8be60..b6ead96902f3c3bae7d7173ad37ebb9bdbc7597b 100644 (file)
@@ -346,7 +346,15 @@ Returns true if the argument is an array or hash that contains no elements, or a
 
 #### `ensure_packages`
 
-Takes a list of packages and only installs them if they don't already exist. It optionally takes a hash as a second parameter to be passed as the third argument to the `ensure_resource()` function. *Type*: statement.
+Takes a list of packages array/hash and only installs them if they don't already exist. It optionally takes a hash as a second parameter to be passed as the third argument to the `ensure_resource()` or `ensure_resources()` function. *Type*: statement.
+
+For Array:
+
+    ensure_packages(['ksh','openssl'], {'ensure' => 'present'})
+
+For Hash:
+
+    ensure_packages({'ksh' => { enure => '20120801-1' } ,  'mypackage' => { source => '/tmp/myrpm-1.0.0.x86_64.rpm', provider => "rpm" }}, {'ensure' => 'present'})
 
 #### `ensure_resource`
 
@@ -370,7 +378,37 @@ An array of resources can also be passed in, and each will be created with the t
 
 *Type*: statement.
 
-#### `flatten`
+#### `ensure_resources`
+
+Takes a resource type, title (only hash), and a hash of attributes that describe the resource(s).
+
+~~~
+user { 'dan':
+  gid => 'mygroup',
+  ensure => present,
+}
+
+ensure_resources($user)
+~~~
+
+An hash of resources should be passed in and each will be created with the type and parameters specified if it doesn't already exist:
+
+    ensure_resources('user', {'dan' => { gid => 'mygroup', uid => '600' } ,  'alex' => { gid => 'mygroup' }}, {'ensure' => 'present'})
+
+From Hiera Backend:
+
+~~~
+userlist:
+dan:
+  gid: 'mygroup'
+uid: '600'
+alex:
+gid: 'mygroup'
+
+ensure_resources('user', hiera_hash('userlist'), {'ensure' => 'present'})
+~~~
+
+### `flatten`
 
 Flattens deeply nested arrays and returns a single flat array as a result. For example, `flatten(['a', ['b', ['c']]])` returns ['a','b','c']. *Type*: rvalue.
 
index f1da4aaaafe8f41013b83a7137c9366923377051..532b702655d2c569ff99d369e7b7ca161bedc16c 100644 (file)
@@ -17,18 +17,29 @@ third argument to the ensure_resource() function.
       raise(Puppet::ParseError, 'ensure_packages(): Requires second argument to be a Hash')
     end
 
-    packages = Array(arguments[0])
+    if arguments[0].is_a?(Hash)
+      if arguments[1]
+        defaults = { 'ensure' => 'present' }.merge(arguments[1])
+      else
+        defaults = { 'ensure' => 'present' }
+      end
 
-    if arguments[1]
-      defaults = { 'ensure' => 'present' }.merge(arguments[1])
+      Puppet::Parser::Functions.function(:ensure_resources)
+      function_ensure_resources(['package', Hash(arguments[0]), defaults ])
     else
-      defaults = { 'ensure' => 'present' }
-    end
+      packages = Array(arguments[0])
+
+      if arguments[1]
+        defaults = { 'ensure' => 'present' }.merge(arguments[1])
+      else
+        defaults = { 'ensure' => 'present' }
+      end
 
-    Puppet::Parser::Functions.function(:ensure_resource)
-    packages.each { |package_name|
-      function_ensure_resource(['package', package_name, defaults ])
+      Puppet::Parser::Functions.function(:ensure_resource)
+      packages.each { |package_name|
+        function_ensure_resource(['package', package_name, defaults ])
     }
+    end
   end
 end
 
diff --git a/lib/puppet/parser/functions/ensure_resources.rb b/lib/puppet/parser/functions/ensure_resources.rb
new file mode 100644 (file)
index 0000000..30d57a8
--- /dev/null
@@ -0,0 +1,54 @@
+require 'puppet/parser/functions'
+
+Puppet::Parser::Functions.newfunction(:ensure_resources,
+                                      :type => :statement,
+                                      :doc => <<-'ENDOFDOC'
+Takes a resource type, title (only hash), and a list of attributes that describe a
+resource.
+
+    user { 'dan':
+      gid => 'mygroup',
+      ensure => present,
+    }
+
+An hash of resources should be passed in and each will be created with
+the type and parameters specified if it doesn't already exist.
+
+    ensure_resources('user', {'dan' => { gid => 'mygroup', uid => '600' } ,  'alex' => { gid => 'mygroup' }}, {'ensure' => 'present'})
+
+From Hiera Backend:
+
+userlist:
+  dan:
+    gid: 'mygroup'
+ uid: '600'
+  alex:
+ gid: 'mygroup'
+
+Call:
+ensure_resources('user', hiera_hash('userlist'), {'ensure' => 'present'})
+
+ENDOFDOC
+) do |vals|
+  type, title, params = vals
+  raise(ArgumentError, 'Must specify a type') unless type
+  raise(ArgumentError, 'Must specify a title') unless title
+  params ||= {}
+
+  if title.is_a?(Hash)
+    resource_hash = Hash(title)
+    resources = resource_hash.keys
+
+    Puppet::Parser::Functions.function(:ensure_resource)
+    resources.each { |resource_name|
+    if resource_hash[resource_name]
+        params_merged = params.merge(resource_hash[resource_name])
+    else
+        params_merged = params
+    end
+    function_ensure_resource([ type, resource_name, params_merged ])
+    }
+  else
+       raise(Puppet::ParseError, 'ensure_resources(): Requires second argument to be a Hash')
+  end
+end