Class: 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
Instance Attribute Summary collapse
-
#default_attrs ⇒ Object
readonly
Returns the value of attribute default_attrs.
-
#environment ⇒ Object
readonly
Returns the value of attribute environment.
-
#missing_roles_with_including_role ⇒ Object
readonly
Returns the value of attribute missing_roles_with_including_role.
-
#override_attrs ⇒ Object
readonly
Returns the value of attribute override_attrs.
-
#recipes ⇒ Object
readonly
A VersionedRecipeList of recipes.
-
#run_list_items ⇒ Object
readonly
Returns the value of attribute run_list_items.
-
#run_list_trace ⇒ Object
readonly
Returns a Hash of the form “including_role” => “included_role_or_recipe”.
-
#source ⇒ Object
readonly
The data source passed to the constructor.
Instance Method Summary collapse
- #applied_role?(role_name) ⇒ Boolean
- #apply_role_attributes(role) ⇒ Object
- #errors ⇒ Object
-
#errors? ⇒ Boolean
(also: #invalid?)
Did we find any errors (expanding roles)?.
-
#expand ⇒ Object
Recurses over the run list items, expanding roles.
-
#fetch_role(name, included_by) ⇒ Object
In subclasses, this method will fetch the role from the data source.
-
#inflate_role(role_name, included_by) ⇒ 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(environment, run_list_items, source = nil) ⇒ RunListExpansion
constructor
A new instance of RunListExpansion.
-
#role_not_found(name, included_by) ⇒ Object
When a role is not found, an error message is logged, but no exception is raised.
-
#roles ⇒ Object
Returns an array of role names that were expanded; this includes any roles that were in the original, pre-expansion run_list as well as roles processed during expansion.
Constructor Details
#initialize(environment, run_list_items, source = nil) ⇒ RunListExpansion
Returns a new instance of RunListExpansion.
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 57 def initialize(environment, run_list_items, source=nil) @environment = environment @missing_roles_with_including_role = Array.new @run_list_items = run_list_items.dup @source = source @default_attrs = Mash.new @override_attrs = Mash.new @recipes = Chef::RunList::VersionedRecipeList.new @applied_roles = {} @run_list_trace = Hash.new {|h, key| h[key] = [] } end |
Instance Attribute Details
#default_attrs ⇒ Object (readonly)
Returns the value of attribute default_attrs.
38 39 40 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 38 def default_attrs @default_attrs end |
#environment ⇒ Object (readonly)
Returns the value of attribute environment.
42 43 44 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 42 def environment @environment end |
#missing_roles_with_including_role ⇒ Object (readonly)
Returns the value of attribute missing_roles_with_including_role.
44 45 46 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 44 def missing_roles_with_including_role @missing_roles_with_including_role end |
#override_attrs ⇒ Object (readonly)
Returns the value of attribute override_attrs.
40 41 42 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 40 def override_attrs @override_attrs end |
#recipes ⇒ Object (readonly)
A VersionedRecipeList of recipes. Populated only after #expand is called.
36 37 38 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 36 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 |
#run_list_trace ⇒ Object (readonly)
Returns a Hash of the form “including_role” => “included_role_or_recipe”. This can be used to show the expanded run list (ordered) graph.
Caveats
-
Duplicate roles are not shown.
55 56 57 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 55 def run_list_trace @run_list_trace 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.
49 50 51 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 49 def source @source end |
Instance Method Details
#applied_role?(role_name) ⇒ Boolean
103 104 105 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 103 def applied_role?(role_name) @applied_roles.has_key?(role_name) end |
#apply_role_attributes(role) ⇒ Object
98 99 100 101 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 98 def apply_role_attributes(role) @default_attrs = Chef::Mixin::DeepMerge.role_merge(@default_attrs, role.default_attributes) @override_attrs = Chef::Mixin::DeepMerge.role_merge(@override_attrs, role.override_attributes) end |
#errors ⇒ Object
130 131 132 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 130 def errors @missing_roles_with_including_role.map {|item| item.first } end |
#errors? ⇒ Boolean Also known as: invalid?
Did we find any errors (expanding roles)?
74 75 76 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 74 def errors? @missing_roles_with_including_role.length > 0 end |
#expand ⇒ Object
Recurses over the run list items, expanding roles. After this, recipes
will contain the fully expanded recipe list
82 83 84 85 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 82 def # Sure do miss function arity when being recursive (@run_list_items) end |
#fetch_role(name, included_by) ⇒ Object
In subclasses, this method will fetch the role from the data source.
116 117 118 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 116 def fetch_role(name, included_by) raise NotImplementedError end |
#inflate_role(role_name, included_by) ⇒ 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
92 93 94 95 96 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 92 def inflate_role(role_name, included_by) return false if applied_role?(role_name) # Prevent infinite loops applied_role(role_name) fetch_role(role_name, included_by) end |
#role_not_found(name, included_by) ⇒ 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
124 125 126 127 128 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 124 def role_not_found(name, included_by) Chef::Log.error("Role #{name} (included by '#{included_by}') is in the runlist but does not exist. Skipping expand.") @missing_roles_with_including_role << [name, included_by] nil end |
#roles ⇒ Object
Returns an array of role names that were expanded; this includes any roles that were in the original, pre-expansion run_list as well as roles processed during expansion. Populated only after #expand is called.
111 112 113 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 111 def roles @applied_roles.keys end |