jerakia-puppet 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: