Class: Chef::RunList::RunListExpansion
- Inherits:
-
Object
- Object
- Chef::RunList::RunListExpansion
- Defined in:
- lib/chef/run_list/run_list_expansion.rb
Overview
Abstract Base class for expanding a run list. Subclasses must handle fetching roles from a data source by defining fetch_role
Direct Known Subclasses
RunListExpansionFromAPI, RunListExpansionFromCouchDB, RunListExpansionFromDisk
Instance Attribute Summary collapse
-
#default_attrs ⇒ Object
readonly
Returns the value of attribute default_attrs.
-
#errors ⇒ Object
readonly
Returns the value of attribute errors.
-
#override_attrs ⇒ Object
readonly
Returns the value of attribute override_attrs.
-
#recipes ⇒ Object
readonly
Returns the value of attribute recipes.
-
#run_list_items ⇒ Object
readonly
Returns the value of attribute run_list_items.
-
#source ⇒ Object
readonly
The data source passed to the constructor.
Instance Method Summary collapse
- #applied_role(role_name) ⇒ Object
- #applied_role?(role_name) ⇒ Boolean
- #apply_role_attributes(role) ⇒ Object
-
#errors? ⇒ Boolean
(also: #invalid?)
Did we find any errors (expanding roles)?.
-
#expand ⇒ Object
Iterates over the run list items, expanding roles.
-
#fetch_role(name) ⇒ Object
In subclasses, this method will fetch the role from the data source.
-
#inflate_role(role_name) ⇒ Object
Fetches and inflates a role === Returns Chef::Role in most cases false if the role has already been applied nil if the role does not exist.
-
#initialize(run_list_items, source = nil) ⇒ RunListExpansion
constructor
A new instance of RunListExpansion.
-
#role_not_found(name) ⇒ Object
When a role is not found, an error message is logged, but no exception is raised.
- #roles ⇒ Object
Constructor Details
#initialize(run_list_items, source = nil) ⇒ RunListExpansion
Returns a new instance of RunListExpansion.
47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 47 def initialize(run_list_items, source=nil) @errors = Array.new @run_list_items = run_list_items.dup @source = source @default_attrs = Mash.new @override_attrs = Mash.new @recipes = [] @applied_roles = {} end |
Instance Attribute Details
#default_attrs ⇒ Object (readonly)
Returns the value of attribute default_attrs.
36 37 38 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 36 def default_attrs @default_attrs end |
#errors ⇒ Object (readonly)
Returns the value of attribute errors.
40 41 42 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 40 def errors @errors end |
#override_attrs ⇒ Object (readonly)
Returns the value of attribute override_attrs.
38 39 40 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 38 def override_attrs @override_attrs end |
#recipes ⇒ Object (readonly)
Returns the value of attribute recipes.
34 35 36 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 34 def recipes @recipes end |
#run_list_items ⇒ Object (readonly)
Returns the value of attribute run_list_items.
32 33 34 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 32 def run_list_items @run_list_items end |
#source ⇒ Object (readonly)
The data source passed to the constructor. Not used in this class. In subclasses, this is a couchdb or Chef::REST object pre-configured to fetch roles from their correct location.
45 46 47 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 45 def source @source end |
Instance Method Details
#applied_role(role_name) ⇒ Object
104 105 106 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 104 def applied_role(role_name) @applied_roles[role_name] = true end |
#applied_role?(role_name) ⇒ Boolean
100 101 102 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 100 def applied_role?(role_name) @applied_roles.has_key?(role_name) end |
#apply_role_attributes(role) ⇒ Object
95 96 97 98 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 95 def apply_role_attributes(role) @default_attrs = Chef::Mixin::DeepMerge.merge(@default_attrs, role.default_attributes) @override_attrs = Chef::Mixin::DeepMerge.merge(@override_attrs, role.override_attributes) end |
#errors? ⇒ Boolean Also known as: invalid?
Did we find any errors (expanding roles)?
62 63 64 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 62 def errors? @errors.length > 0 end |
#expand ⇒ Object
Iterates over the run list items, expanding roles. After this, recipes
will contain the fully expanded recipe list
70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 70 def @run_list_items.each_with_index do |entry, index| case entry.type when :recipe recipes << entry.name unless recipes.include?(entry.name) when :role if role = inflate_role(entry.name) apply_role_attributes(role) @run_list_items.insert(index + 1, *role.run_list.run_list_items) end end end end |
#fetch_role(name) ⇒ Object
In subclasses, this method will fetch the role from the data source.
113 114 115 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 113 def fetch_role(name) raise NotImplementedError end |
#inflate_role(role_name) ⇒ Object
Fetches and inflates a role
Returns
Chef::Role in most cases false if the role has already been applied nil if the role does not exist
89 90 91 92 93 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 89 def inflate_role(role_name) return false if applied_role?(role_name) # Prevent infinite loops applied_role(role_name) fetch_role(role_name) end |
#role_not_found(name) ⇒ Object
When a role is not found, an error message is logged, but no exception is raised. We do add an entry in the errors collection.
Returns
nil
121 122 123 124 125 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 121 def role_not_found(name) Chef::Log.error("Role #{name} is in the runlist but does not exist. Skipping expand.") @errors << name nil end |
#roles ⇒ Object
108 109 110 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 108 def roles @applied_roles.keys end |