Class: Chef::RunContext::CookbookCompiler

Inherits:
Object
  • Object
show all
Defined in:
lib/chef/run_context/cookbook_compiler.rb

Overview

Implements the compile phase of the chef run by loading/eval-ing files from cookbooks in the correct order and in the correct context.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(run_context, run_list_expansion, events) ⇒ CookbookCompiler

Returns a new instance of CookbookCompiler.



34
35
36
37
38
39
# File 'lib/chef/run_context/cookbook_compiler.rb', line 34

def initialize(run_context, run_list_expansion, events)
  @run_context = run_context
  @events = events
  @run_list_expansion = run_list_expansion
  @cookbook_order = nil
end

Instance Attribute Details

#eventsObject (readonly)

Returns the value of attribute events.



31
32
33
# File 'lib/chef/run_context/cookbook_compiler.rb', line 31

def events
  @events
end

#run_list_expansionObject (readonly)

Returns the value of attribute run_list_expansion.



32
33
34
# File 'lib/chef/run_context/cookbook_compiler.rb', line 32

def run_list_expansion
  @run_list_expansion
end

Instance Method Details

#compileObject

Run the compile phase of the chef run. Loads files in the following order:

  • Libraries

  • Attributes

  • LWRPs

  • Resource Definitions

  • Recipes

Recipes are loaded in precisely the order specified by the expanded run_list.

Other files are loaded in an order derived from the expanded run_list and the dependencies declared by cookbooks’ metadata. See #cookbook_order for more information.



69
70
71
72
73
74
75
# File 'lib/chef/run_context/cookbook_compiler.rb', line 69

def compile
  compile_libraries
  compile_attributes
  compile_lwrps
  compile_resource_definitions
  compile_recipes
end

#compile_attributesObject

Loads attributes files from cookbooks. Attributes files are loaded according to #cookbook_order; within a cookbook, default.rb is loaded first, then the remaining attributes files in lexical sort order.



106
107
108
109
110
111
112
# File 'lib/chef/run_context/cookbook_compiler.rb', line 106

def compile_attributes
  @events.attribute_load_start(count_files_by_segment(:attributes))
  cookbook_order.each do |cookbook|
    load_attributes_from_cookbook(cookbook)
  end
  @events.attribute_load_complete
end

#compile_librariesObject

Loads library files from cookbooks according to #cookbook_order.



95
96
97
98
99
100
101
# File 'lib/chef/run_context/cookbook_compiler.rb', line 95

def compile_libraries
  @events.library_load_start(count_files_by_segment(:libraries))
  cookbook_order.each do |cookbook|
    load_libraries_from_cookbook(cookbook)
  end
  @events.library_load_complete
end

#compile_lwrpsObject

Loads LWRPs according to #cookbook_order. Providers are loaded before resources on a cookbook-wise basis.



116
117
118
119
120
121
122
123
# File 'lib/chef/run_context/cookbook_compiler.rb', line 116

def compile_lwrps
  lwrp_file_count = count_files_by_segment(:providers) + count_files_by_segment(:resources)
  @events.lwrp_load_start(lwrp_file_count)
  cookbook_order.each do |cookbook|
    load_lwrps_from_cookbook(cookbook)
  end
  @events.lwrp_load_complete
end

#compile_recipesObject

Iterates over the expanded run_list, loading each recipe in turn.



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/chef/run_context/cookbook_compiler.rb', line 135

def compile_recipes
  @events.recipe_load_start(run_list_expansion.recipes.size)
  run_list_expansion.recipes.each do |recipe|
    begin
      @run_context.load_recipe(recipe)
    rescue Chef::Exceptions::RecipeNotFound => e
      @events.recipe_not_found(e)
      raise
    rescue Exception => e
      path = resolve_recipe(recipe)
      @events.recipe_file_load_failed(path, e)
      raise
    end
  end
  @events.recipe_load_complete
end

#compile_resource_definitionsObject

Loads resource definitions according to #cookbook_order



126
127
128
129
130
131
132
# File 'lib/chef/run_context/cookbook_compiler.rb', line 126

def compile_resource_definitions
  @events.definition_load_start(count_files_by_segment(:definitions))
  cookbook_order.each do |cookbook|
    load_resource_definitions_from_cookbook(cookbook)
  end
  @events.definition_load_complete
end

#cookbook_collectionObject

Chef::CookbookCollection object for the current run



47
48
49
# File 'lib/chef/run_context/cookbook_compiler.rb', line 47

def cookbook_collection
  @run_context.cookbook_collection
end

#cookbook_orderObject

Extracts the cookbook names from the expanded run list, then iterates over the list, recursing through dependencies to give a run_list ordered array of cookbook names with no duplicates. Dependencies appear before the cookbook(s) that depend on them.



81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/chef/run_context/cookbook_compiler.rb', line 81

def cookbook_order
  @cookbook_order ||= begin
    ordered_cookbooks = []
    seen_cookbooks = {}
    run_list_expansion.recipes.each do |recipe|
      cookbook = Chef::Recipe.parse_recipe_name(recipe).first
      add_cookbook_with_deps(ordered_cookbooks, seen_cookbooks, cookbook)
    end
    Chef::Log.debug("Cookbooks to compile: #{ordered_cookbooks.inspect}")
    ordered_cookbooks
  end
end

#definitionsObject

Resource Definitions from the compiled cookbooks. This is populated by calling #compile_resource_definitions (which is called by #compile)



53
54
55
# File 'lib/chef/run_context/cookbook_compiler.rb', line 53

def definitions
  @run_context.definitions
end

#nodeObject

Chef::Node object for the current run.



42
43
44
# File 'lib/chef/run_context/cookbook_compiler.rb', line 42

def node
  @run_context.node
end