# class Chef::RunList::RunListExpansion

Abstract Base class for expanding a run list. Subclasses must handle fetching roles from a data source by defining `fetch_role`

### Attributes

default_attrs[R]
environment[R]
missing_roles_with_including_role[R]
override_attrs[R]
recipes[R]

A VersionedRecipeList of recipes. Populated only after expand is called.

run_list_items[R]
run_list_trace[R]

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.

source[R]

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.

### Public Class Methods

new(environment, run_list_items, source=nil) click to toggle source

    # 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

### Public Instance Methods

applied_role?(role_name) click to toggle source

    # 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) click to toggle source

    # 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() click to toggle source

    # File lib/chef/run_list/run_list_expansion.rb, line 130
    def errors
      @missing_roles_with_including_role.map {|item| item.first }
    end

errors?() click to toggle source

Did we find any errors (expanding roles)?

    # File lib/chef/run_list/run_list_expansion.rb, line 74
    def errors?
      @missing_roles_with_including_role.length > 0
    end

Also aliased as: invalid?
expand() click to toggle source

Recurses over the run list items, expanding roles. After this, `recipes` will contain the fully expanded recipe list

    # File lib/chef/run_list/run_list_expansion.rb, line 82
    def expand
      # Sure do miss function arity when being recursive
      expand_run_list_items(@run_list_items)
    end

fetch_role(name, included_by) click to toggle source

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

    # 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) click to toggle source

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

    # 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

invalid?()
Alias for: errors?
role_not_found(name, included_by) click to toggle source

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

    # 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() click to toggle source

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.

    # File lib/chef/run_list/run_list_expansion.rb, line 111
    def roles
      @applied_roles.keys
    end