hiera-http 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/hiera/backend/http_backend.rb +109 -0
  2. metadata +77 -0
@@ -0,0 +1,109 @@
1
+ class Hiera
2
+ module Backend
3
+ class Http_backend
4
+
5
+ def initialize
6
+ require 'net/http'
7
+ @config = Config[:http]
8
+ end
9
+
10
+ def lookup(key, scope, order_override, resolution_type)
11
+
12
+ answer = nil
13
+
14
+ paths.insert(0, order_override) if order_override
15
+ paths = @config[:paths].map { |p| Backend.parse_string(p, scope, { 'key' => key }) }
16
+
17
+ http = Net::HTTP.new(@config[:host], @config[:port])
18
+ http.read_timeout = @config[:http_read_timeout] || 10
19
+ http.open_timeout = @config[:http_connect_timeout] || 10
20
+
21
+
22
+ paths.each do |path|
23
+
24
+ Hiera.debug("[hiera-http]: Lookup #{key} from #{@config[:host]}:#{@config[:port]}#{path}")
25
+ httpreq = Net::HTTP::Get.new(path)
26
+
27
+ begin
28
+ httpres = http.request(httpreq)
29
+ rescue Exception => e
30
+ Hiera.warn("[hiera-http]: Net::HTTP threw exception #{e.message}")
31
+ raise Exception, e.message unless @config[:failure] == 'graceful'
32
+ next
33
+ end
34
+
35
+ unless httpres.kind_of?(Net::HTTPSuccess)
36
+ Hiera.debug("[hiera-http]: bad http response from #{@config[:host]}:#{@config[:port]}#{path}")
37
+ raise Exception, 'Bad HTTP response' unless @config[:failure] == 'graceful'
38
+ next
39
+ end
40
+
41
+ result = self.parse_response(key, httpres.body)
42
+ next unless result
43
+
44
+ parsed_result = Backend.parse_answer(result, scope)
45
+
46
+ case resolution_type
47
+ when :array
48
+ answer ||= []
49
+ answer << parsed_result
50
+ when :hash
51
+ answer ||= {}
52
+ answer = parsed_result.merge answer
53
+ else
54
+ answer = parsed_result
55
+ break
56
+ end
57
+ end
58
+ answer
59
+ end
60
+
61
+
62
+ def parse_response(key,answer)
63
+
64
+ return nil unless answer
65
+
66
+ Hiera.debug("[hiera-http]: Query returned data, parsing response as #{@config[:output] || 'plain'}")
67
+
68
+ case @config[:output]
69
+
70
+ when 'plain'
71
+ # When the output format is configured as plain we assume that if the
72
+ # endpoint URL returns an HTTP success then the contents of the response
73
+ # body is the value itself, or nil.
74
+ #
75
+ answer
76
+ when 'json'
77
+ # If JSON is specified as the output format, assume the output of the
78
+ # endpoint URL is a JSON document and return keypart that matched our
79
+ # lookup key
80
+ self.json_handler(key,answer)
81
+ when 'yaml'
82
+ # If YAML is specified as the output format, assume the output of the
83
+ # endpoint URL is a YAML document and return keypart that matched our
84
+ # lookup key
85
+ self.yaml_handler(key,answer)
86
+ else
87
+ answer
88
+ end
89
+ end
90
+
91
+ # Handlers
92
+ # Here we define specific handlers to parse the output of the http request
93
+ # and return a value. Currently we support YAML and JSON
94
+ #
95
+ def json_handler(key,answer)
96
+ require 'rubygems'
97
+ require 'json'
98
+ JSON.parse(answer)[key]
99
+ end
100
+
101
+ def yaml_handler(answer)
102
+ require 'yaml'
103
+ YAML.parse(answer)[key]
104
+ end
105
+
106
+ end
107
+ end
108
+ end
109
+
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hiera-http
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Craig Dunn
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: hiera
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.3.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.3.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: json
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 1.1.1
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.1.1
46
+ description: Hiera backend for looking up data over HTTP APIs
47
+ email: craig@craigdunn.org
48
+ executables: []
49
+ extensions: []
50
+ extra_rdoc_files: []
51
+ files:
52
+ - lib/hiera/backend/http_backend.rb
53
+ homepage: http://github.com/crayfishx/hiera-http
54
+ licenses: []
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ requirements: []
72
+ rubyforge_project:
73
+ rubygems_version: 1.8.24
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: HTTP backend for Hiera
77
+ test_files: []