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
RunListExpansionFromAPI, RunListExpansionFromCouchDB, RunListExpansionFromDisk
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.
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 58 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.
39 40 41 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 39 def default_attrs @default_attrs end |
#environment ⇒ Object (readonly)
Returns the value of attribute environment.
43 44 45 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 43 def environment @environment end |
#missing_roles_with_including_role ⇒ Object (readonly)
Returns the value of attribute missing_roles_with_including_role.
45 46 47 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 45 def missing_roles_with_including_role @missing_roles_with_including_role end |
#override_attrs ⇒ Object (readonly)
Returns the value of attribute override_attrs.
41 42 43 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 41 def override_attrs @override_attrs end |
#recipes ⇒ Object (readonly)
A VersionedRecipeList of recipes. Populated only after #expand is called.
37 38 39 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 37 def recipes @recipes end |
#run_list_items ⇒ Object (readonly)
Returns the value of attribute run_list_items.
33 34 35 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 33 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.
56 57 58 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 56 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.
50 51 52 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 50 def source @source end |
Instance Method Details
#applied_role?(role_name) ⇒ Boolean
104 105 106 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 104 def applied_role?(role_name) @applied_roles.has_key?(role_name) end |
#apply_role_attributes(role) ⇒ Object
99 100 101 102 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 99 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
131 132 133 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 131 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)?
75 76 77 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 75 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
83 84 85 86 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 83 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.
117 118 119 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 117 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
93 94 95 96 97 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 93 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
125 126 127 128 129 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 125 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.
112 113 114 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 112 def roles @applied_roles.keys end |