Method: Chef::Resource#run_action

Defined in:
lib/chef/resource.rb

#run_action(action, notification_type = nil, notifying_resource = nil) ⇒ Object

Runs the given action on this resource, immediately.

Parameters:

  • action

    The action to run (e.g. :create)

  • notification_type (defaults to: nil)

    The notification type that triggered this (if any)

  • notifying_resource (defaults to: nil)

    The resource that triggered this notification (if any)

Raises:

  • Any error that occurs during the actual action.



573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
# File 'lib/chef/resource.rb', line 573

def run_action(action, notification_type = nil, notifying_resource = nil)
  # reset state in case of multiple actions on the same resource.
  @elapsed_time = 0
  start_time = Time.now
  events.resource_action_start(self, action, notification_type, notifying_resource)
  # Try to resolve lazy/forward references in notifications again to handle
  # the case where the resource was defined lazily (ie. in a ruby_block)
  resolve_notification_references
  validate_action(action)

  if Chef::Config[:verbose_logging] || logger.level == :debug
    # This can be noisy
    logger.info("Processing #{self} action #{action} (#{defined_at})")
  end

  # ensure that we don't leave @updated_by_last_action set to true
  # on accident
  updated_by_last_action(false)

  # Don't modify @retries directly and keep it intact, so that the
  # recipe_snippet from ResourceFailureInspector can print the value
  # that was set in the resource block initially.
  remaining_retries = retries

  begin
    return if should_skip?(action)

    with_umask do
      provider_for_action(action).run_action
    end
  rescue StandardError => e
    if ignore_failure
      logger.error("#{custom_exception_message(e)}; ignore_failure is set, continuing")
      events.resource_failed(self, action, e)
    elsif remaining_retries > 0
      events.resource_failed_retriable(self, action, remaining_retries, e)
      remaining_retries -= 1
      logger.info("Retrying execution of #{self}, #{remaining_retries} attempt#{"s" if remaining_retries > 1} left")
      sleep retry_delay
      retry
    else
      events.resource_failed(self, action, e)
      raise customize_exception(e)
    end
  end
ensure
  @elapsed_time = Time.now - start_time
  # Reporting endpoint doesn't accept a negative resource duration so set it to 0.
  # A negative value can occur when a resource changes the system time backwards
  @elapsed_time = 0 if @elapsed_time < 0

  events.resource_completed(self)
end