Class: ChefApply::Action::ConvergeTarget::CCRFailureMapper
- Inherits:
- 
      Object
      
        - Object
- ChefApply::Action::ConvergeTarget::CCRFailureMapper
 
- Defined in:
- lib/chef_apply/action/converge_target/ccr_failure_mapper.rb
Overview
This converts chef client run failures to human-friendly exceptions with detail and remediation steps based on the failure type.
Defined Under Namespace
Classes: RemoteChefClientRunFailed, RemoteChefClientRunFailedUnknownReason, RemoteChefRunFailedToResolveError
Instance Attribute Summary collapse
- 
  
    
      #params  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    Returns the value of attribute params. 
Instance Method Summary collapse
- 
  
    
      #exception_args_from_cause  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Ideally we will write a custom handler to package up data we care about and present it more directly docs.chef.io/handlers.html For now, we’ll just match the most common failures based on their messages. 
- 
  
    
      #initialize(exception, params)  ⇒ CCRFailureMapper 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    A new instance of CCRFailureMapper. 
- #raise_mapped_exception! ⇒ Object
Constructor Details
#initialize(exception, params) ⇒ CCRFailureMapper
Returns a new instance of CCRFailureMapper.
| 29 30 31 32 | # File 'lib/chef_apply/action/converge_target/ccr_failure_mapper.rb', line 29 def initialize(exception, params) @params = params @cause_line = exception end | 
Instance Attribute Details
#params ⇒ Object (readonly)
Returns the value of attribute params.
| 27 28 29 | # File 'lib/chef_apply/action/converge_target/ccr_failure_mapper.rb', line 27 def params @params end | 
Instance Method Details
#exception_args_from_cause ⇒ Object
Ideally we will write a custom handler to package up data we care about and present it more directly docs.chef.io/handlers.html For now, we’ll just match the most common failures based on their messages.
| 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | # File 'lib/chef_apply/action/converge_target/ccr_failure_mapper.rb', line 52 def exception_args_from_cause # Ordering is important below. Some earlier tests are more detailed # cases of things that will match more general tests further down. case @cause_line when /.*had an error:(.*:)\s+(.*$)/ # Some invalid property value cases, among others. ["CHEFCCR002", $2] when /.*Chef::Exceptions::ValidationFailed:\s+Option action must be equal to one of:\s+(.*)!\s+You passed :(.*)\./ # Invalid action - specialization of invalid property value, below ["CHEFCCR003", $2, $1] when /.*Chef::Exceptions::ValidationFailed:\s+(.*)/ # Invalid resource property value ["CHEFCCR004", $1] when /.*NameError: undefined local variable or method `(.+)' for cookbook.+/ # Invalid resource type in most cases ["CHEFCCR005", $1] when /.*NoMethodError: undefined method `(.+)' for cookbook.+/ # Invalid resource type in most cases ["CHEFCCR005", $1] when /.*undefined method `(.*)' for (.+)/ # Unknown resource property ["CHEFCCR006", $1, $2] # Below would catch the general form of most errors, but the # message itself in those lines is not generally aligned # with the UX we want to provide. # when /.*Exception|Error.*:\s+(.*)/ else nil end end | 
#raise_mapped_exception! ⇒ Object
| 34 35 36 37 38 39 40 41 42 43 44 45 46 | # File 'lib/chef_apply/action/converge_target/ccr_failure_mapper.rb', line 34 def raise_mapped_exception! if @cause_line.nil? raise RemoteChefRunFailedToResolveError.new(params[:failed_report_path]) else errid, *args = exception_args_from_cause if errid.nil? raise RemoteChefClientRunFailedUnknownReason.new else raise RemoteChefClientRunFailed.new(errid, *args) end end end |