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

#errorsObject (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_attrsObject (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

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

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

Returns:

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

Returns:

  • (Boolean)


62
63
64
# File 'lib/chef/run_list/run_list_expansion.rb', line 62

def errors?
  @errors.length > 0
end

#expandObject

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 expand
  @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.

Raises:

  • (NotImplementedError)


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

#rolesObject



108
109
110
# File 'lib/chef/run_list/run_list_expansion.rb', line 108

def roles
  @applied_roles.keys
end