Class: Chef::RunList::RunListExpansion

Inherits:
Object
  • Object
show all
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

Instance Attribute Summary collapse

Instance Method Summary collapse

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_rolesObject (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_traceObject (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_attrsObject (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

#environmentObject (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_roleObject (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_attrsObject (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

#recipesObject (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_errorsObject (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_itemsObject (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_traceObject (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

#sourceObject (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

Returns:

  • (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

#errorsObject


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)?

Returns:

  • (Boolean)

85
86
87
# File 'lib/chef/run_list/run_list_expansion.rb', line 85

def errors?
  @missing_roles_with_including_role.length > 0
end

#expandObject

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 expand
  # Sure do miss function arity when being recursive
  expand_run_list_items(@run_list_items)
end

#fetch_role(name, included_by) ⇒ Object

In subclasses, this method will fetch the role from the data source.

Raises:

  • (NotImplementedError)

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

#rolesObject

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_hObject 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