Class: Chef::Formatters::Doc

Inherits:
Base show all
Defined in:
lib/chef/formatters/doc.rb

Overview

– TODO: not sold on the name, but the output is similar to what rspec calls “specdoc”

Instance Attribute Summary collapse

Attributes inherited from Base

#err, #out, #output

Instance Method Summary collapse

Methods inherited from Base

#attribute_file_load_failed, #attribute_file_loaded, cli_name, #cookbook_sync_failed, #definition_file_load_failed, #definition_file_loaded, #display_error, #file_load_failed, #indent_by, #library_file_load_failed, #library_file_loaded, #lwrp_file_load_failed, #lwrp_file_loaded, #print, #puts, #puts_line, #recipe_file_load_failed, #recipe_file_loaded, #recipe_not_found, #registration_failed, #run_list_expand_failed, #start_line

Methods included from ErrorMapper

cookbook_resolution_failed, cookbook_sync_failed, file_load_failed, node_load_failed, registration_failed, resource_failed, run_list_expand_failed

Methods inherited from EventDispatch::Base

#attribute_file_load_failed, #attribute_file_loaded, #attribute_load_complete, #attribute_load_start, #control_group_started, #cookbook_sync_failed, #definition_file_load_failed, #definition_file_loaded, #definition_load_complete, #definition_load_start, #library_file_load_failed, #library_file_loaded, #library_load_complete, #lwrp_file_load_failed, #lwrp_file_loaded, #lwrp_load_complete, #lwrp_load_start, #msg, #recipe_file_load_failed, #recipe_file_loaded, #recipe_load_start, #recipe_not_found, #registration_failed, #resource_completed, #run_list_expand_failed, #run_started, #stream_closed, #stream_opened

Constructor Details

#initialize(out, err) ⇒ Doc

Returns a new instance of Doc.



16
17
18
19
20
21
22
23
24
25
# File 'lib/chef/formatters/doc.rb', line 16

def initialize(out, err)
  super

  @updated_resources = 0
  @up_to_date_resources = 0
  @successful_audits = 0
  @failed_audits = 0
  @start_time = Time.now
  @end_time = @start_time
end

Instance Attribute Details

#end_timeObject (readonly)

Returns the value of attribute end_time.



11
12
13
# File 'lib/chef/formatters/doc.rb', line 11

def end_time
  @end_time
end

#start_timeObject (readonly)

Returns the value of attribute start_time.



11
12
13
# File 'lib/chef/formatters/doc.rb', line 11

def start_time
  @start_time
end

Instance Method Details

#audit_phase_completeObject



178
179
180
# File 'lib/chef/formatters/doc.rb', line 178

def audit_phase_complete
  puts_line "Auditing complete"
end

#audit_phase_failed(error) ⇒ Object



182
183
184
185
186
187
188
189
190
# File 'lib/chef/formatters/doc.rb', line 182

def audit_phase_failed(error)
  puts_line ""
  puts_line "Audit phase exception:"
  indent
  puts_line "#{error.message}"
  error.backtrace.each do |l|
    puts_line l
  end
end

#audit_phase_start(run_status) ⇒ Object

Called before audit phase starts



174
175
176
# File 'lib/chef/formatters/doc.rb', line 174

def audit_phase_start(run_status)
  puts_line "Starting audit phase"
end

#control_example_failure(control_group_name, example_data, error) ⇒ Object



196
197
198
# File 'lib/chef/formatters/doc.rb', line 196

def control_example_failure(control_group_name, example_data, error)
  @failed_audits += 1
end

#control_example_success(control_group_name, example_data) ⇒ Object



192
193
194
# File 'lib/chef/formatters/doc.rb', line 192

def control_example_success(control_group_name, example_data)
  @successful_audits += 1
end

#converge_completeObject

Called when the converge phase is finished.



164
165
166
# File 'lib/chef/formatters/doc.rb', line 164

def converge_complete
  unindent if @current_recipe
end

#converge_failed(e) ⇒ Object



168
169
170
171
# File 'lib/chef/formatters/doc.rb', line 168

def converge_failed(e)
  # Currently a failed converge is handled the same way as a successful converge
  converge_complete
end

#converge_start(run_context) ⇒ Object

Called before convergence starts



159
160
161
# File 'lib/chef/formatters/doc.rb', line 159

def converge_start(run_context)
  puts_line "Converging #{run_context.resource_collection.all_resources.size} resources"
end

#cookbook_clean_completeObject

Called when cookbook cleaning is finished.



122
123
# File 'lib/chef/formatters/doc.rb', line 122

def cookbook_clean_complete
end

#cookbook_clean_startObject

Called before unneeded cookbooks are removed



112
113
# File 'lib/chef/formatters/doc.rb', line 112

def cookbook_clean_start
end

#cookbook_resolution_complete(cookbook_collection) ⇒ Object

Called when the cookbook collection is returned from the server.



108
109
# File 'lib/chef/formatters/doc.rb', line 108

def cookbook_resolution_complete(cookbook_collection)
end

#cookbook_resolution_failed(expanded_run_list, exception) ⇒ Object

Called when there is an error getting the cookbook collection from the server.



103
104
105
# File 'lib/chef/formatters/doc.rb', line 103

def cookbook_resolution_failed(expanded_run_list, exception)
  super
end

#cookbook_resolution_start(expanded_run_list) ⇒ Object

Called before the cookbook collection is fetched from the server.



97
98
99
# File 'lib/chef/formatters/doc.rb', line 97

def cookbook_resolution_start(expanded_run_list)
  puts_line "resolving cookbooks for run list: #{expanded_run_list.inspect}"
end

#cookbook_sync_completeObject

Called after all cookbooks have been sync’d.



141
142
143
# File 'lib/chef/formatters/doc.rb', line 141

def cookbook_sync_complete
  unindent
end

#cookbook_sync_start(cookbook_count) ⇒ Object

Called before cookbook sync starts



126
127
128
129
# File 'lib/chef/formatters/doc.rb', line 126

def cookbook_sync_start(cookbook_count)
  puts_line "Synchronizing Cookbooks:"
  indent
end

#elapsed_timeObject



27
28
29
# File 'lib/chef/formatters/doc.rb', line 27

def elapsed_time
  end_time - start_time
end

#file_loaded(path) ⇒ Object

Called after a file in a cookbook is loaded.



151
152
# File 'lib/chef/formatters/doc.rb', line 151

def file_loaded(path)
end

#handler_executed(handler) ⇒ Object

Called after an individual handler has run



301
302
303
# File 'lib/chef/formatters/doc.rb', line 301

def handler_executed(handler)
  puts_line "- #{handler.class.name}"
end

#handlers_completedObject

Called after all handlers have executed



306
307
308
309
# File 'lib/chef/formatters/doc.rb', line 306

def handlers_completed
  unindent
  puts_line "Running handlers complete\n"
end

#handlers_start(handler_count) ⇒ Object

Called before handlers run



294
295
296
297
298
# File 'lib/chef/formatters/doc.rb', line 294

def handlers_start(handler_count)
  puts ''
  puts "Running handlers:"
  indent
end

#indentObject



329
330
331
# File 'lib/chef/formatters/doc.rb', line 329

def indent
  indent_by(2)
end

#library_load_start(file_count) ⇒ Object

Called when cookbook loading starts.



146
147
148
# File 'lib/chef/formatters/doc.rb', line 146

def library_load_start(file_count)
  puts_line "Compiling Cookbooks..."
end

#node_load_completed(node, expanded_run_list, config) ⇒ Object

Default and override attrs from roles have been computed, but not yet applied. Normal attrs from JSON have been added to the node.



93
94
# File 'lib/chef/formatters/doc.rb', line 93

def node_load_completed(node, expanded_run_list, config)
end

#node_load_failed(node_name, exception, config) ⇒ Object

Failed to load node data from the server



87
88
89
# File 'lib/chef/formatters/doc.rb', line 87

def node_load_failed(node_name, exception, config)
  super
end

#node_load_start(node_name, config) ⇒ Object



83
84
# File 'lib/chef/formatters/doc.rb', line 83

def node_load_start(node_name, config)
end

#ohai_completed(node) ⇒ Object

Called right after ohai runs.



68
69
# File 'lib/chef/formatters/doc.rb', line 68

def ohai_completed(node)
end

#output_record(line) ⇒ Object



252
253
254
# File 'lib/chef/formatters/doc.rb', line 252

def output_record(line)

end

#provider_requirement_failed(action, resource, exception, message) ⇒ Object

Called when an assertion declared by a provider fails



321
322
323
324
325
326
327
# File 'lib/chef/formatters/doc.rb', line 321

def provider_requirement_failed(action, resource, exception, message)
  return unless message
  color = Chef::Config[:why_run] ? :yellow : :red
  [ message ].flatten.each do |line|
    start_line("* #{line}", color)
  end
end

#recipe_load_completeObject

Called when recipes have been loaded.



155
156
# File 'lib/chef/formatters/doc.rb', line 155

def recipe_load_complete
end

#registration_completedObject



80
81
# File 'lib/chef/formatters/doc.rb', line 80

def registration_completed
end

#registration_start(node_name, config) ⇒ Object

About to attempt to register as node_name



76
77
78
# File 'lib/chef/formatters/doc.rb', line 76

def registration_start(node_name, config)
  puts_line "Creating a new client identity for #{node_name} using the validator key."
end

#removed_cookbook_file(path) ⇒ Object

Called after the file at path is removed. It may be removed if the cookbook containing it was removed from the run list, or if the file was removed from the cookbook.



118
119
# File 'lib/chef/formatters/doc.rb', line 118

def removed_cookbook_file(path)
end

#resource_action_start(resource, action, notification_type = nil, notifier = nil) ⇒ Object

Called before action is executed on a resource.



201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# File 'lib/chef/formatters/doc.rb', line 201

def resource_action_start(resource, action, notification_type=nil, notifier=nil)
  if resource.cookbook_name && resource.recipe_name
    resource_recipe = "#{resource.cookbook_name}::#{resource.recipe_name}"
  else
    resource_recipe = "<Dynamically Defined Resource>"
  end

  if resource_recipe != @current_recipe && !resource.enclosing_provider
    unindent if @current_recipe
    puts_line "Recipe: #{resource_recipe}"
    @current_recipe = resource_recipe
    indent
  end
  # TODO: info about notifies
  start_line "* #{resource} action #{action}", :stream => resource
  indent
end

#resource_bypassed(resource, action, provider) ⇒ Object



247
248
249
250
# File 'lib/chef/formatters/doc.rb', line 247

def resource_bypassed(resource, action, provider)
  puts " (Skipped: whyrun not supported by provider #{provider.class.name})", :stream => resource
  unindent
end

#resource_current_state_load_bypassed(resource, action, current_resource) ⇒ Object

Called when resource current state load is skipped due to the provider not supporting whyrun mode.



285
286
287
# File 'lib/chef/formatters/doc.rb', line 285

def resource_current_state_load_bypassed(resource, action, current_resource)
  puts_line("* Whyrun not supported for #{resource}, bypassing load.", :yellow)
end

#resource_current_state_loaded(resource, action, current_resource) ⇒ Object

Called after #load_current_resource has run.



237
238
# File 'lib/chef/formatters/doc.rb', line 237

def resource_current_state_loaded(resource, action, current_resource)
end

#resource_failed(resource, action, exception) ⇒ Object

Called when a resource fails and will not be retried.



224
225
226
227
# File 'lib/chef/formatters/doc.rb', line 224

def resource_failed(resource, action, exception)
  super
  unindent
end

#resource_failed_retriable(resource, action, retry_count, exception) ⇒ Object

Called when a resource fails, but will retry.



220
221
# File 'lib/chef/formatters/doc.rb', line 220

def resource_failed_retriable(resource, action, retry_count, exception)
end

#resource_skipped(resource, action, conditional) ⇒ Object

Called when a resource action has been skipped b/c of a conditional



230
231
232
233
234
# File 'lib/chef/formatters/doc.rb', line 230

def resource_skipped(resource, action, conditional)
  # TODO: more info about conditional
  puts " (skipped due to #{conditional.short_description})", :stream => resource
  unindent
end

#resource_up_to_date(resource, action) ⇒ Object

Called when a resource has no converge actions, e.g., it was already correct.



241
242
243
244
245
# File 'lib/chef/formatters/doc.rb', line 241

def resource_up_to_date(resource, action)
  @up_to_date_resources+= 1
  puts " (up to date)", :stream => resource
  unindent
end

#resource_update_applied(resource, action, update) ⇒ Object

Called when a change has been made to a resource. May be called multiple times per resource, e.g., a file may have its content updated, and then its permissions updated.



259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
# File 'lib/chef/formatters/doc.rb', line 259

def resource_update_applied(resource, action, update)
  prefix = Chef::Config[:why_run] ? "Would " : ""
  Array(update).each do |line|
    next if line.nil?
    output_record line
    if line.kind_of? String
      start_line "- #{prefix}#{line}", :green
    elsif line.kind_of? Array
      # Expanded output - delta
      # @todo should we have a resource_update_delta callback?
      line.each do |detail|
        start_line detail, :white
      end
    end
  end
end

#resource_updated(resource, action) ⇒ Object

Called after a resource has been completely converged.



277
278
279
280
281
# File 'lib/chef/formatters/doc.rb', line 277

def resource_updated(resource, action)
  @updated_resources += 1
  unindent
  puts "\n"
end

#run_completed(node) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
# File 'lib/chef/formatters/doc.rb', line 43

def run_completed(node)
  @end_time = Time.now
  if Chef::Config[:why_run]
    puts_line "Chef Client finished, #{@updated_resources}/#{total_resources} resources would have been updated"
  else
    puts_line "Chef Client finished, #{@updated_resources}/#{total_resources} resources updated in #{elapsed_time} seconds"
    if total_audits > 0
      puts_line "  #{successful_audits}/#{total_audits} Audits succeeded"
    end
  end
end

#run_failed(exception) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
# File 'lib/chef/formatters/doc.rb', line 55

def run_failed(exception)
  @end_time = Time.now
  if Chef::Config[:why_run]
    puts_line "Chef Client failed. #{@updated_resources} resources would have been updated"
  else
    puts_line "Chef Client failed. #{@updated_resources} resources updated in #{elapsed_time} seconds"
    if total_audits > 0
      puts_line "  #{successful_audits} Audits succeeded"
    end
  end
end

#run_start(version) ⇒ Object



31
32
33
# File 'lib/chef/formatters/doc.rb', line 31

def run_start(version)
  puts_line "Starting Chef Client, version #{version}"
end

#skipping_registration(node_name, config) ⇒ Object

Already have a client key, assuming this node has registered.



72
73
# File 'lib/chef/formatters/doc.rb', line 72

def skipping_registration(node_name, config)
end

#stream_output(stream, output, options = {}) ⇒ Object



289
290
291
# File 'lib/chef/formatters/doc.rb', line 289

def stream_output(stream, output, options = {})
  print(output, { :stream => stream }.merge(options))
end

#synchronized_cookbook(cookbook_name) ⇒ Object

Called when cookbook cookbook_name has been sync’d



132
133
134
# File 'lib/chef/formatters/doc.rb', line 132

def synchronized_cookbook(cookbook_name)
  puts_line "- #{cookbook_name}"
end

#total_auditsObject



39
40
41
# File 'lib/chef/formatters/doc.rb', line 39

def total_audits
  successful_audits + failed_audits
end

#total_resourcesObject



35
36
37
# File 'lib/chef/formatters/doc.rb', line 35

def total_resources
  @up_to_date_resources + @updated_resources
end

#unindentObject



333
334
335
# File 'lib/chef/formatters/doc.rb', line 333

def unindent
  indent_by(-2)
end

#updated_cookbook_file(cookbook_name, path) ⇒ Object

Called when an individual file in a cookbook has been updated



137
138
# File 'lib/chef/formatters/doc.rb', line 137

def updated_cookbook_file(cookbook_name, path)
end

#whyrun_assumption(action, resource, message) ⇒ Object

Called when a provider makes an assumption after a failed assertion in whyrun mode, in order to allow execution to continue



313
314
315
316
317
318
# File 'lib/chef/formatters/doc.rb', line 313

def whyrun_assumption(action, resource, message)
  return unless message
  [ message ].flatten.each do |line|
    start_line("* #{line}", :yellow)
  end
end