ruby-puppetdb 1.2.0 → 1.3.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: 1beecbcce5ba235ea07c8285ceb07614e8502dde
4
- data.tar.gz: e6321323e3fe82b17437139c5314175ee243495c
3
+ metadata.gz: 93d81a43c0316b2d59fb966659c283014a4a4e03
4
+ data.tar.gz: 7b844189a53c57849db60e828f36146aa113c0f9
5
5
  SHA512:
6
- metadata.gz: 58f1303a9b2b09ae762cb99a49f649941b8e2265cb1aa5a1bde180ccb9356d1725304841a31821e04ef02b7ccb01174f78e77d00aed85260cedeaad8336fe81c
7
- data.tar.gz: d545b33bc634612e6207f53a49cf0c5b6748c9e4dfca1960affae8959ea57ab3e7d5fd84e4617e90c81391185eb69d66f2f6c2a68333f500eb066e0fed953889
6
+ metadata.gz: e5b8a134365df7df9ed82e8e31fa26e76ad5b46423d80f3981eeb692f40a7deb0021252faeab59155a4690b3b6d253f3b88eafdca0c09ef4ea2644ececd1c0c5
7
+ data.tar.gz: 8e3a55dc4c110c54305ae3d8dcb27ae9307801bf9350302bf57d881962b02d7e5cc16ea58c8839cbdafc7509da95c61d58be014df2a77262e2872ee2ea0f17a6
data/Modulefile CHANGED
@@ -1,5 +1,5 @@
1
1
  name 'dalen-puppetdbquery'
2
- version '1.2.0'
2
+ version '1.3.0'
3
3
  author 'Erik Dalen <erik.gustav.dalen@gmail.com>'
4
4
  license 'Apache License V2'
5
5
  summary 'Query functions for the PuppetDB API'
data/README.md CHANGED
@@ -64,6 +64,11 @@ facts - a hash of facts per node
64
64
  db_node_1 {"facterversion":"1.6.9","hostname":"controller",...........}
65
65
  db_node_2 {"facterversion":"1.6.9","hostname":"controller",...........}
66
66
 
67
+ events - a list of events on the matched nodes
68
+
69
+ $ puppet query events '(Package["mysql-server"] and architecture=amd64)' --since='1 hour ago' --until=now --status=success
70
+ host.example.com: 2013-06-10T10:58:37.000Z: File[/foo/bar]/content ({md5}5711edf5f5c50bd7845465471d8d39f0 -> {md5}e485e731570b8370f19a2a40489cc24b): content changed '{md5}5711edf5f5c50bd7845465471d8d39f0' to '{md5}e485e731570b8370f19a2a40489cc24b'
71
+
67
72
  Ruby
68
73
  ----
69
74
 
@@ -1,8 +1,12 @@
1
1
  require 'puppet/application/query'
2
2
  require 'puppet/face'
3
+ require 'puppet/util/colors'
4
+
3
5
  Puppet::Face.define(:query, '1.0.0') do
4
6
  require 'puppetdb/connection'
5
7
 
8
+ extend Puppet::Util::Colors
9
+
6
10
  copyright "Puppet Labs & Erik Dalen", 2012..2013
7
11
  license "Apache 2 license; see COPYING"
8
12
 
@@ -70,4 +74,75 @@ Puppet::Face.define(:query, '1.0.0') do
70
74
  end
71
75
 
72
76
  end
77
+
78
+ action :events do
79
+ summary 'Serves as an interface to puppetdb allowing a user to query for a list of events'
80
+
81
+ description <<-EOT
82
+ Get all avents for nodes matching the query specified.
83
+ EOT
84
+
85
+ arguments "<query>"
86
+
87
+ option '--since SINCE' do
88
+ summary 'Get events since this time'
89
+ description <<-EOT
90
+ Uses chronic to parse time, can be specified in many human readable formats.
91
+ EOT
92
+ default_to { '1 hour ago' }
93
+ end
94
+
95
+ option '--until UNTIL' do
96
+ summary 'Get events until this time'
97
+ description <<-EOT
98
+ Uses chronic to parse time, can be specified in many human readable formats.
99
+ EOT
100
+ default_to { 'now' }
101
+ end
102
+
103
+ option '--status STATUS' do
104
+ summary 'Only get events with specified status, skipped, success or failure'
105
+ description <<-EOT
106
+ Only get events of specified status, can be either all, skipped, success or failure.
107
+ EOT
108
+ default_to { 'all' }
109
+ end
110
+
111
+ when_invoked do |query, options|
112
+ require 'chronic'
113
+
114
+ puppetdb = PuppetDB::Connection.new options[:puppetdb_host], options[:puppetdb_port]
115
+ nodes = puppetdb.query(:nodes, puppetdb.parse_query(query, :nodes)).collect { |n| n['name']}
116
+ starttime = Chronic.parse(options[:since], :context => :past, :guess => false).first.getutc.strftime('%FT%T.%LZ')
117
+ endtime = Chronic.parse(options[:until], :context => :past, :guess => false).last.getutc.strftime('%FT%T.%LZ')
118
+
119
+ events = []
120
+ # Event API doesn't support subqueries at the moment and
121
+ # we can't do too big queries, so fetch events for some nodes at a time
122
+ nodes.each_slice(20) do |nodeslice|
123
+ eventquery = ['and', ['>', 'timestamp', starttime], ['<', 'timestamp', endtime], ['or', *nodeslice.collect { |n| ['=', 'certname', n]}]]
124
+ eventquery << ['=', 'status', options[:status]] if options[:status] != 'all'
125
+ events.concat puppetdb.query(:events, eventquery, nil, :experimental)
126
+ end
127
+
128
+ events.sort_by do |e|
129
+ "#{e['timestamp']}+#{e['resource-type']}+#{e['resource-title']}+#{e['property']}"
130
+ end.each do |e|
131
+ out="#{e['certname']}: #{e['timestamp']}: #{e['resource-type']}[#{e['resource-title']}]"
132
+ out+="/#{e['property']}" if e['property']
133
+ out+=" (#{e['old-value']} -> #{e['new-value']})" if e['old-value'] && e['new-value']
134
+ out+=": #{e['message']}" if e['message']
135
+ out.chomp!
136
+ case e['status']
137
+ when 'failure'
138
+ puts colorize(:hred, out)
139
+ when 'success'
140
+ puts colorize(:green, out)
141
+ when 'skipped'
142
+ puts colorize(:hyellow, out) unless e['resource-type'] == 'Schedule'
143
+ end
144
+ end
145
+ nil
146
+ end
147
+ end
73
148
  end
@@ -50,14 +50,14 @@ class PuppetDB::Connection
50
50
  # @param endpoint [Symbol] :resources, :facts or :nodes
51
51
  # @param query [Array] query to execute
52
52
  # @return [Array] the results of the query
53
- def query(endpoint, query=nil, http=nil)
53
+ def query(endpoint, query=nil, http=nil, version=:v2)
54
54
  unless http then
55
55
  require 'puppet/network/http_pool'
56
56
  http = Puppet::Network::HttpPool.http_instance(@host, @port, @use_ssl)
57
57
  end
58
58
  headers = { "Accept" => "application/json" }
59
59
 
60
- uri = "/v2/#{endpoint.to_s}"
60
+ uri = "/#{version.to_s}/#{endpoint.to_s}"
61
61
  uri += URI.escape "?query=#{query.to_json}" unless query.nil? or query.empty?
62
62
 
63
63
  resp = http.get(uri, headers)
@@ -15,6 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
16
  s.require_paths = ["lib"]
17
17
  s.add_dependency('json')
18
+ s.add_dependency('chronic')
18
19
 
19
20
  s.add_development_dependency 'rspec', '2.13'
20
21
  s.add_development_dependency 'rake'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-puppetdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Bode
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-06 00:00:00.000000000 Z
12
+ date: 2013-06-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
@@ -25,6 +25,20 @@ dependencies:
25
25
  - - '>='
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: chronic
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
28
42
  - !ruby/object:Gem::Dependency
29
43
  name: rspec
30
44
  requirement: !ruby/object:Gem::Requirement