635: def trigger(resource)
636: return nil unless targeted?(resource)
637: callbacks = Hash.new { |hash, key| hash[key] = [] }
638:
639: trigged = []
640: @targets[resource].each do |edge|
641:
642: callbacks[edge.callback] << edge
643: end
644:
645: callbacks.each do |callback, subs|
646: noop = true
647: subs.each do |edge|
648: if edge.event.nil? or ! edge.event.include?(:noop)
649: noop = false
650: end
651: end
652:
653: if noop
654: resource.notice "Would have triggered %s from %s dependencies" %
655: [callback, subs.length]
656:
657:
658: return [Puppet::Transaction::Event.new(:noop, resource)]
659: end
660:
661: if subs.length == 1 and subs[0].source == resource
662: message = "Refreshing self"
663: else
664: message = "Triggering '%s' from %s dependencies" %
665: [callback, subs.length]
666: end
667: resource.notice message
668:
669:
670:
671: begin
672: resource.send(callback)
673: @resourcemetrics[:restarted] += 1
674: rescue => detail
675: resource.err "Failed to call %s on %s: %s" %
676: [callback, resource, detail]
677:
678: @resourcemetrics[:failed_restarts] += 1
679:
680: if Puppet[:trace]
681: puts detail.backtrace
682: end
683: end
684:
685:
686: trigged << Puppet::Transaction::Event.new(:triggered, resource)
687:
688: triggered(resource, callback)
689: end
690:
691: if trigged.empty?
692: return nil
693: else
694: return trigged
695: end
696: end