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) ⇒ Notification

Returns a new instance of Notification



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

def initialize(resource, action, notifying_resource)
  @resource = resource
  @action = action&.to_sym
  @notifying_resource = notifying_resource
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

Instance Method Details

#==(other) ⇒ Object



132
133
134
135
# File 'lib/chef/resource/resource_notification.rb', line 132

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



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

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:



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

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) ⇒ 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:



72
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
# File 'lib/chef/resource/resource_notification.rb', line 72

def fix_resource_reference(resource_collection)
  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
  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
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) ⇒ 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:



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

def resolve_resource_reference(resource_collection)
  return resource if resource.kind_of?(Chef::Resource) && notifying_resource.kind_of?(Chef::Resource)

  if not(resource.kind_of?(Chef::Resource))
    fix_resource_reference(resource_collection)
  end

  if not(notifying_resource.kind_of?(Chef::Resource))
    fix_notifier_reference(resource_collection)
  end
end