hiera-redis 1.0.3 → 2.0.0

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