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
Instance Attribute Summary collapse
-
#all_missing_roles ⇒ Object
readonly
Returns the value of attribute all_missing_roles.
-
#better_run_list_trace ⇒ Object
readonly
Like run list trace but instead of saving the entries as strings it saves their objects The to_json method uses this list to construct json.
-
#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.
-
#role_errors ⇒ Object
readonly
Returns the value of attribute role_errors.
-
#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.
- #to_h ⇒ Object (also: #to_hash)
- #to_json(*a) ⇒ Object
Constructor Details
#initialize(environment, run_list_items, source = nil) ⇒ RunListExpansion
Returns a new instance of RunListExpansion.
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 65 def initialize(environment, run_list_items, source = nil) @environment = environment @missing_roles_with_including_role = [] @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] = [] } @better_run_list_trace = Hash.new { |h, key| h[key] = [] } @all_missing_roles = {} @role_errors = {} end |
Instance Attribute Details
#all_missing_roles ⇒ Object (readonly)
Returns the value of attribute all_missing_roles.
62 63 64 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 62 def all_missing_roles @all_missing_roles end |
#better_run_list_trace ⇒ Object (readonly)
Like run list trace but instead of saving the entries as strings it saves their objects The to_json method uses this list to construct json.
60 61 62 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 60 def better_run_list_trace @better_run_list_trace end |
#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 |
#role_errors ⇒ Object (readonly)
Returns the value of attribute role_errors.
63 64 65 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 63 def role_errors @role_errors 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 Chef::ServerAPI 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
115 116 117 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 115 def applied_role?(role_name) @applied_roles.key?(role_name) end |
#apply_role_attributes(role) ⇒ Object
110 111 112 113 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 110 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 ⇒ Object
143 144 145 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 143 def errors @missing_roles_with_including_role.map(&:first) end |
#errors? ⇒ Boolean Also known as: invalid?
Did we find any errors (expanding roles)?
85 86 87 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 85 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
93 94 95 96 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 93 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.
128 129 130 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 128 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
103 104 105 106 107 108 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 103 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
136 137 138 139 140 141 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 136 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] @all_missing_roles[name] = true 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.
123 124 125 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 123 def roles @applied_roles.keys end |
#to_h ⇒ Object Also known as: to_hash
151 152 153 154 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 151 def to_h seen_items = { recipe: {}, role: {} } { id: @environment, run_list: convert_run_list_trace("top level", seen_items) } end |
#to_json(*a) ⇒ Object
147 148 149 |
# File 'lib/chef/run_list/run_list_expansion.rb', line 147 def to_json(*a) Chef::JSONCompat.to_json(to_h, *a) end |