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:
|