Class: Chef::Resource::Notification

Inherits:
Object
  • Object
show all
Defined in:
lib/chef/resource/resource_notification.rb

Overview

Author:

  • Tyler Ball

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(resource, action, notifying_resource, unified_mode = false) ⇒ Notification

Returns a new instance of Notification.



31
32
33
34
35
36
# File 'lib/chef/resource/resource_notification.rb', line 31

def initialize(resource, action, notifying_resource, unified_mode = false)
  @resource = resource
  @action = action&.to_sym
  @notifying_resource = notifying_resource
  @unified_mode = unified_mode
end

Instance Attribute Details

#actionAction

the action to notify

Returns:

  • (Action)

    the current value of action



27
28
29
# File 'lib/chef/resource/resource_notification.rb', line 27

def action
  @action
end

#notifying_resourceResource

the Chef resource performing the notification

Returns:

  • (Resource)

    the current value of notifying_resource



27
28
29
# File 'lib/chef/resource/resource_notification.rb', line 27

def notifying_resource
  @notifying_resource
end

#resourceResource

the Chef resource object to notify to

Returns:

  • (Resource)

    the current value of resource



27
28
29
# File 'lib/chef/resource/resource_notification.rb', line 27

def resource
  @resource
end

#unified_modeObject

Returns the value of attribute unified_mode.



29
30
31
# File 'lib/chef/resource/resource_notification.rb', line 29

def unified_mode
  @unified_mode
end

Instance Method Details

#==(other) ⇒ Object



136
137
138
139
140
# File 'lib/chef/resource/resource_notification.rb', line 136

def ==(other)
  return false unless other.is_a?(self.class)

  other.resource == resource && other.action == action && other.notifying_resource == notifying_resource
end

#duplicates?(other_notification) ⇒ Boolean

Is the current notification a duplicate of another notification

Parameters:

  • other_notification (Notification)

    another notification object to compare to

Returns:

  • (Boolean)

    does the resource match



42
43
44
45
46
47
48
49
# File 'lib/chef/resource/resource_notification.rb', line 42

def duplicates?(other_notification)
  unless other_notification.respond_to?(:resource) && other_notification.respond_to?(:action)
    msg = "only duck-types of Chef::Resource::Notification can be checked for duplication "\
          "you gave #{other_notification.inspect}"
    raise ArgumentError, msg
  end
  other_notification.resource == resource && other_notification.action == action
end

#fix_notifier_reference(resource_collection) ⇒ void

This method returns an undefined value.

This will look up the notifying_resource if it is not a Resource Object. It will complain if it finds multiple resources, can’t find a resource, or gets invalid syntax.

Parameters:



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/chef/resource/resource_notification.rb', line 108

def fix_notifier_reference(resource_collection)
  matching_notifier = resource_collection.find(notifying_resource)
  if Array(matching_notifier).size > 1
    msg = "Notification #{self} from #{notifying_resource} was created with a reference to multiple notifying "\
    "resources, but can only originate from one resource.  Destination resource was defined "\
    "on #{resource.source_line}"
    raise Chef::Exceptions::InvalidResourceReference, msg
  end
  self.notifying_resource = matching_notifier

rescue Chef::Exceptions::ResourceNotFound => e
  err = Chef::Exceptions::ResourceNotFound.new(<<~FAIL)
    Resource #{resource} is configured to receive notifications from #{notifying_resource} with action #{action}, \
    but #{notifying_resource} cannot be found in the resource collection. #{resource} is defined in \
    #{resource.source_line}
  FAIL
  err.set_backtrace(e.backtrace)
  raise err
rescue Chef::Exceptions::InvalidResourceSpecification => e
  err = Chef::Exceptions::InvalidResourceSpecification.new(<<~F)
    Resource #{resource} is configured to receive notifications from  #{notifying_resource} with action #{action}, \
    but #{notifying_resource.inspect} is not valid syntax to look up a resource in the resource collection. Notification \
    is defined near #{resource.source_line}
  F
  err.set_backtrace(e.backtrace)
  raise err
end

#fix_resource_reference(resource_collection, always_raise = false) ⇒ void

This method returns an undefined value.

This will look up the resource if it is not a Resource Object. It will complain if it finds multiple resources, can’t find a resource, or gets invalid syntax.

Parameters:



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/chef/resource/resource_notification.rb', line 73

def fix_resource_reference(resource_collection, always_raise = false)
  matching_resource = resource_collection.find(resource)
  if Array(matching_resource).size > 1
    msg = "Notification #{self} from #{notifying_resource} was created with a reference to multiple resources, "\
    "but can only notify one resource. Notifying resource was defined on #{notifying_resource.source_line}"
    raise Chef::Exceptions::InvalidResourceReference, msg
  end
  self.resource = matching_resource

rescue Chef::Exceptions::ResourceNotFound => e
  # in unified mode we allow lazy notifications to resources not yet declared
  if !unified_mode || always_raise
    err = Chef::Exceptions::ResourceNotFound.new(<<~FAIL)
      resource #{notifying_resource} is configured to notify resource #{resource} with action #{action}, \
      but #{resource} cannot be found in the resource collection. #{notifying_resource} is defined in \
      #{notifying_resource.source_line}
    FAIL
    err.set_backtrace(e.backtrace)
    raise err
  end
rescue Chef::Exceptions::InvalidResourceSpecification => e
  err = Chef::Exceptions::InvalidResourceSpecification.new(<<~F)
    Resource #{notifying_resource} is configured to notify resource #{resource} with action #{action}, \
    but #{resource.inspect} is not valid syntax to look up a resource in the resource collection. Notification \
    is defined near #{notifying_resource.source_line}
  F
  err.set_backtrace(e.backtrace)
  raise err
end

#resolve_resource_reference(resource_collection, always_raise = false) ⇒ void

This method returns an undefined value.

If resource and/or notifying_resource is not a resource object, this will look them up in the resource collection and fix the references from strings to actual Resource objects.

Parameters:



56
57
58
59
60
61
62
63
64
65
66
# File 'lib/chef/resource/resource_notification.rb', line 56

def resolve_resource_reference(resource_collection, always_raise = false)
  return resource if resource.is_a?(Chef::Resource) && notifying_resource.is_a?(Chef::Resource)

  unless resource.is_a?(Chef::Resource)
    fix_resource_reference(resource_collection, always_raise)
  end

  unless notifying_resource.is_a?(Chef::Resource)
    fix_notifier_reference(resource_collection)
  end
end