hiera-redis 1.0.3 → 2.0.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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/hiera/backend/redis_backend.rb +48 -75
  3. metadata +43 -19
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cac011c3dd470b0d5ac2ab886736201363571b91
4
+ data.tar.gz: 44a7d272df8504896fb604245ebdc0fa24221d7f
5
+ SHA512:
6
+ metadata.gz: 22521481aef98392ba0b1e44c9a195229b7a45f83465c07a54368d37b9f57f3874b03e857dfaa1987af16db44795b41b412fadfa30d576d07088917232f1fb3d
7
+ data.tar.gz: 29f64f78d0df2f6ed4bd2434ec27c7e0f618b815fde841a84b29388ea674bc7a06ec548cf3841b61cbb0931448019cae910a0e74878d8bea443338a62f772923
@@ -1,126 +1,99 @@
1
1
  class Hiera
2
2
  module Backend
3
3
  class Redis_backend
4
+ VERSION = '2.0.0'
4
5
 
5
- VERSION="1.0.3"
6
-
7
- attr_reader :redis, :options
6
+ attr_reader :options
8
7
 
9
8
  def initialize
10
- Hiera.debug("Hiera Redis backend %s starting" % VERSION)
11
- @redis = connect
9
+ require 'redis'
10
+ Hiera.debug("Hiera Redis backend #{VERSION} starting")
11
+ @options = { separator: ':', soft_connection_failure: false }.merge(Config[:redis] || {})
12
+ case options[:deserialize]
13
+ when :json then require 'json'
14
+ when :yaml then require 'yaml'
15
+ end
12
16
  end
13
17
 
14
- def deserialize(args = {})
15
- return nil if args[:data].nil?
16
- return args[:data] unless args[:data].is_a? String
18
+ def deserialize(value)
19
+ return value unless value.is_a?(String)
17
20
 
18
- result = case options[:deserialize]
19
- when :json
20
- require 'json'
21
- JSON.parse args[:data]
22
- when :yaml
23
- require 'yaml'
24
- YAML::load args[:data]
21
+ case options[:deserialize]
22
+ when :json then JSON.parse(value)
23
+ when :yaml then YAML.load(value)
25
24
  else
26
- Hiera.warn "Invalid configuration for :deserialize; found %s" % options[:deserialize]
27
- args[:data]
25
+ Hiera.warn("Invalid configuration for :deserialize; found #{options[:deserialize]}")
26
+ value
28
27
  end
29
-
30
- Hiera.debug "Deserialized %s" % options[:deserialize].to_s.upcase
31
- result
32
-
33
- # when we try to deserialize a string
34
- rescue JSON::ParserError
35
- args[:data]
36
28
  rescue => e
37
- Hiera.warn "Exception raised: %s: %s" % [e.class, e.message]
29
+ Hiera.warn("Error de-serializing data: #{e.class}: #{e.message}")
30
+ value
38
31
  end
39
32
 
40
- def lookup(key, scope, order_override, resolution_type)
33
+ def lookup(key, scope, order_override, resolution_type, context)
41
34
  answer = nil
35
+ found = false
42
36
 
43
37
  Backend.datasources(scope, order_override) do |source|
44
- redis_key = "%s" % [source.split('/'), key].join(options[:separator])
45
- Hiera.debug "Looking for %s%s%s" % [source, options[:separator], key]
46
-
47
- data = redis_query redis_key
48
-
49
- data = deserialize(:data => data,
50
- :redis_key => redis_key,
51
- :key => key) if options.include? :deserialize
38
+ redis_key = (source.split('/') << key).join(options[:separator])
39
+ data = read_value(redis_key)
40
+ next if data.nil?
52
41
 
53
- next unless data
42
+ found = true
43
+ new_answer = Backend.parse_answer(data, scope, {}, context)
54
44
 
55
- new_answer = Backend.parse_answer(data, scope)
56
-
57
- case resolution_type
45
+ case resolution_type.is_a?(Hash) ? :hash : resolution_type
58
46
  when :array
59
- raise Exception, "Hiera type mismatch: expected Array and got #{new_answer.class}" unless new_answer.is_a? Array or new_answer.is_a? String
47
+ check_type(key, new_answer, Array, String)
60
48
  answer ||= []
61
49
  answer << new_answer
62
50
  when :hash
63
- raise Exception, "Hiera type mismatch: expected Hash and got #{new_answer.class}" unless new_answer.is_a? Hash
51
+ check_type(key, new_answer, Hash)
64
52
  answer ||= {}
65
- answer = new_answer.merge answer
53
+ answer = Backend.merge_answer(new_answer, answer, resolution_type)
66
54
  else
67
55
  answer = new_answer
68
56
  break
69
57
  end
70
58
  end
71
59
 
72
- Hiera.debug "answer is %s" % answer.inspect
60
+ throw :no_such_key unless found
73
61
  answer
62
+ rescue Redis::CannotConnectError, Errno::ENOENT => e
63
+ Hiera.warn("Cannot connect to redis server at #{redis.id}")
64
+ raise e unless options[:soft_connection_failure]
74
65
  end
75
66
 
76
67
  private
77
68
 
78
- def connect
79
-
80
- # override default options
81
- @options = {
82
- :host => 'localhost',
83
- :port => 6379,
84
- :db => 0,
85
- :password => nil,
86
- :timeout => 3,
87
- :path => nil,
88
- :soft_connection_failure => false,
89
- :separator => ':'
90
- }.merge Config[:redis] || {}
69
+ def check_type(key, value, *types)
70
+ return if types.any? { |type| value.is_a?(type) }
71
+ expected = types.map(&:name).join(' or ')
72
+ raise "Hiera type mismatch for key '#{key}': expected #{expected} and got #{value.class}"
73
+ end
91
74
 
92
- require 'redis'
75
+ def redis
76
+ @redis ||= Redis.new(@options)
77
+ end
93
78
 
94
- Redis.new(options)
95
- rescue LoadError
96
- retry if require 'rubygems'
79
+ def read_value(key)
80
+ data = redis_query(key)
81
+ options[:deserialize] ? deserialize(data) : data
97
82
  end
98
83
 
99
84
  def redis_query(redis_key)
100
-
101
- case redis.type redis_key
85
+ case redis.type(redis_key)
102
86
  when 'set'
103
- redis.smembers redis_key
87
+ redis.smembers(redis_key)
104
88
  when 'hash'
105
- redis.hgetall redis_key
89
+ redis.hgetall(redis_key)
106
90
  when 'list'
107
91
  redis.lrange(redis_key, 0, -1)
108
92
  when 'string'
109
- redis.get redis_key
93
+ redis.get(redis_key)
110
94
  when 'zset'
111
95
  redis.zrange(redis_key, 0, -1)
112
- else
113
- Hiera.debug("No such key: %s" % redis_key)
114
- nil
115
96
  end
116
- rescue Redis::CannotConnectError => e
117
- Hiera.warn('Cannot connect to Redis server')
118
- raise e unless options.has_key?(:soft_connection_failure)
119
- nil
120
- rescue Errno::ENOENT => e
121
- Hiera.warn('Cannot connect to Redis server')
122
- raise e unless options.has_key?(:soft_connection_failure)
123
- nil
124
97
  end
125
98
  end
126
99
  end
metadata CHANGED
@@ -1,63 +1,87 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hiera-redis
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
5
- prerelease:
4
+ version: 2.0.0
6
5
  platform: ruby
7
6
  authors:
8
- - Adam Kosmin c/o Reliant Security, Inc.
7
+ - Reliant Security, Inc.
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-04-30 00:00:00.000000000 Z
11
+ date: 2015-08-04 00:00:00.000000000 Z
13
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: hiera
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
14
27
  - !ruby/object:Gem::Dependency
15
28
  name: redis
16
29
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
30
  requirements:
19
- - - ! '>='
31
+ - - "~>"
20
32
  - !ruby/object:Gem::Version
21
- version: '0'
33
+ version: '3.2'
22
34
  type: :runtime
23
35
  prerelease: false
24
36
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
37
  requirements:
27
- - - ! '>='
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
28
53
  - !ruby/object:Gem::Version
29
- version: '0'
54
+ version: '3.3'
30
55
  description: Allows hiera functions to pull data from a Redis database.
31
- email: heira-redis@reliantsecurity.com
56
+ email: dev@reliantsecurity.com
32
57
  executables: []
33
58
  extensions: []
34
59
  extra_rdoc_files: []
35
60
  files:
36
- - lib/hiera/backend/redis_backend.rb
37
61
  - COPYING
62
+ - lib/hiera/backend/redis_backend.rb
38
63
  homepage: http://github.com/reliantsecurity/hiera-redis
39
64
  licenses:
40
65
  - GPL-3
66
+ metadata: {}
41
67
  post_install_message:
42
68
  rdoc_options: []
43
69
  require_paths:
44
70
  - lib
45
71
  required_ruby_version: !ruby/object:Gem::Requirement
46
- none: false
47
72
  requirements:
48
- - - ! '>='
73
+ - - "~>"
49
74
  - !ruby/object:Gem::Version
50
- version: '0'
75
+ version: '2.0'
51
76
  required_rubygems_version: !ruby/object:Gem::Requirement
52
- none: false
53
77
  requirements:
54
- - - ! '>='
78
+ - - ">="
55
79
  - !ruby/object:Gem::Version
56
80
  version: '0'
57
81
  requirements: []
58
82
  rubyforge_project:
59
- rubygems_version: 1.8.24
83
+ rubygems_version: 2.2.2
60
84
  signing_key:
61
- specification_version: 3
85
+ specification_version: 4
62
86
  summary: A Redis backend for Hiera.
63
87
  test_files: []