quixoten-puppetdb-terminus 2.2.2 → 2.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: 7fc7b5ab32ad0b0da438f926dcff09949be43403
4
- data.tar.gz: bde560a9c95674e3d777441500a7e85fa792f351
3
+ metadata.gz: 6e3b2b250c00a29b9a6e5bbf6c9bb0db86f73f48
4
+ data.tar.gz: 71047b96882f6cf0d0bc39117397b7db246febeb
5
5
  SHA512:
6
- metadata.gz: e71d7fbccf508c9a44e73fa8ec78f00e2f3e982c88d71a96505ea771f8bc56cc50dda45a525c0a31eb8a2ea9fa2de9e25c39e53edbea4868dd22bbc2eac6e0a3
7
- data.tar.gz: ac3534776727cacd73843e323f38541f11c87d8ea4df0ebd5198029220b3132cf67ff6159aa055da8db822b93e57d64225aceef9f3621702f20f1d9cb6315481
6
+ metadata.gz: 77faccae995c706fa21fa042ea54c7f90eb1fd31f189784aafd4ad15f5d0f7f4276018f562ae974ac9c53ee54fdca9ec1dded6d50a2d870d44be55751b34eb40
7
+ data.tar.gz: 2aa8fee0becb8e40daba485dbe4d9e327168b1b2734056194d71f30dfc48d10dd86882b7fbf174174a002aa9ad3645db4e7b6cd863cd17d63bed1c61d55459d7
@@ -1,177 +1,192 @@
1
+ require 'puppet/util/puppetdb'
1
2
  require 'puppet/face'
2
- require 'tmpdir'
3
3
 
4
- Puppet::Face.define(:storeconfigs, '0.0.1') do
5
- copyright "Puppet Labs", 2011
6
- license "Apache 2 license"
4
+ if Puppet::Util::Puppetdb.puppet3compat?
5
+ require 'tmpdir'
7
6
 
8
- summary "Interact with the storeconfigs database"
9
- description <<-DESC
7
+ Puppet::Face.define(:storeconfigs, '0.0.1') do
8
+ copyright "Puppet Labs", 2011
9
+ license "Apache 2 license"
10
+
11
+ summary "Interact with the storeconfigs database"
12
+ description <<-DESC
10
13
  This subcommand interacts with the ActiveRecord storeconfigs database, and
11
14
  can be used to export a dump of that data which is suitable for import by
12
15
  PuppetDB.
13
16
  DESC
14
17
 
15
- action :export do
16
- summary "Export the storeconfigs database"
17
- description <<-DESC
18
+ action :export do
19
+ summary "Export the storeconfigs database"
20
+ description <<-DESC
18
21
  Generate a dump of all catalogs from the storeconfigs database, as a
19
22
  tarball which can be imported by PuppetDB. Only exported resources are
20
23
  included; non-exported resources, edges, facts, or other data are
21
24
  omitted. Returns the location of the output.
22
25
  DESC
23
26
 
24
- when_invoked do |options|
27
+ when_invoked do |options|
25
28
 
26
- require 'puppet/rails'
29
+ require 'puppet/rails'
27
30
 
28
- tmpdir = Dir.mktmpdir
29
- workdir = File.join(tmpdir, 'puppetdb-bak')
30
- Dir.mkdir(workdir)
31
+ tmpdir = Dir.mktmpdir
32
+ workdir = File.join(tmpdir, 'puppetdb-bak')
33
+ Dir.mkdir(workdir)
31
34
 
32
- begin
33
- Puppet::Rails.connect
35
+ begin
36
+ Puppet::Rails.connect
34
37
 
35
- # Fetch all nodes, including exported resources and their params
36
- nodes = Puppet::Rails::Host.all(:include => {:resources => [:param_values, :puppet_tags]},
37
- :conditions => {:resources => {:exported => true}})
38
+ # Fetch all nodes, including exported resources and their params
39
+ nodes = Puppet::Rails::Host.all(:include => {:resources => [:param_values, :puppet_tags]},
40
+ :conditions => {:resources => {:exported => true}})
38
41
 
39
- catalogs = nodes.map { |node| node_to_catalog_hash(node) }
42
+ catalogs = nodes.map { |node| node_to_catalog_hash(node) }
40
43
 
41
- catalog_dir = File.join(workdir, 'catalogs')
42
- FileUtils.mkdir(catalog_dir)
44
+ catalog_dir = File.join(workdir, 'catalogs')
45
+ FileUtils.mkdir(catalog_dir)
43
46
 
44
- catalogs.each do |catalog|
45
- filename = File.join(catalog_dir, "#{catalog[:data][:name]}.json")
47
+ catalogs.each do |catalog|
48
+ filename = File.join(catalog_dir, "#{catalog[:data][:name]}.json")
46
49
 
47
- File.open(filename, 'w') do |file|
48
- file.puts catalog.to_pson
50
+ File.open(filename, 'w') do |file|
51
+ file.puts catalog.to_pson
52
+ end
49
53
  end
50
- end
51
54
 
52
- node_names = nodes.map(&:name).sort
55
+ node_names = nodes.map(&:name).sort
53
56
 
54
- timestamp = Time.now
57
+ timestamp = Time.now
55
58
 
56
- File.open(File.join(workdir, 'export-metadata.json'), 'w') do |file|
57
- metadata = {
58
- 'timestamp' => timestamp,
59
- 'command-versions' => {
60
- 'replace-catalog' => 2,
59
+ File.open(File.join(workdir, 'export-metadata.json'), 'w') do |file|
60
+ metadata = {
61
+ 'timestamp' => timestamp,
62
+ 'command-versions' => {
63
+ 'replace-catalog' => 2,
64
+ }
61
65
  }
62
- }
63
66
 
64
- file.puts metadata.to_pson
65
- end
67
+ file.puts metadata.to_pson
68
+ end
66
69
 
67
- tarfile = destination_file(timestamp)
70
+ tarfile = destination_file(timestamp)
68
71
 
69
- if tar = Puppet::Util.which('tar')
70
- execute("cd #{tmpdir} && #{tar} -cf #{tarfile} puppetdb-bak")
72
+ if tar = Puppet::Util.which('tar')
73
+ execute("cd #{tmpdir} && #{tar} -cf #{tarfile} puppetdb-bak")
71
74
 
72
- FileUtils.rm_rf(workdir)
75
+ FileUtils.rm_rf(workdir)
73
76
 
74
- if gzip = Puppet::Util.which('gzip')
75
- execute("#{gzip} #{tarfile}")
76
- "#{tarfile}.gz"
77
+ if gzip = Puppet::Util.which('gzip')
78
+ execute("#{gzip} #{tarfile}")
79
+ "#{tarfile}.gz"
80
+ else
81
+ Puppet.warning "Can't find the `gzip` command to compress the tarball; output will not be compressed"
82
+ tarfile
83
+ end
77
84
  else
78
- Puppet.warning "Can't find the `gzip` command to compress the tarball; output will not be compressed"
79
- tarfile
85
+ Puppet.warning "Can't find the `tar` command to produce a tarball; output will remain in the temporary working directory"
86
+ workdir
80
87
  end
81
- else
82
- Puppet.warning "Can't find the `tar` command to produce a tarball; output will remain in the temporary working directory"
83
- workdir
88
+ rescue => e
89
+ # Clean up if something goes wrong. We don't want to ensure this,
90
+ # because we want the directory to stick around in the case where they
91
+ # don't have tar.
92
+ FileUtils.rm_rf(workdir)
93
+ raise
84
94
  end
85
- rescue => e
86
- # Clean up if something goes wrong. We don't want to ensure this,
87
- # because we want the directory to stick around in the case where they
88
- # don't have tar.
89
- FileUtils.rm_rf(workdir)
90
- raise
91
95
  end
92
- end
93
96
 
94
- when_rendering :console do |filename|
95
- "Exported storeconfigs data to #{filename}"
97
+ when_rendering :console do |filename|
98
+ "Exported storeconfigs data to #{filename}"
99
+ end
96
100
  end
97
- end
98
101
 
99
- # Returns the location to leave the output. This is really only here for testing. :/
100
- def destination_file(timestamp)
101
- File.expand_path("storeconfigs-#{timestamp.strftime('%Y%m%d%H%M%S')}.tar")
102
- end
102
+ # Returns the location to leave the output. This is really only here for testing. :/
103
+ def destination_file(timestamp)
104
+ File.expand_path("storeconfigs-#{timestamp.strftime('%Y%m%d%H%M%S')}.tar")
105
+ end
103
106
 
104
- # Execute a command using Puppet's execution static method.
105
- #
106
- # @param command [Array<String>, String] the command to execute. If it is
107
- # an Array the first element should be the executable and the rest of the
108
- # elements should be the individual arguments to that executable.
109
- # @return [Puppet::Util::Execution::ProcessOutput] output as specified by options
110
- # @raise [Puppet::ExecutionFailure] if the executed chiled process did not exit with status == 0 and `failonfail` is
111
- # `true`.
112
- def execute(command)
113
- Puppet::Util::Execution.execute(command)
114
- end
107
+ # Execute a command using Puppet's execution static method.
108
+ #
109
+ # @param command [Array<String>, String] the command to execute. If it is
110
+ # an Array the first element should be the executable and the rest of the
111
+ # elements should be the individual arguments to that executable.
112
+ # @return [Puppet::Util::Execution::ProcessOutput] output as specified by options
113
+ # @raise [Puppet::ExecutionFailure] if the executed chiled process did not exit with status == 0 and `failonfail` is
114
+ # `true`.
115
+ def execute(command)
116
+ Puppet::Util::Execution.execute(command)
117
+ end
115
118
 
116
- def node_to_catalog_hash(node)
117
- resources = node.resources.map { |resource| resource_to_hash(resource) }
118
- edges = node.resources.map { |resource| resource_to_edge_hash(resource) }
119
-
120
- {
121
- :metadata => {
122
- :api_version => 1,
123
- },
124
- :data => {
125
- :name => node.name,
126
- :version => node.last_compile || Time.now,
127
- :edges => edges,
128
- :resources => resources + [stage_main_hash],
129
- },
130
- }
131
- end
119
+ def node_to_catalog_hash(node)
120
+ resources = node.resources.map { |resource| resource_to_hash(resource) }
121
+ edges = node.resources.map { |resource| resource_to_edge_hash(resource) }
122
+
123
+ {
124
+ :metadata => {
125
+ :api_version => 1,
126
+ },
127
+ :data => {
128
+ :name => node.name,
129
+ :version => node.last_compile || Time.now,
130
+ :edges => edges,
131
+ :resources => resources + [stage_main_hash],
132
+ },
133
+ }
134
+ end
132
135
 
133
- def resource_to_hash(resource)
134
- parameters = resource.param_values.inject({}) do |params,param_value|
135
- if params.has_key?(param_value.param_name.name)
136
- value = [params[param_value.param_name.name],param_value.value].flatten
137
- else
138
- value = param_value.value
136
+ def resource_to_hash(resource)
137
+ parameters = resource.param_values.inject({}) do |params,param_value|
138
+ if params.has_key?(param_value.param_name.name)
139
+ value = [params[param_value.param_name.name],param_value.value].flatten
140
+ else
141
+ value = param_value.value
142
+ end
143
+ params.merge(param_value.param_name.name => value)
139
144
  end
140
- params.merge(param_value.param_name.name => value)
141
- end
142
145
 
143
- tags = resource.puppet_tags.map(&:name).uniq.sort
146
+ tags = resource.puppet_tags.map(&:name).uniq.sort
144
147
 
145
- hash = {
146
- :type => resource.restype,
147
- :title => resource.title,
148
- :exported => true,
149
- :parameters => parameters,
150
- :tags => tags,
151
- }
148
+ hash = {
149
+ :type => resource.restype,
150
+ :title => resource.title,
151
+ :exported => true,
152
+ :parameters => parameters,
153
+ :tags => tags,
154
+ }
152
155
 
153
- hash[:file] = resource.file if resource.file
154
- hash[:line] = resource.line if resource.line
156
+ hash[:file] = resource.file if resource.file
157
+ hash[:line] = resource.line if resource.line
155
158
 
156
- hash
157
- end
159
+ hash
160
+ end
161
+
162
+ # The catalog *must* have edges, so everything is contained by Stage[main]!
163
+ def resource_to_edge_hash(resource)
164
+ {
165
+ 'source' => {'type' => 'Stage', 'title' => 'main'},
166
+ 'target' => {'type' => resource.restype, 'title' => resource.title},
167
+ 'relationship' => 'contains',
168
+ }
169
+ end
158
170
 
159
- # The catalog *must* have edges, so everything is contained by Stage[main]!
160
- def resource_to_edge_hash(resource)
161
- {
162
- 'source' => {'type' => 'Stage', 'title' => 'main'},
163
- 'target' => {'type' => resource.restype, 'title' => resource.title},
164
- 'relationship' => 'contains',
165
- }
171
+ def stage_main_hash
172
+ {
173
+ :type => 'Stage',
174
+ :title => 'main',
175
+ :exported => false,
176
+ :parameters => {},
177
+ :tags => ['stage', 'main'],
178
+ }
179
+ end
166
180
  end
181
+ else
182
+ Puppet::Face.define(:storeconfigs, '0.0.1') do
183
+ copyright "Puppet Labs", 2011
184
+ license "Apache 2 license"
167
185
 
168
- def stage_main_hash
169
- {
170
- :type => 'Stage',
171
- :title => 'main',
172
- :exported => false,
173
- :parameters => {},
174
- :tags => ['stage', 'main'],
175
- }
186
+ summary "storeconfigs is not supported on Puppet 4.0.0+"
187
+ description <<-DESC
188
+ Users needing this feature should migrate using Puppet 3.7.2 or a more recent
189
+ 3.7 release.
190
+ DESC
176
191
  end
177
192
  end
@@ -8,7 +8,7 @@ class Puppet::Resource::Catalog::Puppetdb < Puppet::Indirector::REST
8
8
  include Puppet::Util::Puppetdb::CommandNames
9
9
 
10
10
  def save(request)
11
- profile "catalog#save" do
11
+ profile("catalog#save", [:puppetdb, :catalog, :save, request.key]) do
12
12
  catalog = munge_catalog(request.instance, extract_extra_request_data(request))
13
13
  submit_command(request.key, catalog, CommandReplaceCatalog, 5)
14
14
  end
@@ -28,13 +28,11 @@ class Puppet::Resource::Catalog::Puppetdb < Puppet::Indirector::REST
28
28
  end
29
29
 
30
30
  def munge_catalog(catalog, extra_request_data = {})
31
- profile "Munge catalog" do
32
- hash = profile "Convert catalog to PSON data hash" do
33
- catalog.to_pson_data_hash
31
+ profile("Munge catalog", [:puppetdb, :catalog, :munge]) do
32
+ data = profile("Convert catalog to JSON data hash", [:puppetdb, :catalog, :convert_to_hash]) do
33
+ catalog.to_data_hash
34
34
  end
35
35
 
36
- data = hash['data']
37
-
38
36
  add_parameters_if_missing(data)
39
37
  add_namevar_aliases(data, catalog)
40
38
  stringify_titles(data)
@@ -111,7 +109,8 @@ class Puppet::Resource::Catalog::Puppetdb < Puppet::Indirector::REST
111
109
 
112
110
  def stringify_titles(hash)
113
111
  resources = hash['resources']
114
- profile "Stringify titles (resource count: #{resources.count})" do
112
+ profile("Stringify titles (resource count: #{resources.count})",
113
+ [:puppetdb, :titles, :stringify]) do
115
114
  resources.each do |resource|
116
115
  resource['title'] = resource['title'].to_s
117
116
  end
@@ -122,7 +121,8 @@ class Puppet::Resource::Catalog::Puppetdb < Puppet::Indirector::REST
122
121
 
123
122
  def add_parameters_if_missing(hash)
124
123
  resources = hash['resources']
125
- profile "Add parameters if missing (resource count: #{resources.count})" do
124
+ profile("Add parameters if missing (resource count: #{resources.count})",
125
+ [:puppetdb, :parameters, :add_missing]) do
126
126
  resources.each do |resource|
127
127
  resource['parameters'] ||= {}
128
128
  end
@@ -133,7 +133,8 @@ class Puppet::Resource::Catalog::Puppetdb < Puppet::Indirector::REST
133
133
 
134
134
  def add_namevar_aliases(hash, catalog)
135
135
  resources = hash['resources']
136
- profile "Add namevar aliases (resource count: #{resources.count})" do
136
+ profile("Add namevar aliases (resource count: #{resources.count})",
137
+ [:puppetdb, :namevar_aliases, :add]) do
137
138
  resources.each do |resource|
138
139
  real_resource = catalog.resource(resource['type'], resource['title'])
139
140
 
@@ -175,7 +176,8 @@ class Puppet::Resource::Catalog::Puppetdb < Puppet::Indirector::REST
175
176
 
176
177
  def sort_unordered_metaparams(hash)
177
178
  resources = hash['resources']
178
- profile "Sort unordered metaparams (resource count: #{resources.count})" do
179
+ profile("Sort unordered metaparams (resource count: #{resources.count})",
180
+ [:puppetdb, :metaparams, :sort]) do
179
181
  resources.each do |resource|
180
182
  params = resource['parameters']
181
183
  UnorderedMetaparams.each do |metaparam|
@@ -192,7 +194,8 @@ class Puppet::Resource::Catalog::Puppetdb < Puppet::Indirector::REST
192
194
 
193
195
  def munge_edges(hash)
194
196
  edges = hash['edges']
195
- profile "Munge edges (edge count: #{edges.count})" do
197
+ profile("Munge edges (edge count: #{edges.count})",
198
+ [:puppetdb, :edges, :munge]) do
196
199
  edges.each do |edge|
197
200
  %w[source target].each do |vertex|
198
201
  edge[vertex] = resource_ref_to_hash(edge[vertex]) if edge[vertex].is_a?(String)
@@ -208,7 +211,8 @@ class Puppet::Resource::Catalog::Puppetdb < Puppet::Indirector::REST
208
211
  resources = hash['resources']
209
212
  aliases = {}
210
213
 
211
- profile "Map aliases to title (resource count: #{resources.count})" do
214
+ profile("Map aliases to title (resource count: #{resources.count})",
215
+ [:puppetdb, :aliases, :map_to_title]) do
212
216
  resources.each do |resource|
213
217
  names = resource['parameters']['alias'] || []
214
218
  resource_hash = {'type' => resource['type'], 'title' => resource['title']}
@@ -223,23 +227,26 @@ class Puppet::Resource::Catalog::Puppetdb < Puppet::Indirector::REST
223
227
  end
224
228
 
225
229
  def synthesize_edges(hash, catalog)
226
- profile "Synthesize edges" do
230
+ profile("Synthesize edges",
231
+ [:puppetdb, :edges, :synthesize]) do
227
232
  aliases = map_aliases_to_title(hash)
228
233
 
229
234
  resource_table = {}
230
- profile "Build up resource_table" do
235
+ profile("Build up resource_table",
236
+ [:puppetdb, :edges, :synthesize, :resource_table, :build]) do
231
237
  hash['resources'].each do |resource|
232
238
  resource_table[ [resource['type'], resource['title']] ] = resource
233
239
  end
234
240
  end
235
241
 
236
- profile "Primary synthesis" do
242
+ profile("Primary synthesis",
243
+ [:puppetdb, :edges, :synthesize, :primary_synthesis])do
237
244
  hash['resources'].each do |resource|
238
245
  # Standard virtual resources don't appear in the catalog. However,
239
246
  # exported resources which haven't been also collected will appears as
240
247
  # exported and virtual (collected ones will only be exported). They will
241
248
  # eventually be removed from the catalog, so we can't add edges involving
242
- # them. Puppet::Resource#to_pson_data_hash omits 'virtual', so we have to
249
+ # them. Puppet::Resource#to_data_hash omits 'virtual', so we have to
243
250
  # look it up in the catalog to find that information. This isn't done in
244
251
  # a separate step because we don't actually want to send the field (it
245
252
  # will always be false). See ticket #16472.
@@ -266,7 +273,7 @@ class Puppet::Resource::Catalog::Puppetdb < Puppet::Indirector::REST
266
273
  # case problem here: http://projects.puppetlabs.com/issues/19474
267
274
  # Once that problem is solved and older versions of Puppet that have
268
275
  # the bug are no longer supported we can probably remove this code.
269
- unless other_ref =~ /^[A-Z][a-z0-9_]*(::[A-Z][a-z0-9_]*)*\[.*\]/
276
+ unless other_ref =~ /^[A-Z][a-z0-9_-]*(::[A-Z][a-z0-9_-]*)*\[.*\]/
270
277
  rel = edge_to_s(resource_hash_to_ref(resource_hash), other_ref, param)
271
278
  raise Puppet::Error, "Invalid relationship: #{rel}, because " +
272
279
  "#{other_ref} doesn't seem to be in the correct format. " +
@@ -328,7 +335,8 @@ class Puppet::Resource::Catalog::Puppetdb < Puppet::Indirector::REST
328
335
  end
329
336
  end
330
337
 
331
- profile "Make edges unique" do
338
+ profile("Make edges unique",
339
+ [:puppetdb, :edges, :synthesize, :make_unique]) do
332
340
  hash['edges'].uniq!
333
341
  end
334
342
 
@@ -337,7 +345,8 @@ class Puppet::Resource::Catalog::Puppetdb < Puppet::Indirector::REST
337
345
  end
338
346
 
339
347
  def filter_keys(hash)
340
- profile "Filter extraneous keys from the catalog" do
348
+ profile("Filter extraneous keys from the catalog",
349
+ [:puppetdb, :keys, :filter_extraneous]) do
341
350
  hash.delete_if do |k,v|
342
351
  ! ['name', 'version', 'edges', 'resources'].include?(k)
343
352
  end
@@ -17,11 +17,13 @@ class Puppet::Node::Facts::Puppetdb < Puppet::Indirector::REST
17
17
  end
18
18
 
19
19
  def save(request)
20
- profile "facts#save" do
21
- payload = profile "Encode facts command submission payload" do
20
+ profile("facts#save", [:puppetdb, :facts, :save, request.key]) do
21
+ payload = profile("Encode facts command submission payload",
22
+ [:puppetdb, :facts, :encode]) do
22
23
  facts = request.instance.dup
23
- facts.values = facts.strip_internal
24
- if Puppet[:trusted_node_data]
24
+ facts.values = facts.strip_internal.dup
25
+
26
+ if ! Puppet::Util::Puppetdb.puppet3compat? || Puppet[:trusted_node_data]
25
27
  facts.values[:trusted] = get_trusted_info(request.node)
26
28
  end
27
29
  {
@@ -40,16 +42,18 @@ class Puppet::Node::Facts::Puppetdb < Puppet::Indirector::REST
40
42
  end
41
43
 
42
44
  def find(request)
43
- profile "facts#find" do
45
+ profile("facts#find", [:puppetdb, :facts, :find, request.key]) do
44
46
  begin
45
47
  url = Puppet::Util::Puppetdb.url_path("/v3/nodes/#{CGI.escape(request.key)}/facts")
46
- response = profile "Query for nodes facts: #{url}" do
48
+ response = profile("Query for nodes facts: #{url}",
49
+ [:puppetdb, :facts, :find, :query_nodes, request.key]) do
47
50
  http_get(request, url, headers)
48
51
  end
49
52
  log_x_deprecation_header(response)
50
53
 
51
54
  if response.is_a? Net::HTTPSuccess
52
- profile "Parse fact query response (size: #{response.body.size})" do
55
+ profile("Parse fact query response (size: #{response.body.size})",
56
+ [:puppetdb, :facts, :find, :parse_response, request.key]) do
53
57
  result = JSON.parse(response.body)
54
58
  # Note: the Inventory Service API appears to expect us to return nil here
55
59
  # if the node isn't found. However, PuppetDB returns an empty array in
@@ -87,7 +91,7 @@ class Puppet::Node::Facts::Puppetdb < Puppet::Indirector::REST
87
91
  # `operator` may be one of {eq, ne, lt, gt, le, ge}, and will default to 'eq'
88
92
  # if unspecified.
89
93
  def search(request)
90
- profile "facts#search" do
94
+ profile("facts#search", [:puppetdb, :facts, :search, request.key]) do
91
95
  return [] unless request.options
92
96
  operator_map = {
93
97
  'eq' => '=',
@@ -112,13 +116,15 @@ class Puppet::Node::Facts::Puppetdb < Puppet::Indirector::REST
112
116
 
113
117
  begin
114
118
  url = Puppet::Util::Puppetdb.url_path("/v3/nodes?query=#{query_param}")
115
- response = profile "Fact query request: #{URI.unescape(url)}" do
119
+ response = profile("Fact query request: #{URI.unescape(url)}",
120
+ [:puppetdb, :facts, :search, :query_request, request.key]) do
116
121
  http_get(request, url, headers)
117
122
  end
118
123
  log_x_deprecation_header(response)
119
124
 
120
125
  if response.is_a? Net::HTTPSuccess
121
- profile "Parse fact query response (size: #{response.body.size})" do
126
+ profile("Parse fact query response (size: #{response.body.size})",
127
+ [:puppetdb, :facts, :search, :parse_query_response, request.key,]) do
122
128
  JSON.parse(response.body).collect {|s| s["name"]}
123
129
  end
124
130
  else
@@ -7,7 +7,8 @@ class Puppet::Resource::Puppetdb < Puppet::Indirector::REST
7
7
  include Puppet::Util::Puppetdb
8
8
 
9
9
  def search(request)
10
- profile "resource#search" do
10
+ profile("resource#search",
11
+ [:puppetdb, :resource, :search, request.key]) do
11
12
  type = request.key
12
13
  host = request.options[:host]
13
14
  filter = request.options[:filter]
@@ -27,7 +28,8 @@ class Puppet::Resource::Puppetdb < Puppet::Indirector::REST
27
28
 
28
29
  begin
29
30
  url = Puppet::Util::Puppetdb.url_path("/v3/resources?query=#{query_param}")
30
- response = profile "Resources query: #{URI.unescape(url)}" do
31
+ response = profile("Resources query: #{URI.unescape(url)}",
32
+ [:puppetdb, :resource, :search, :query, request.key]) do
31
33
  http_get(request, url, headers)
32
34
  end
33
35
  log_x_deprecation_header(response)
@@ -40,11 +42,13 @@ class Puppet::Resource::Puppetdb < Puppet::Indirector::REST
40
42
  raise Puppet::Error, "Could not retrieve resources from the PuppetDB at #{self.class.server}:#{self.class.port}: #{e}"
41
43
  end
42
44
 
43
- resources = profile "Parse resource query response (size: #{response.body.size})" do
45
+ resources = profile("Parse resource query response (size: #{response.body.size})",
46
+ [:puppetdb, :resource, :search, :parse_query_response, request.key]) do
44
47
  JSON.load(response.body)
45
48
  end
46
49
 
47
- profile "Build up collected resource objects (count: #{resources.count})" do
50
+ profile("Build up collected resource objects (count: #{resources.count})",
51
+ [:puppetdb, :resource, :search, :build_up_collected_objects, request.key]) do
48
52
  resources.map do |res|
49
53
  params = res['parameters'] || {}
50
54
  params = params.map do |name,value|
@@ -18,7 +18,7 @@ Puppet::Reports.register_report(:puppetdb) do
18
18
  #
19
19
  # @return [void]
20
20
  def process
21
- profile "report#process" do
21
+ profile("report#process", [:puppetdb, :report, :process]) do
22
22
  submit_command(self.host, report_to_hash, CommandStoreReport, 4)
23
23
  end
24
24
 
@@ -31,7 +31,8 @@ Puppet::Reports.register_report(:puppetdb) do
31
31
  # @return Hash[<String, Object>]
32
32
  # @api private
33
33
  def report_to_hash
34
- profile "Convert report to wire format hash" do
34
+ profile("Convert report to wire format hash",
35
+ [:puppetdb, :report, :convert_to_wire_format_hash]) do
35
36
  if environment.nil?
36
37
  raise Puppet::Error, "Environment is nil, unable to submit report. This may be due a bug with Puppet. Ensure you are running the latest revision, see PUP-2508 for more details."
37
38
  end
@@ -54,7 +55,8 @@ Puppet::Reports.register_report(:puppetdb) do
54
55
  # @return Array[Hash]
55
56
  # @api private
56
57
  def build_events_list
57
- profile "Build events list (count: #{resource_statuses.count})" do
58
+ profile("Build events list (count: #{resource_statuses.count})",
59
+ [:puppetdb, :events_list, :build]) do
58
60
  filter_events(resource_statuses.inject([]) do |events, status_entry|
59
61
  _, status = *status_entry
60
62
  if ! (status.events.empty?)
@@ -133,7 +135,8 @@ Puppet::Reports.register_report(:puppetdb) do
133
135
  # @api private
134
136
  def filter_events(events)
135
137
  if config.ignore_blacklisted_events?
136
- profile "Filter blacklisted events" do
138
+ profile("Filter blacklisted events",
139
+ [:puppetdb, :events, :filter_blacklisted]) do
137
140
  events.select { |e| ! config.is_event_blacklisted?(e) }
138
141
  end
139
142
  else
@@ -30,6 +30,10 @@ module Puppet::Util::Puppetdb
30
30
  @config
31
31
  end
32
32
 
33
+ def self.puppet3compat?
34
+ defined?(Puppet::Parser::AST::HashOrArrayAccess)
35
+ end
36
+
33
37
  # This magical stuff is needed so that the indirector termini will make requests to
34
38
  # the correct host/port, because this module gets mixed in to our indirector
35
39
  # termini.
@@ -76,7 +80,8 @@ module Puppet::Util::Puppetdb
76
80
  # @param version [Number] version number of command
77
81
  # @return [Hash <String, String>]
78
82
  def submit_command(certname, payload, command_name, version)
79
- profile "Submitted command '#{command_name}' version '#{version}'" do
83
+ profile("Submitted command '#{command_name}' version '#{version}'",
84
+ [:puppetdb, :command, :submit, command_name, version]) do
80
85
  command = Puppet::Util::Puppetdb::Command.new(command_name, version, certname, payload)
81
86
  command.submit
82
87
  end
@@ -90,11 +95,18 @@ module Puppet::Util::Puppetdb
90
95
  # in the profiled hierachy.
91
96
  #
92
97
  # @param message [String] A description of the profiled event
98
+ # @param metric_id [Array] A list of strings making up the ID of a metric to profile
93
99
  # @param block [Block] The segment of code to profile
94
100
  # @api public
95
- def profile(message, &block)
101
+ def profile(message, metric_id, &block)
96
102
  message = "PuppetDB: " + message
97
- Puppet::Util::Profiler.profile(message, &block)
103
+ arity = Puppet::Util::Profiler.method(:profile).arity
104
+ case arity
105
+ when 1
106
+ Puppet::Util::Profiler.profile(message, &block)
107
+ when 2, -2
108
+ Puppet::Util::Profiler.profile(message, metric_id, &block)
109
+ end
98
110
  end
99
111
 
100
112
  # @!group Private instance methods
@@ -27,7 +27,7 @@ class Puppet::Util::Puppetdb::Command
27
27
  @command = command
28
28
  @version = version
29
29
  @certname = certname
30
- profile "Format payload" do
30
+ profile("Format payload", [:puppetdb, :payload, :format]) do
31
31
  @payload = self.class.format_payload(command, version, payload)
32
32
  end
33
33
  end
@@ -43,7 +43,7 @@ class Puppet::Util::Puppetdb::Command
43
43
  for_whom = " for #{certname}" if certname
44
44
 
45
45
  begin
46
- response = profile "Submit command HTTP post" do
46
+ response = profile("Submit command HTTP post", [:puppetdb, :command, :submit]) do
47
47
  http = Puppet::Network::HttpPool.http_instance(config.server, config.port)
48
48
  http.post(Puppet::Util::Puppetdb.url_path(CommandsUrl + "?checksum=#{checksum}"),
49
49
  payload, headers)
@@ -1,6 +1,6 @@
1
1
  module PuppetDB
2
2
  module Terminus
3
- VERSION = "2.2.2"
3
+ VERSION = "2.3.0"
4
4
  UPSTREAM_VERSION = VERSION.split(".")[0..2].join(".")
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quixoten-puppetdb-terminus
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.2
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Devin Christensen