jerakia-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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 13f0bcbcdeff4df54ad4fdfc14618e5ca3a04632
4
+ data.tar.gz: 9b634eeee3a310ba3097618e129ea96558ca04fa
5
+ SHA512:
6
+ metadata.gz: 9304ca7c5f74b3fc08b322f4db7ee0a7586565deeae637fdfbdf1fc33999c279ebb512b3baea85dd785b60fa9742991c0fbae5af9b22ecc994bb4114320f9827
7
+ data.tar.gz: aab9c6adb1a1f6ee28b4940572b1b89ce916b843f93f8d2ad11cfb3df88385c43559bbcd403fc05090e05f913887fb61d0d71211c28dd6fb26c1d42589e94d9e
@@ -0,0 +1,107 @@
1
+ require 'puppet'
2
+ require 'puppet/resource'
3
+ require 'jerakia/client'
4
+
5
+ class Hiera
6
+ module Backend
7
+ class Jerakia_backend
8
+
9
+ def initialize(config = nil)
10
+ require 'jerakia'
11
+ @config = config || Hiera::Config[:jerakia] || {}
12
+ @jerakia = ::Jerakia::Client.new
13
+ @scope_cache = {}
14
+ end
15
+
16
+ def store_scope(identifier, uuid, scope)
17
+ @scope_cache[identifier] = {
18
+ :uuid => uuid,
19
+ :scope => scope
20
+ }
21
+ end
22
+
23
+ def send_scope(identifier, scope)
24
+ returndata = @jerakia.send_scope('puppet', identifier, scope)
25
+ store_scope(identifier, returndata['uuid'], scope)
26
+ end
27
+
28
+ def scope_valid?(identifier, metadata)
29
+ return false unless @scope_cache.include?(identifier)
30
+ return false unless @scope_cache[identifier][:scope] == metadata
31
+ return true
32
+ end
33
+
34
+ def lookup(key, scope, order_override, resolution_type)
35
+
36
+ # Jerakia doesn't do anything with lookup_options, this behaviour is achieved
37
+ # using schemas, therefore we always return nil here for the key
38
+
39
+ return nil if key == 'lookup_options'
40
+
41
+ lookup_type = :first
42
+ merge_type = :none
43
+
44
+ case resolution_type
45
+ when :array
46
+ lookup_type = :cascade
47
+ merge_type = :array
48
+ when :hash
49
+ lookup_type = :cascade
50
+ merge_type = :hash
51
+ end
52
+
53
+ namespace = []
54
+
55
+ if key.include?('::')
56
+ lookup_key = key.split('::')
57
+ key = lookup_key.pop
58
+ namespace = lookup_key.join('/')
59
+ end
60
+
61
+
62
+
63
+
64
+ metadata={}
65
+ if scope.is_a?(Hash)
66
+ metadata=scope.reject { |k, v| v.is_a?(Puppet::Resource) }
67
+ else
68
+ metadata = scope.real.to_hash.reject { |k, v| v.is_a?(Puppet::Resource) }
69
+ end
70
+
71
+
72
+ if metadata['trusted']
73
+ identifier = metadata['trusted']['certname']
74
+ else
75
+ identifier = metadata['fqdn']
76
+ end
77
+
78
+ send_scope(identifier, metadata) unless scope_valid?(identifier, metadata)
79
+
80
+ lookup_options = {
81
+ :namespace => namespace,
82
+ :scope => 'server',
83
+ :lookup_type => lookup_type.to_s,
84
+ :merge_type => merge_type.to_s,
85
+ :scope_opts => {
86
+ 'identifier' => identifier,
87
+ 'realm' => 'puppet'
88
+ }
89
+ }
90
+
91
+ begin
92
+ lookup = @jerakia.lookup(key, lookup_options)
93
+ rescue Jerakia::Client::ScopeNotFoundError => e
94
+ send_scope(identifier, metadata)
95
+ lookup = @jerakia.lookup(key, lookup_options)
96
+ end
97
+
98
+ if lookup.is_a?(Hash)
99
+ raise Puppet::Error, "Jerakia data lookup failed #{lookup['message']}" unless lookup['status'] = 'ok'
100
+ return lookup['payload']
101
+ else
102
+ raise Puppet::Error, "Jerakia data lookup failed Expected a hash but got a #{lookup.class}"
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,83 @@
1
+ require 'puppet/indirector/code'
2
+ require 'jerakia/client'
3
+ require 'json'
4
+
5
+ class Puppet::DataBinding::Jerakiaserver < Puppet::Indirector::Code
6
+
7
+ desc "Data binding for Jerakia"
8
+
9
+ attr_reader :jerakia
10
+ attr_reader :scope_cache
11
+
12
+
13
+ def initialize(*args)
14
+ @jerakia=::Jerakia::Client.new
15
+ @scope_cache = {}
16
+ super
17
+ end
18
+
19
+ def store_scope(identifier, uuid, scope)
20
+ @scope_cache[identifier] = {
21
+ :uuid => uuid,
22
+ :scope => scope
23
+ }
24
+ end
25
+
26
+ def send_scope(identifier, scope)
27
+ returndata = jerakia.send_scope('puppet', identifier, scope)
28
+ store_scope(identifier, returndata['uuid'], scope)
29
+ end
30
+
31
+ def scope_valid?(identifier, metadata)
32
+ return false unless @scope_cache.include?(identifier)
33
+ return false unless @scope_cache[identifier][:scope] == metadata
34
+ return true
35
+ end
36
+
37
+ def find(request)
38
+
39
+ # Jerakia doesn't do anything with lookup_options, this behaviour is achieved
40
+ # using schemas, therefore we always return nil here for the key
41
+ return nil if request.key == 'lookup_options'
42
+
43
+ lookupdata=request.key.split(/::/)
44
+ key=lookupdata.pop
45
+ namespace=lookupdata.join('/')
46
+ metadata = request.options[:variables].to_hash.reject { |k, v| v.is_a?(Puppet::Resource) }
47
+
48
+ # If we are on an earlier version of Puppet that doesn't have trusted facts,
49
+ # use the fqdn fact to identify us. Puppet 4 uses trusted.
50
+ if metadata['trusted']
51
+ identifier = metadata['trusted']['certname']
52
+ else
53
+ identifier = metadata['fqdn']
54
+ end
55
+
56
+ send_scope(identifier, metadata) unless scope_valid?(identifier, metadata)
57
+
58
+ lookup_options = {
59
+ :namespace => namespace,
60
+ :scope => 'server',
61
+ :scope_opts => {
62
+ 'identifier' => identifier,
63
+ 'realm' => 'puppet'
64
+ }
65
+ }
66
+
67
+ begin
68
+ lookup = jerakia.lookup(key, lookup_options)
69
+ rescue Jerakia::Client::ScopeNotFoundError => e
70
+ send_scope(identifier, metadata)
71
+ lookup = jerakia.lookup(key, lookup_options)
72
+ rescue => e
73
+ raise Puppet::DataBinding::LookupError.new("Jerakia data lookup failed #{e.class}", e.message)
74
+ end
75
+
76
+ if lookup.is_a?(Hash)
77
+ raise Puppet::DataBinding::LookupError.new("Jerakia data lookup failed", lookup['message']) unless lookup['status'] = 'ok'
78
+ return lookup['payload']
79
+ else
80
+ raise Puppet::DataBinding::LookupError.new("Jerakia data lookup failed", "Expected a hash but got a #{lookup.class}")
81
+ end
82
+ end
83
+ end
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jerakia-puppet
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Craig Dunn
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-02-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jerakia-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Puppet databinding and hiera backend for Jerakia Server using the Jerakia
28
+ client libraries
29
+ email:
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/hiera/backend/jerakiaserver_backend.rb
35
+ - lib/puppet/indirector/data_binding/jerakiaserver.rb
36
+ homepage: http://jerakia.io
37
+ licenses:
38
+ - Apache 2.0
39
+ metadata: {}
40
+ post_install_message:
41
+ rdoc_options: []
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirements: []
55
+ rubyforge_project:
56
+ rubygems_version: 2.5.1
57
+ signing_key:
58
+ specification_version: 4
59
+ summary: Puppet databding and Hiera backend for Jerakia Server
60
+ test_files: []
61
+ has_rdoc: