Class: ChefDK::PolicyfileCompiler
- Inherits:
-
Object
- Object
- ChefDK::PolicyfileCompiler
- Extended by:
- Forwardable
- Defined in:
- lib/chef-dk/policyfile_compiler.rb
Constant Summary collapse
- DEFAULT_DEMAND_CONSTRAINT =
'>= 0.0.0'.freeze
- SOURCE_TYPES_WITH_FIXED_VERSIONS =
Cookbooks from these sources lock that cookbook to exactly one version
[:git, :path].freeze
Instance Attribute Summary collapse
-
#dsl ⇒ Object
readonly
Returns the value of attribute dsl.
-
#install_report ⇒ Object
readonly
Returns the value of attribute install_report.
-
#storage_config ⇒ Object
readonly
Returns the value of attribute storage_config.
Class Method Summary collapse
Instance Method Summary collapse
- #all_cookbook_location_specs ⇒ Object
- #artifacts_graph ⇒ Object
- #build {|@dsl| ... } ⇒ Object
- #cookbook_location_spec_for(cookbook_name) ⇒ Object
- #cookbook_version_fixed?(cookbook_name) ⇒ Boolean
- #cookbooks_in_run_list ⇒ Object
- #create_spec_for_cookbook(cookbook_name, version) ⇒ Object
- #default_attributes ⇒ Object
- #error! ⇒ Object
- #evaluate_policyfile(policyfile_string, policyfile_filename) ⇒ Object
- #expanded_named_run_lists ⇒ Object
- #expanded_run_list ⇒ Object
- #fixed_version_cookbooks_specs ⇒ Object
- #graph ⇒ Object
- #graph_demands ⇒ Object
-
#graph_solution ⇒ Object
Compilation Methods.
-
#initialize(ui: nil) ⇒ PolicyfileCompiler
constructor
A new instance of PolicyfileCompiler.
- #install ⇒ Object
-
#local_artifacts_graph ⇒ Object
Gives a dependency graph for cookbooks that are source from an alternate location.
- #lock ⇒ Object
- #normalized_named_run_lists ⇒ Object
-
#normalized_run_list ⇒ Object
copy of the expanded_run_list, properly formatted for use in a lockfile.
- #override_attributes ⇒ Object
- #remote_artifacts_graph ⇒ Object
- #solution_dependencies ⇒ Object
- #version_constraint_for(cookbook_name) ⇒ Object
Constructor Details
#initialize(ui: nil) ⇒ PolicyfileCompiler
Returns a new instance of PolicyfileCompiler.
58 59 60 61 62 63 64 65 66 67 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 58 def initialize(ui: nil) @storage_config = Policyfile::StorageConfig.new @dsl = Policyfile::DSL.new(storage_config) @artifact_server_cookbook_location_specs = {} @merged_graph = nil @ui = ui || UI.null @install_report = Policyfile::Reports::Install.new(ui: @ui, policyfile_compiler: self) end |
Instance Attribute Details
#dsl ⇒ Object (readonly)
Returns the value of attribute dsl.
54 55 56 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 54 def dsl @dsl end |
#install_report ⇒ Object (readonly)
Returns the value of attribute install_report.
56 57 58 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 56 def install_report @install_report end |
#storage_config ⇒ Object (readonly)
Returns the value of attribute storage_config.
55 56 57 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 55 def storage_config @storage_config end |
Class Method Details
.evaluate(policyfile_string, policyfile_filename, ui: nil) ⇒ Object
40 41 42 43 44 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 40 def self.evaluate(policyfile_string, policyfile_filename, ui: nil) compiler = new(ui: ui) compiler.evaluate_policyfile(policyfile_string, policyfile_filename) compiler end |
Instance Method Details
#all_cookbook_location_specs ⇒ Object
138 139 140 141 142 143 144 145 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 138 def all_cookbook_location_specs # in the installation proces, we create "artifact_server_cookbook_location_specs" # for any cookbook that isn't sourced from a single-version source (e.g., # path and git only support one version at a time), but we might have # specs for them to track additional version constraint demands. Merging # in this order ensures the artifact_server_cookbook_location_specs "win". cookbook_location_specs.merge(@artifact_server_cookbook_location_specs) end |
#artifacts_graph ⇒ Object
197 198 199 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 197 def artifacts_graph remote_artifacts_graph.merge(local_artifacts_graph) end |
#build {|@dsl| ... } ⇒ Object
259 260 261 262 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 259 def build yield @dsl self end |
#cookbook_location_spec_for(cookbook_name) ⇒ Object
75 76 77 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 75 def cookbook_location_spec_for(cookbook_name) cookbook_location_specs[cookbook_name] end |
#cookbook_version_fixed?(cookbook_name) ⇒ Boolean
242 243 244 245 246 247 248 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 242 def cookbook_version_fixed?(cookbook_name) if cookbook_location_spec = cookbook_location_spec_for(cookbook_name) cookbook_location_spec.version_fixed? else false end end |
#cookbooks_in_run_list ⇒ Object
250 251 252 253 254 255 256 257 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 250 def cookbooks_in_run_list combined_run_lists = .values.inject(.to_a) do |accum_run_lists, run_list| accum_run_lists |= run_list.to_a end recipes = combined_run_lists.map {|recipe| recipe.name } recipes.map { |r| r[/^([^:]+)/, 1] } end |
#create_spec_for_cookbook(cookbook_name, version) ⇒ Object
128 129 130 131 132 133 134 135 136 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 128 def create_spec_for_cookbook(cookbook_name, version) matching_source = default_source.find { |s| s.universe_graph.has_key?(cookbook_name) } = matching_source.(cookbook_name, version) spec = Policyfile::CookbookLocationSpecification.new(cookbook_name, "= #{version}", , storage_config) @artifact_server_cookbook_location_specs[cookbook_name] = spec end |
#default_attributes ⇒ Object
103 104 105 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 103 def default_attributes dsl.node_attributes.combined_default.to_hash end |
#error! ⇒ Object
69 70 71 72 73 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 69 def error! unless errors.empty? raise PolicyfileError, errors.join("\n") end end |
#evaluate_policyfile(policyfile_string, policyfile_filename) ⇒ Object
264 265 266 267 268 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 264 def evaluate_policyfile(policyfile_string, policyfile_filename) storage_config.use_policyfile(policyfile_filename) @dsl.eval_policyfile(policyfile_string) self end |
#expanded_named_run_lists ⇒ Object
89 90 91 92 93 94 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 89 def named_run_lists.inject({}) do |, (name, run_list_items)| [name] = Chef::RunList.new(*run_list_items) end end |
#expanded_run_list ⇒ Object
79 80 81 82 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 79 def # doesn't support roles yet... Chef::RunList.new(*run_list) end |
#fixed_version_cookbooks_specs ⇒ Object
270 271 272 273 274 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 270 def fixed_version_cookbooks_specs @fixed_version_cookbooks_specs ||= cookbook_location_specs.select do |_cookbook_name, cookbook_location_spec| cookbook_location_spec.version_fixed? end end |
#graph ⇒ Object
157 158 159 160 161 162 163 164 165 166 167 168 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 157 def graph @graph ||= Solve::Graph.new.tap do |g| artifacts_graph.each do |name, dependencies_by_version| dependencies_by_version.each do |version, dependencies| artifact = g.artifact(name, version) dependencies.each do |dep_name, constraint| artifact.dependency(dep_name, constraint) end end end end end |
#graph_demands ⇒ Object
184 185 186 187 188 189 190 191 192 193 194 195 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 184 def graph_demands cookbooks_for_demands.map do |cookbook_name| spec = cookbook_location_spec_for(cookbook_name) if spec.nil? [ cookbook_name, DEFAULT_DEMAND_CONSTRAINT ] elsif spec.version_fixed? [ cookbook_name, "= #{spec.version}" ] else [ cookbook_name, spec.version_constraint.to_s ] end end end |
#graph_solution ⇒ Object
Compilation Methods
151 152 153 154 155 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 151 def graph_solution return @solution if @solution cache_fixed_version_cookbooks @solution = Solve.it!(graph, graph_demands) end |
#install ⇒ Object
115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 115 def install ensure_cache_dir_exists graph_solution.each do |cookbook_name, version| spec = cookbook_location_spec_for(cookbook_name) if spec.nil? or !spec.version_fixed? spec = create_spec_for_cookbook(cookbook_name, version) install_report.installing_cookbook(spec) spec.ensure_cached end end end |
#local_artifacts_graph ⇒ Object
Gives a dependency graph for cookbooks that are source from an alternate location. These cookbooks could have a different set of dependencies compared to an unmodified copy upstream. For example, the community site may have a cookbook “apache2” at version “1.10.4”, which the user has forked on github and modified the dependencies without changing the version number. To accomodate this, the local_artifacts_graph should be merged over the upstream’s artifacts graph.
208 209 210 211 212 213 214 215 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 208 def local_artifacts_graph cookbook_location_specs.inject({}) do |local_artifacts, (cookbook_name, cookbook_location_spec)| if cookbook_location_spec.version_fixed? local_artifacts[cookbook_name] = { cookbook_location_spec.version => cookbook_location_spec.dependencies } end local_artifacts end end |
#lock ⇒ Object
111 112 113 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 111 def lock @policyfile_lock ||= PolicyfileLock.build_from_compiler(self, storage_config) end |
#normalized_named_run_lists ⇒ Object
96 97 98 99 100 101 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 96 def normalized_named_run_lists .inject({}) do |normalized,(name, run_list)| normalized[name] = run_list.map { |i| normalize_recipe(i) } normalized end end |
#normalized_run_list ⇒ Object
copy of the expanded_run_list, properly formatted for use in a lockfile
85 86 87 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 85 def normalized_run_list .map { |i| normalize_recipe(i) } end |
#override_attributes ⇒ Object
107 108 109 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 107 def override_attributes dsl.node_attributes.combined_override.to_hash end |
#remote_artifacts_graph ⇒ Object
217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 217 def remote_artifacts_graph @merged_graph ||= begin conflicting_cb_names = [] merged = {} default_source.each do |source| merged.merge!(source.universe_graph) do |conflicting_cb_name, _old, _new| conflicting_cb_names << conflicting_cb_name end end handle_conflicting_cookbooks(conflicting_cb_names) merged end end |
#solution_dependencies ⇒ Object
170 171 172 173 174 175 176 177 178 179 180 181 182 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 170 def solution_dependencies solution_deps = Policyfile::SolutionDependencies.new all_cookbook_location_specs.each do |name, spec| solution_deps.add_policyfile_dep(name, spec.version_constraint) end graph_solution.each do |name, version| transitive_deps = artifacts_graph[name][version] solution_deps.add_cookbook_dep(name, version, transitive_deps) end solution_deps end |
#version_constraint_for(cookbook_name) ⇒ Object
233 234 235 236 237 238 239 240 |
# File 'lib/chef-dk/policyfile_compiler.rb', line 233 def version_constraint_for(cookbook_name) if (cookbook_location_spec = cookbook_location_spec_for(cookbook_name)) and cookbook_location_spec.version_fixed? version = cookbook_location_spec.version "= #{version}" else DEFAULT_DEMAND_CONSTRAINT end end |