jerakia 0.4.5 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c41114e6bd23299a7a2a24837a973638ed1f95d5
4
- data.tar.gz: baa4ae57eb934247c0e261b1d92d036ac8eb5287
3
+ metadata.gz: f0eb1b22902463a7e61b100ad3df85c2be0e0962
4
+ data.tar.gz: 6687510aafa82767e994504a0b4f4085653770d9
5
5
  SHA512:
6
- metadata.gz: 3398f530150e3a6b1274ff118c6afffee3948aeab02c59bfc3bb90be8f759d12976e6b5da7f9fe8de836c38fcdc1010cb4a80692f8eed2808c6eb5d56a6ed7d5
7
- data.tar.gz: 592fc7e0890afc275c3bef12171dbb8edee4df2303955de7706812f9b8fc448b8c08877f8a9bce3a83a387672130ff0cdd50e9be16974ea136f31859e45d624a
6
+ metadata.gz: f04a1ad923250f2b9d962761ffd5d14da68aeca8f5eaffb3d0b5cedb1d18baf18fbb06218afb26666430c574a4767fd4c26bc0a3de7bb1a3fd5af85babc2a310
7
+ data.tar.gz: f65ca8e7b58e7d830911a03889a1973111a4a12d59ba2c77569045ba11127b7bd355fb05bfeb0058ec189577173c5fd7ca557bd5554fd58e091a51a36c53be72
@@ -1,5 +1,7 @@
1
1
  class Jerakia::Answer
2
2
 
3
+ require 'deep_merge'
4
+
3
5
  attr_accessor :payload
4
6
  attr_accessor :datatype
5
7
  attr_reader :lookup_type
@@ -18,11 +20,16 @@ class Jerakia::Answer
18
20
  @payload.flatten!
19
21
  end
20
22
 
21
- def merge_payload!
23
+ def merge_payload!(method = :hash)
22
24
  payload_hash={}
23
25
  @payload.each do |p|
24
26
  if p.is_a?(Hash)
25
- payload_hash.merge!(p)
27
+ case method
28
+ when :hash
29
+ payload_hash = p.merge(payload_hash)
30
+ when :deep_hash
31
+ payload_hash = p.deep_merge!(payload_hash)
32
+ end
26
33
  end
27
34
  end
28
35
  @payload=payload_hash
data/lib/jerakia/cli.rb CHANGED
@@ -53,6 +53,11 @@ class Jerakia
53
53
  aliases: :d,
54
54
  type: :hash,
55
55
  desc: 'Key/value pairs to be used as metadata for the lookup'
56
+ option :schema,
57
+ aliases: :S,
58
+ type: :boolean,
59
+ desc: 'Enable/disable schema lookup, default true',
60
+ default: true
56
61
 
57
62
  def lookup(key)
58
63
 
@@ -70,7 +75,6 @@ class Jerakia
70
75
 
71
76
  jac = Jerakia.new({
72
77
  :config => options[:config],
73
- :loglevel => options[:log_level],
74
78
  :logfile => logfile,
75
79
  :loglevel => loglevel,
76
80
  })
@@ -83,6 +87,7 @@ class Jerakia
83
87
  :metadata => options[:metadata] || {},
84
88
  :scope => options[:scope].to_sym,
85
89
  :scope_options => options[:scope_options],
90
+ :use_schema => options[:schema],
86
91
  )
87
92
 
88
93
  answer = jac.lookup(req)
@@ -5,14 +5,23 @@ class Jerakia::Config
5
5
  attr_reader :server_url
6
6
 
7
7
  def self.load_from_file(file = '/etc/jerakia/jerakia.yaml')
8
- Jerakia.crit("Config file #{file} not found") unless File.exists?(file)
9
8
  new YAML.load_file(file)
10
9
  end
11
10
 
12
- def initialize(config)
13
- @policydir = config['policydir']
14
- @server_url = config['server_url']
15
- @configdata = config
11
+ def initialize(config = {})
12
+ config_with_defaults = defaults.merge(config)
13
+ @policydir = config_with_defaults['policydir']
14
+ @server_url = config_with_defaults['server_url']
15
+ @configdata = config_with_defaults
16
+ end
17
+
18
+ def defaults
19
+ {
20
+ 'policydir' => '/etc/jerakia/policy.d',
21
+ 'logfile' => '/var/log/jerakia.log',
22
+ 'loglevel' => 'info',
23
+ 'enable_schema' => true,
24
+ }
16
25
  end
17
26
 
18
27
  def [](key)
@@ -0,0 +1,17 @@
1
+ class Jerakia::Datasource
2
+ module File
3
+ class Json
4
+
5
+ EXTENSION='json'
6
+
7
+ class << self
8
+ require 'json'
9
+ def convert(data)
10
+ return {} if data.empty?
11
+ JSON.load(data)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+
@@ -5,14 +5,14 @@ class Jerakia::Launcher
5
5
 
6
6
  attr_reader :request
7
7
  attr_reader :answer
8
- def initialize(req)
9
- @@request = req
10
- invoke
8
+ def initialize(req, &block)
9
+ @request = req
10
+ instance_eval &block
11
11
  end
12
12
 
13
- def invoke
13
+ def invoke_from_file
14
14
  policy_name=request.policy.to_s
15
- Jerakia.log.debug "Invoked lookup for #{@@request.key} using policy #{policy_name}"
15
+ Jerakia.log.debug "Invoked lookup for #{@request.key} using policy #{policy_name}"
16
16
  filename=File.join(Jerakia.config.policydir, "#{policy_name}.rb")
17
17
  begin
18
18
  policydata=Jerakia.filecache(filename)
@@ -22,13 +22,8 @@ class Jerakia::Launcher
22
22
  instance_eval policydata
23
23
  end
24
24
 
25
- def request
26
- @@request
27
- end
28
-
29
-
30
- def policy(name, opts={}, &block)
31
- policy = Jerakia::Policy.new(name, opts, &block)
25
+ def policy(name, opts={}, req=@request, &block)
26
+ policy = Jerakia::Policy.new(name, opts, req, &block)
32
27
  policy.fire!
33
28
  @answer = policy.answer
34
29
  end
@@ -8,11 +8,16 @@
8
8
  #
9
9
  class Jerakia::Lookup::Plugin
10
10
  module Hiera
11
- def rewrite_lookup
11
+
12
+ def autorun
12
13
  request.key.prepend("#{request.namespace.join('::')}::")
13
14
  request.namespace=[]
14
15
  end
15
16
 
17
+ def rewrite_lookup
18
+ Jerakia.log.debug("DEPRECATION NOTICE: The use of plugin.hiera.rewrite_lookup is now deprecated and is automatically executed when the plugin is loaded")
19
+ end
20
+
16
21
  def calling_module
17
22
  if request.namespace.length > 0
18
23
  request.namespace[0]
@@ -2,6 +2,7 @@ class Jerakia::Lookup::PluginFactory
2
2
 
3
3
  def initialize
4
4
  Jerakia.log.debug("Loaded plugin handler")
5
+ @plugin_config = Jerakia.config[:plugins] || {}
5
6
  end
6
7
 
7
8
 
@@ -15,6 +16,15 @@ class Jerakia::Lookup::PluginFactory
15
16
  create_plugin_method(name) do
16
17
  plugin
17
18
  end
19
+ if plugin.respond_to?('autorun')
20
+ Jerakia.log.debug("Found autorun method for plugin #{name}, executing")
21
+
22
+ if plugin.method('autorun').arity == 1
23
+ plugin.autorun (@plugin_config[name.to_s] || {} )
24
+ else
25
+ plugin.autorun
26
+ end
27
+ end
18
28
  end
19
29
 
20
30
  end
@@ -1,19 +1,27 @@
1
1
  require 'jerakia/launcher'
2
2
 
3
- class Jerakia::Policy < Jerakia::Launcher
3
+ class Jerakia::Policy
4
4
  require 'jerakia/answer'
5
+ require 'jerakia/schema'
5
6
 
6
7
  attr_accessor :lookups
7
8
  attr_reader :routes
8
9
  attr_reader :answer
9
10
  attr_reader :scope
10
11
  attr_reader :lookup_proceed
12
+ attr_reader :schema
11
13
 
12
- def initialize(name, opts, &block)
14
+ def initialize(name, opts={}, req, &block)
15
+
16
+ if req.use_schema and Jerakia.config[:enable_schema]
17
+ schema_config = Jerakia.config[:schema] || {}
18
+ @schema = Jerakia::Schema.new(req, schema_config)
19
+ end
13
20
  @lookups=[]
14
21
  @routes={}
15
- @answer=Jerakia::Answer.new(request.lookup_type)
16
- @scope=Jerakia::Scope.new
22
+ @request=req
23
+ @answer=Jerakia::Answer.new(req.lookup_type)
24
+ @scope=Jerakia::Scope.new(req)
17
25
  @lookup_proceed = true
18
26
  begin
19
27
  instance_eval &block
@@ -22,6 +30,11 @@ class Jerakia::Policy < Jerakia::Launcher
22
30
  end
23
31
  end
24
32
 
33
+
34
+ def request
35
+ @request
36
+ end
37
+
25
38
  def clone_request
26
39
  Marshal.load(Marshal.dump(request))
27
40
  end
@@ -52,11 +65,13 @@ class Jerakia::Policy < Jerakia::Launcher
52
65
  end
53
66
  end
54
67
 
55
- if request.lookup_type == :cascade && @answer.payload.is_a?(Array) && request.merge == :array
56
- @answer.flatten_payload!
57
- end
58
- if request.lookup_type == :cascade && @answer.payload.is_a?(Array) && request.merge == :hash
59
- @answer.merge_payload!
68
+ if request.lookup_type == :cascade && @answer.payload.is_a?(Array)
69
+ case request.merge
70
+ when :array
71
+ @answer.flatten_payload!
72
+ when :hash,:deep_hash
73
+ @answer.merge_payload!(request.merge)
74
+ end
60
75
  end
61
76
 
62
77
  end
@@ -9,6 +9,7 @@ class Jerakia
9
9
  attr_accessor :lookup_type
10
10
  attr_accessor :scope
11
11
  attr_accessor :scope_options
12
+ attr_accessor :use_schema
12
13
 
13
14
  def initialize(opts={})
14
15
  options = defaults.merge(opts)
@@ -20,6 +21,7 @@ class Jerakia
20
21
  @lookup_type = options[:lookup_type]
21
22
  @scope = options[:scope]
22
23
  @scope_options = options[:scope_options] || {}
24
+ @use_schema = options[:use_schema]
23
25
 
24
26
  Jerakia.log.debug("Request initialized with #{options}")
25
27
  end
@@ -35,6 +37,7 @@ class Jerakia
35
37
  metadata: {},
36
38
  lookup_type: :first,
37
39
  scope: nil,
40
+ use_schema: true
38
41
  }
39
42
  end
40
43
  end
@@ -0,0 +1,55 @@
1
+ class Jerakia::Schema
2
+
3
+ def initialize(request,opts)
4
+ schema_datasource=datasource(opts)
5
+ schema_request=Jerakia::Request.new(
6
+ :metadata => request.metadata,
7
+ :key => request.key,
8
+ :namespace => request.namespace,
9
+ :use_schema => false,
10
+ )
11
+
12
+ schema_lookup = Jerakia::Launcher.new(schema_request) do
13
+ policy :schema do
14
+ lookup :schema do
15
+ datasource *schema_datasource
16
+ end
17
+ end
18
+ end
19
+
20
+ @schema_data = schema_lookup.answer.payload || {}
21
+ Jerakia.log.debug("Schema returned #{@schema_data}")
22
+
23
+ if salias = @schema_data["alias"]
24
+ Jerakia.log.debug("Schema alias found to #{@schema_data["alias"]}")
25
+ request.namespace=Array(salias["namespace"]) if salias["namespace"]
26
+ request.key = salias["key"] if salias["key"]
27
+ end
28
+
29
+
30
+ if @schema_data["cascade"]
31
+ Jerakia.log.debug("Overriding lookup_type from #{request.lookup_type} to :cascade")
32
+ request.lookup_type= :cascade
33
+ end
34
+
35
+ if ["array", "hash", "deep_hash"].include?(@schema_data["merge"])
36
+ request.merge = @schema_data["merge"].to_sym
37
+ end
38
+
39
+ end
40
+
41
+ def datasource(opts={})
42
+ [
43
+ :file, {
44
+ :docroot => opts["docroot"] || "/var/lib/jerakia/schema",
45
+ :format => opts["format"] || :json,
46
+ :enable_caching => opts["enable_caching"] || true,
47
+ :searchpath => [ '' ],
48
+ }
49
+ ]
50
+ end
51
+
52
+
53
+ end
54
+
55
+
data/lib/jerakia/scope.rb CHANGED
@@ -1,11 +1,13 @@
1
- class Jerakia::Scope < Jerakia::Policy
1
+ class Jerakia::Scope
2
2
 
3
3
  attr_reader :value
4
4
  attr_reader :handler
5
+ attr_reader :request
5
6
 
6
- def initialize(handler=nil)
7
+ def initialize(req)
7
8
  @value = {}
8
- @handler ||= request.scope || :metadata
9
+ @handler ||= req.scope || :metadata
10
+ @request = req
9
11
  Jerakia::Util.autoload('scope', @handler)
10
12
  instance_eval "extend Jerakia::Scope::#{@handler.to_s.capitalize}"
11
13
  create
@@ -4,6 +4,6 @@ class Jerakia
4
4
  #
5
5
  # This should be updated when a new gem is released and it is read from the gemspec file
6
6
  #
7
- VERSION = "0.4.5"
7
+ VERSION = "0.5.0"
8
8
 
9
9
  end
@@ -0,0 +1,38 @@
1
+ # Here we take a request object and read in the policy file
2
+ # which is evalulated in this instance
3
+ #
4
+ class Jerakia::Launcher
5
+
6
+ attr_reader :request
7
+ attr_reader :answer
8
+ def initialize(req, &block)
9
+ @request = req
10
+ instance_eval &block
11
+ end
12
+
13
+ def invoke_from_file
14
+ policy_name=request.policy.to_s
15
+ Jerakia.log.debug "Invoked lookup for #{@request.key} using policy #{policy_name}"
16
+ filename=File.join(Jerakia.config.policydir, "#{policy_name}.rb")
17
+ begin
18
+ policydata=Jerakia.filecache(filename)
19
+ rescue Exception => e
20
+ Jerakia.crit("Problem loading policy from #{filename}")
21
+ end
22
+ instance_eval policydata
23
+ end
24
+
25
+ def request
26
+ @request
27
+ end
28
+
29
+
30
+ def policy(name, opts={}, &block)
31
+ policy = Jerakia::Policy.new(name, opts, &block)
32
+ policy.fire!
33
+ @answer = policy.answer
34
+ end
35
+ end
36
+
37
+
38
+
data/lib/jerakia.rb CHANGED
@@ -11,8 +11,8 @@ class Jerakia
11
11
  require 'jerakia/version'
12
12
 
13
13
  def initialize(options={})
14
- configfile = options[:config] || ENV['JERAKIA_CONFIG'] || '/etc/jerakia/jerakia.yaml'
15
- @@config = Jerakia::Config.load_from_file(configfile)
14
+ configfile = options[:config] || ENV['JERAKIA_CONFIG'] || '/etc/jerakia/jerakia.yaml'
15
+ @@config = File.exist?(configfile) ? Jerakia::Config.load_from_file(configfile) : Jerakia::Config.new
16
16
 
17
17
  if @@config[:plugindir]
18
18
  $LOAD_PATH << @@config[:plugindir] unless $LOAD_PATH.include?(@@config[:plugindir])
@@ -26,7 +26,7 @@ class Jerakia
26
26
  end
27
27
 
28
28
  def lookup(request)
29
- Jerakia::Launcher.new(request).answer
29
+ Jerakia::Launcher.new(request) { invoke_from_file }.answer
30
30
  end
31
31
 
32
32
  def config
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jerakia
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Craig Dunn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-18 00:00:00.000000000 Z
11
+ date: 2016-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -58,6 +58,7 @@ files:
58
58
  - lib/jerakia/datasource.rb
59
59
  - lib/jerakia/datasource/dummy.rb
60
60
  - lib/jerakia/datasource/file.rb
61
+ - lib/jerakia/datasource/file/json.rb
61
62
  - lib/jerakia/datasource/file/yaml.rb
62
63
  - lib/jerakia/datasource/http.rb
63
64
  - lib/jerakia/launcher.rb
@@ -73,12 +74,14 @@ files:
73
74
  - lib/jerakia/response/filter.rb
74
75
  - lib/jerakia/response/filter/encryption.rb
75
76
  - lib/jerakia/response/filter/strsub.rb
77
+ - lib/jerakia/schema.rb
76
78
  - lib/jerakia/scope.rb
77
79
  - lib/jerakia/scope/metadata.rb
78
80
  - lib/jerakia/scope/yaml.rb
79
81
  - lib/jerakia/test.pp
80
82
  - lib/jerakia/util.rb
81
83
  - lib/jerakia/version.rb
84
+ - lib/jerakia/±
82
85
  - lib/puppet/indirector/data_binding/jerakia.rb
83
86
  - lib/puppet/indirector/data_binding/jerakia_rest.rb
84
87
  homepage: http://jerakia.io