puppet-rest 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +7 -0
- data/.pryrc +58 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +73 -0
- data/LICENSE.txt +20 -0
- data/README.md +81 -0
- data/Rakefile +3 -0
- data/lib/puppet-rest.rb +43 -0
- data/lib/puppet-rest/db/client.rb +42 -0
- data/lib/puppet-rest/db/config.rb +83 -0
- data/lib/puppet-rest/db/connection.rb +26 -0
- data/lib/puppet-rest/db/connection/fact-names.rb +9 -0
- data/lib/puppet-rest/db/connection/facts.rb +11 -0
- data/lib/puppet-rest/db/connection/nodes.rb +32 -0
- data/lib/puppet-rest/db/connection/resources.rb +11 -0
- data/lib/puppet-rest/db/entities/base.rb +100 -0
- data/lib/puppet-rest/db/entities/fact.rb +9 -0
- data/lib/puppet-rest/db/entities/node.rb +22 -0
- data/lib/puppet-rest/db/entities/resource.rb +12 -0
- data/lib/puppet-rest/db/request.rb +74 -0
- data/lib/puppet-rest/error.rb +42 -0
- data/lib/puppet-rest/identity_map.rb +4 -0
- data/lib/puppet-rest/monkey_patches/array.rb +7 -0
- data/lib/puppet-rest/monkey_patches/enumerable.rb +11 -0
- data/lib/puppet-rest/monkey_patches/hash.rb +49 -0
- data/lib/puppet-rest/monkey_patches/mash.rb +219 -0
- data/lib/puppet-rest/pe/client.rb +42 -0
- data/lib/puppet-rest/pe/config.rb +93 -0
- data/lib/puppet-rest/pe/connection.rb +25 -0
- data/lib/puppet-rest/pe/connection/ca_cert.rb +10 -0
- data/lib/puppet-rest/pe/connection/catalog.rb +10 -0
- data/lib/puppet-rest/pe/connection/node.rb +10 -0
- data/lib/puppet-rest/pe/entities/base.rb +100 -0
- data/lib/puppet-rest/pe/entities/catalog.rb +16 -0
- data/lib/puppet-rest/pe/entities/node.rb +9 -0
- data/lib/puppet-rest/pe/request.rb +77 -0
- data/lib/puppet-rest/response/client_error.rb +33 -0
- data/lib/puppet-rest/response/parse_json.rb +26 -0
- data/lib/puppet-rest/version.rb +3 -0
- data/puppet-rest.gemspec +28 -0
- data/spec/certificates/ca.pem +35 -0
- data/spec/certificates/cert.pem +35 -0
- data/spec/certificates/pk.pem +51 -0
- data/spec/spec_helper.rb +9 -0
- metadata +143 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
module PuppetRestClient::DB
|
2
|
+
class Connection
|
3
|
+
include PuppetRestClient::DB::Connection::Nodes
|
4
|
+
include PuppetRestClient::DB::Connection::FactNames
|
5
|
+
include PuppetRestClient::DB::Connection::Facts
|
6
|
+
include PuppetRestClient::DB::Connection::Resources
|
7
|
+
include PuppetRestClient::DB::Request
|
8
|
+
|
9
|
+
Config::VALID_OPTIONS_KEYS.each do |key|
|
10
|
+
attr_accessor key
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(attrs=Mash.new)
|
14
|
+
attrs = PuppetRestClient::DB.options.merge(attrs)
|
15
|
+
|
16
|
+
#unless attrs[:client_key].is_a?(OpenSSL::PKey::RSA)
|
17
|
+
# attrs[:client_key] = OpenSSL::PKey::RSA.new(attrs[:client_key])
|
18
|
+
#end
|
19
|
+
|
20
|
+
PuppetRestClient::DB::Config::VALID_OPTIONS_KEYS.each do |key|
|
21
|
+
instance_variable_set("@#{key}".to_sym, attrs[key])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module PuppetRestClient::DB
|
2
|
+
class Connection
|
3
|
+
module Nodes
|
4
|
+
def nodes(options=Mash.new)
|
5
|
+
get(api_path('nodes')).map {|node|
|
6
|
+
n = PuppetRestClient::DB::Node.get_or_new(node)
|
7
|
+
n.connection = self
|
8
|
+
n
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
def node(name)
|
13
|
+
attributes = get(api_path("nodes/#{name}"))
|
14
|
+
n = PuppetRestClient::DB::Node.get_or_new(attributes)
|
15
|
+
n.connection = self
|
16
|
+
n
|
17
|
+
end
|
18
|
+
|
19
|
+
def node_facts(name)
|
20
|
+
get(api_path("nodes/#{name}/facts")).map {|fact|
|
21
|
+
PuppetRestClient::DB::Fact.get_or_new(fact)
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def node_resources(name)
|
26
|
+
get(api_path("nodes/#{name}/resources")).map {|resource|
|
27
|
+
PuppetRestClient::DB::Resource.get_or_new(resource)
|
28
|
+
}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
module PuppetRestClient::DB
|
2
|
+
class Base
|
3
|
+
attr_accessor :attrs
|
4
|
+
alias :to_hash :attrs
|
5
|
+
|
6
|
+
@@identity_map = PuppetRestClient::IdentityMap.new
|
7
|
+
|
8
|
+
def self.identity_map
|
9
|
+
@@identity_map
|
10
|
+
end # def self.identity_map
|
11
|
+
|
12
|
+
# Define methods that retrieve the value from an initialized instance variable Hash, using the attribute as a key
|
13
|
+
#
|
14
|
+
# @overload self.attr_reader(attr)
|
15
|
+
# @param attr [Symbol]
|
16
|
+
# @overload self.attr_reader(attrs)
|
17
|
+
# @param attrs [Array<Symbol>]
|
18
|
+
def self.attr_reader(*attrs)
|
19
|
+
attrs.each do |attribute|
|
20
|
+
class_eval do
|
21
|
+
define_method attribute do
|
22
|
+
@attrs[attribute.to_s]
|
23
|
+
end
|
24
|
+
define_method "#{attribute}=" do |value|
|
25
|
+
@attrs[attribute.to_s] = value
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end # def self.attr_reader
|
30
|
+
|
31
|
+
def self.get(attrs=Mash.new)
|
32
|
+
@@identity_map[self] ||= {}
|
33
|
+
if attrs['title']
|
34
|
+
@@identity_map[self][attrs['title']] && @@identity_map[self][attrs['title']].update(attrs)
|
35
|
+
elsif attrs['resource']
|
36
|
+
@@identity_map[self][attrs['resource']] && @@identity_map[self][attrs['resource']].update(attrs)
|
37
|
+
else
|
38
|
+
@@identity_map[self][Marshal.dump(attrs)]
|
39
|
+
end
|
40
|
+
end # def self.get
|
41
|
+
|
42
|
+
# Retrieve an object from the identity map or initialize a new object
|
43
|
+
def self.get_or_new(attrs=Mash.new)
|
44
|
+
self.get(attrs) || self.new(attrs)
|
45
|
+
end # def self.get_or_new
|
46
|
+
|
47
|
+
# Initializes a new object
|
48
|
+
#
|
49
|
+
# @param attrs [Hash]
|
50
|
+
# @return [PuppetRestClient::Base]
|
51
|
+
def initialize(attrs=Mash.new)
|
52
|
+
self.class.attr_reader *attrs.keys
|
53
|
+
attrs.stringify_keys!
|
54
|
+
self.update attrs
|
55
|
+
if attrs['title']
|
56
|
+
@@identity_map[self.class] ||= {}
|
57
|
+
@@identity_map[self.class][attrs['title']] = self
|
58
|
+
elsif attrs['resource']
|
59
|
+
@@identity_map[self.class] ||= {}
|
60
|
+
@@identity_map[self.class][attrs['resource']] = self
|
61
|
+
else
|
62
|
+
@@identity_map[self.class] ||= {}
|
63
|
+
@@identity_map[self.class][Marshal.dump(attrs)] = self
|
64
|
+
end
|
65
|
+
end # def initialize
|
66
|
+
|
67
|
+
# Fetches an attribute of an object using hash notation
|
68
|
+
#
|
69
|
+
# @param method [String, Symbol] Message to send to the object
|
70
|
+
def [](method)
|
71
|
+
self.__send__(method.to_sym)
|
72
|
+
rescue NoMethodError
|
73
|
+
nil
|
74
|
+
end # def []
|
75
|
+
|
76
|
+
# Update the attributes of an object
|
77
|
+
#
|
78
|
+
# @param attrs [Hash]
|
79
|
+
# @return [PuppetRestClient::Base]
|
80
|
+
def update(attrs)
|
81
|
+
@attrs = attrs
|
82
|
+
self
|
83
|
+
end # def update
|
84
|
+
|
85
|
+
# @return [String]
|
86
|
+
def resource
|
87
|
+
@attrs['resource']
|
88
|
+
end # def id
|
89
|
+
|
90
|
+
# @return [String]
|
91
|
+
def title
|
92
|
+
@attrs['title']
|
93
|
+
end # def name
|
94
|
+
|
95
|
+
def keys
|
96
|
+
@attrs.keys
|
97
|
+
end # def keys
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module PuppetRestClient::DB
|
2
|
+
class Node < PuppetRestClient::DB::Base
|
3
|
+
attr_reader :name, :deactivated, :catalog_timestamp, :facts_timestamp, :report_timestamp
|
4
|
+
attr_accessor :connection
|
5
|
+
|
6
|
+
def initialize(attrs = Mash.new)
|
7
|
+
attrs['name'] = attrs['certname'] if attrs['name'].nil? && !attrs['certname'].nil?
|
8
|
+
super attrs
|
9
|
+
@connection = nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def facts
|
13
|
+
return [] if @connection.nil?
|
14
|
+
@connection.node_facts self.name
|
15
|
+
end
|
16
|
+
|
17
|
+
def resources
|
18
|
+
return [] if @connection.nil?
|
19
|
+
@connection.node_resources self.name
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module PuppetRestClient::DB
|
2
|
+
class Resource < PuppetRestClient::DB::Base
|
3
|
+
attr_reader :parameters, :sourceline, :sourcefile, :exported, :tags, :title, :type, :resource, :certname
|
4
|
+
|
5
|
+
def initialize(attrs=Mash.new)
|
6
|
+
super
|
7
|
+
@attrs['parameters'] ||= Mash.new
|
8
|
+
@attrs['tags'] ||= Mash.new
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module PuppetRestClient::DB
|
2
|
+
module Request
|
3
|
+
|
4
|
+
def get(path, params=nil, options=Mash.new)
|
5
|
+
request(:get, path, params, options)
|
6
|
+
end
|
7
|
+
|
8
|
+
def api_path(entity)
|
9
|
+
'/%s/%s' % [api_version, entity]
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def connection
|
15
|
+
# return @connection if defined? @connection
|
16
|
+
|
17
|
+
default_options = {
|
18
|
+
:headers => {
|
19
|
+
:accept => 'application/json',
|
20
|
+
:content_type => 'application/json',
|
21
|
+
:user_agent => user_agent
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
options = default_options.deep_merge(connection_options)
|
26
|
+
|
27
|
+
# @connection = Faraday.new(PuppetRestClient.server_url, options, &PuppetRestClient.middleware)
|
28
|
+
Faraday.new(server_url, options, &middleware)
|
29
|
+
end
|
30
|
+
|
31
|
+
def request(method, path, params, options)
|
32
|
+
json_params = params ? MultiJson.dump(params) : ''
|
33
|
+
uri = server_url
|
34
|
+
uri = URI(uri) unless uri.respond_to?(:host)
|
35
|
+
full_path = uri.path + URI(path).path
|
36
|
+
full_path_and_params = uri.path + path
|
37
|
+
|
38
|
+
#puts "server_url = #{server_url}"
|
39
|
+
#puts "full_path_and_params = #{full_path_and_params}"
|
40
|
+
#puts "method = #{method}"
|
41
|
+
|
42
|
+
headers = {} #signature_headers(method.to_s.upcase.to_sym, full_path, json_params)
|
43
|
+
# puts headers.inspect
|
44
|
+
# puts client_key.inspect
|
45
|
+
response = connection.run_request(method.to_sym, full_path_and_params, nil, headers) do |request|
|
46
|
+
request.options[:raw] = true if options[:raw]
|
47
|
+
|
48
|
+
#puts request.inspect
|
49
|
+
|
50
|
+
unless params.nil?
|
51
|
+
if request.method == :post || :put
|
52
|
+
request.body = json_params
|
53
|
+
else
|
54
|
+
request.params.update params
|
55
|
+
end
|
56
|
+
end
|
57
|
+
yield request if block_given?
|
58
|
+
end
|
59
|
+
|
60
|
+
if options[:raw]
|
61
|
+
return response
|
62
|
+
end
|
63
|
+
|
64
|
+
if options[:json]
|
65
|
+
return MultiJson.dump(response.body)
|
66
|
+
end
|
67
|
+
|
68
|
+
return response.body
|
69
|
+
#rescue Faraday::Error::ClientError
|
70
|
+
# raise PuppetRestClient::Error::ClientError
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module PuppetRestClient
|
2
|
+
class Error < StandardError
|
3
|
+
attr_reader :http_headers, :wrapped_exception
|
4
|
+
|
5
|
+
def initialize(exception=$!, http_headers={})
|
6
|
+
@http_headers = http_headers
|
7
|
+
if exception.respond_to?(:backtrace)
|
8
|
+
super(exception.message)
|
9
|
+
@wrapped_exception = exception
|
10
|
+
else
|
11
|
+
super(exception.to_s)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def backtrace
|
16
|
+
@wrapped_exception ? @wrapped_exception.backtrace : super
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
class Error::BadRequest < PuppetRestClient::Error
|
22
|
+
end
|
23
|
+
|
24
|
+
class Error::Unauthorized < PuppetRestClient::Error
|
25
|
+
end
|
26
|
+
|
27
|
+
class Error::Forbidden < PuppetRestClient::Error
|
28
|
+
end
|
29
|
+
|
30
|
+
class Error::NotFound < PuppetRestClient::Error
|
31
|
+
end
|
32
|
+
|
33
|
+
class Error::NotAcceptable < PuppetRestClient::Error
|
34
|
+
end
|
35
|
+
|
36
|
+
class Error::Conflict < PuppetRestClient::Error
|
37
|
+
end
|
38
|
+
|
39
|
+
class Error::ClientError < PuppetRestClient::Error
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class Hash
|
2
|
+
|
3
|
+
# Return a hash that includes everything but the given keys.
|
4
|
+
#
|
5
|
+
# @param keys [Array, Set]
|
6
|
+
# @return [Hash]
|
7
|
+
def except(*keys)
|
8
|
+
self.dup.except!(*keys)
|
9
|
+
end
|
10
|
+
|
11
|
+
# Replaces the hash without the given keys.
|
12
|
+
#
|
13
|
+
# @param keys [Array, Set]
|
14
|
+
# @return [Hash]
|
15
|
+
def except!(*keys)
|
16
|
+
keys.each{|key| delete(key)}
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
# Merges self with another hash, recursively
|
21
|
+
#
|
22
|
+
# @param hash [Hash] The hash to merge
|
23
|
+
# @return [Hash]
|
24
|
+
def deep_merge(hash)
|
25
|
+
target = self.dup
|
26
|
+
hash.keys.each do |key|
|
27
|
+
if hash[key].is_a?(Hash) && self[key].is_a?(Hash)
|
28
|
+
target[key] = target[key].deep_merge(hash[key])
|
29
|
+
next
|
30
|
+
end
|
31
|
+
target[key] = hash[key]
|
32
|
+
end
|
33
|
+
target
|
34
|
+
end
|
35
|
+
|
36
|
+
def stringify_keys!
|
37
|
+
keys.each do |key|
|
38
|
+
self[key.to_s] = delete(key)
|
39
|
+
end
|
40
|
+
self
|
41
|
+
end unless defined? stringify_keys
|
42
|
+
|
43
|
+
def symbolize_keys!
|
44
|
+
keys.each do |key|
|
45
|
+
self[(key.to_sym rescue key) || key] = delete(key)
|
46
|
+
end
|
47
|
+
self
|
48
|
+
end unless defined? symbolize_keys
|
49
|
+
end
|