Class: ChefDK::PolicyfileLock
- Inherits:
-
Object
- Object
- ChefDK::PolicyfileLock
- Defined in:
- lib/chef-dk/policyfile_lock.rb
Defined Under Namespace
Classes: InstallReport
Constant Summary collapse
- RUN_LIST_ITEM_FORMAT =
/\Arecipe\[[^\s]+::[^\s]+\]\Z/.freeze
Instance Attribute Summary collapse
-
#cookbook_locks ⇒ Object
readonly
Returns the value of attribute cookbook_locks.
-
#default_attributes ⇒ Object
Returns the value of attribute default_attributes.
-
#install_report ⇒ Object
readonly
Returns the value of attribute install_report.
-
#name ⇒ Object
Returns the value of attribute name.
-
#named_run_lists ⇒ Object
Returns the value of attribute named_run_lists.
-
#override_attributes ⇒ Object
Returns the value of attribute override_attributes.
-
#run_list ⇒ Object
Returns the value of attribute run_list.
-
#solution_dependencies ⇒ Object
readonly
Returns the value of attribute solution_dependencies.
-
#storage_config ⇒ Object
readonly
Returns the value of attribute storage_config.
Class Method Summary collapse
- .build(storage_config) {|lock| ... } ⇒ Object
- .build_from_compiler(compiler, storage_config) ⇒ Object
Instance Method Summary collapse
- #build_from_archive(lock_data) ⇒ Object
- #build_from_compiler(compiler) ⇒ Object
- #build_from_lock_data(lock_data) ⇒ Object
- #cached_cookbook(name) {|cached_cookbook| ... } ⇒ Object
-
#canonical_revision_string ⇒ Object
Generates a string representation of the lock data in a specialized format suitable for generating a checksum of the lock itself.
- #cookbook_locks_for_lockfile ⇒ Object
- #dependencies {|solution_dependencies| ... } ⇒ Object
- #ensure_cache_dir_exists ⇒ Object
-
#initialize(storage_config, ui: nil) ⇒ PolicyfileLock
constructor
A new instance of PolicyfileLock.
- #install_cookbooks ⇒ Object
- #local_cookbook(name) {|local_cookbook| ... } ⇒ Object
- #lock_data_for(cookbook_name) ⇒ Object
-
#revision_id ⇒ Object
Returns a fingerprint of the PolicyfileLock by computing the SHA1 hash of #canonical_revision_string.
- #to_lock ⇒ Object
- #validate_cookbooks! ⇒ Object
Methods included from ChefDK::Policyfile::StorageConfigDelegation
#cache_path, #policyfile_expanded_path, #policyfile_filename, #policyfile_lock_expanded_path, #relative_paths_root
Constructor Details
#initialize(storage_config, ui: nil) ⇒ PolicyfileLock
Returns a new instance of PolicyfileLock.
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/chef-dk/policyfile_lock.rb', line 98 def initialize(storage_config, ui: nil) @name = nil @run_list = [] @named_run_lists = {} @cookbook_locks = {} @relative_paths_root = Dir.pwd @storage_config = storage_config @ui = ui || UI.null @default_attributes = {} @override_attributes = {} @solution_dependencies = Policyfile::SolutionDependencies.new @install_report = InstallReport.new(ui: @ui, policyfile_lock: self) end |
Instance Attribute Details
#cookbook_locks ⇒ Object (readonly)
Returns the value of attribute cookbook_locks.
94 95 96 |
# File 'lib/chef-dk/policyfile_lock.rb', line 94 def cookbook_locks @cookbook_locks end |
#default_attributes ⇒ Object
Returns the value of attribute default_attributes.
87 88 89 |
# File 'lib/chef-dk/policyfile_lock.rb', line 87 def default_attributes @default_attributes end |
#install_report ⇒ Object (readonly)
Returns the value of attribute install_report.
96 97 98 |
# File 'lib/chef-dk/policyfile_lock.rb', line 96 def install_report @install_report end |
#name ⇒ Object
Returns the value of attribute name.
84 85 86 |
# File 'lib/chef-dk/policyfile_lock.rb', line 84 def name @name end |
#named_run_lists ⇒ Object
Returns the value of attribute named_run_lists.
86 87 88 |
# File 'lib/chef-dk/policyfile_lock.rb', line 86 def named_run_lists @named_run_lists end |
#override_attributes ⇒ Object
Returns the value of attribute override_attributes.
88 89 90 |
# File 'lib/chef-dk/policyfile_lock.rb', line 88 def override_attributes @override_attributes end |
#run_list ⇒ Object
Returns the value of attribute run_list.
85 86 87 |
# File 'lib/chef-dk/policyfile_lock.rb', line 85 def run_list @run_list end |
#solution_dependencies ⇒ Object (readonly)
Returns the value of attribute solution_dependencies.
90 91 92 |
# File 'lib/chef-dk/policyfile_lock.rb', line 90 def solution_dependencies @solution_dependencies end |
#storage_config ⇒ Object (readonly)
Returns the value of attribute storage_config.
92 93 94 |
# File 'lib/chef-dk/policyfile_lock.rb', line 92 def storage_config @storage_config end |
Class Method Details
.build(storage_config) {|lock| ... } ⇒ Object
70 71 72 73 74 |
# File 'lib/chef-dk/policyfile_lock.rb', line 70 def self.build(storage_config) lock = new(storage_config) yield lock lock end |
.build_from_compiler(compiler, storage_config) ⇒ Object
76 77 78 79 80 |
# File 'lib/chef-dk/policyfile_lock.rb', line 76 def self.build_from_compiler(compiler, storage_config) lock = new(storage_config) lock.build_from_compiler(compiler) lock end |
Instance Method Details
#build_from_archive(lock_data) ⇒ Object
265 266 267 268 269 270 271 272 273 |
# File 'lib/chef-dk/policyfile_lock.rb', line 265 def build_from_archive(lock_data) set_name_from_lock_data(lock_data) set_run_list_from_lock_data(lock_data) set_named_run_lists_from_lock_data(lock_data) set_cookbook_locks_as_archives_from_lock_data(lock_data) set_attributes_from_lock_data(lock_data) set_solution_dependencies_from_lock_data(lock_data) self end |
#build_from_compiler(compiler) ⇒ Object
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 |
# File 'lib/chef-dk/policyfile_lock.rb', line 225 def build_from_compiler(compiler) @name = compiler.name @run_list = compiler.normalized_run_list @named_run_lists = compiler.normalized_named_run_lists compiler.all_cookbook_location_specs.each do |cookbook_name, spec| if spec.mirrors_canonical_upstream? cached_cookbook(cookbook_name) do |cached_cb| cached_cb.cache_key = spec.cache_key cached_cb.origin = spec.uri cached_cb. = spec. end else local_cookbook(cookbook_name) do |local_cb| local_cb.source = spec.relative_path local_cb. = spec. end end end @default_attributes = compiler.default_attributes @override_attributes = compiler.override_attributes @solution_dependencies = compiler.solution_dependencies self end |
#build_from_lock_data(lock_data) ⇒ Object
255 256 257 258 259 260 261 262 263 |
# File 'lib/chef-dk/policyfile_lock.rb', line 255 def build_from_lock_data(lock_data) set_name_from_lock_data(lock_data) set_run_list_from_lock_data(lock_data) set_named_run_lists_from_lock_data(lock_data) set_cookbook_locks_from_lock_data(lock_data) set_attributes_from_lock_data(lock_data) set_solution_dependencies_from_lock_data(lock_data) self end |
#cached_cookbook(name) {|cached_cookbook| ... } ⇒ Object
118 119 120 121 122 |
# File 'lib/chef-dk/policyfile_lock.rb', line 118 def cached_cookbook(name) cached_cookbook = Policyfile::CachedCookbook.new(name, storage_config) yield cached_cookbook if block_given? @cookbook_locks[name] = cached_cookbook end |
#canonical_revision_string ⇒ Object
Generates a string representation of the lock data in a specialized format suitable for generating a checksum of the lock itself. Only data that modifies the behavior of a chef-client using the lockfile is included in this format; for example, a modification to the source options in a ‘Policyfile.rb` that yields identical code (such as switching to a github fork at the same revision) will not cause a change in the PolicyfileLock’s canonical_revision_string.
This format is intended to be used only for generating an identifier for a particular revision of a PolicyfileLock. It should not be used as a serialization format, and is not guaranteed to be a stable interface.
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
# File 'lib/chef-dk/policyfile_lock.rb', line 164 def canonical_revision_string canonical_rev_text = "" canonical_rev_text << "name:#{name}\n" run_list.each do |item| canonical_rev_text << "run-list-item:#{item}\n" end named_run_lists.each do |name, run_list| run_list.each do |item| canonical_rev_text << "named-run-list:#{name};run-list-item:#{item}\n" end end cookbook_locks_for_lockfile.each do |name, lock| canonical_rev_text << "cookbook:#{name};id:#{lock["identifier"]}\n" end canonical_rev_text << "default_attributes:#{canonicalize(default_attributes)}\n" canonical_rev_text << "override_attributes:#{canonicalize(override_attributes)}\n" canonical_rev_text end |
#cookbook_locks_for_lockfile ⇒ Object
190 191 192 193 194 195 196 197 |
# File 'lib/chef-dk/policyfile_lock.rb', line 190 def cookbook_locks_for_lockfile cookbook_locks.inject({}) do |locks_map, (name, location_spec)| location_spec.validate! location_spec.gather_profile_data locks_map[name] = location_spec.to_lock locks_map end end |
#dependencies {|solution_dependencies| ... } ⇒ Object
130 131 132 |
# File 'lib/chef-dk/policyfile_lock.rb', line 130 def dependencies yield solution_dependencies end |
#ensure_cache_dir_exists ⇒ Object
285 286 287 288 289 290 |
# File 'lib/chef-dk/policyfile_lock.rb', line 285 def ensure_cache_dir_exists # note: duplicates PolicyfileCompiler#ensure_cache_dir_exists unless File.exist?(cache_path) FileUtils.mkdir_p(cache_path) end end |
#install_cookbooks ⇒ Object
275 276 277 278 279 280 281 282 283 |
# File 'lib/chef-dk/policyfile_lock.rb', line 275 def install_cookbooks # note: duplicates PolicyfileCompiler#ensure_cache_dir_exists ensure_cache_dir_exists cookbook_locks.each do |cookbook_name, cookbook_lock| install_report.installing_cookbook(cookbook_lock) cookbook_lock.install_locked end end |
#local_cookbook(name) {|local_cookbook| ... } ⇒ Object
124 125 126 127 128 |
# File 'lib/chef-dk/policyfile_lock.rb', line 124 def local_cookbook(name) local_cookbook = Policyfile::LocalCookbook.new(name, storage_config) yield local_cookbook if block_given? @cookbook_locks[name] = local_cookbook end |
#lock_data_for(cookbook_name) ⇒ Object
114 115 116 |
# File 'lib/chef-dk/policyfile_lock.rb', line 114 def lock_data_for(cookbook_name) @cookbook_locks[cookbook_name] end |
#revision_id ⇒ Object
Returns a fingerprint of the PolicyfileLock by computing the SHA1 hash of #canonical_revision_string
149 150 151 |
# File 'lib/chef-dk/policyfile_lock.rb', line 149 def revision_id Digest::SHA256.new.hexdigest(canonical_revision_string) end |
#to_lock ⇒ Object
134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/chef-dk/policyfile_lock.rb', line 134 def to_lock {}.tap do |lock| lock["revision_id"] = revision_id lock["name"] = name lock["run_list"] = run_list lock["named_run_lists"] = named_run_lists unless named_run_lists.empty? lock["cookbook_locks"] = cookbook_locks_for_lockfile lock["default_attributes"] = default_attributes lock["override_attributes"] = override_attributes lock["solution_dependencies"] = solution_dependencies.to_lock end end |
#validate_cookbooks! ⇒ Object
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 |
# File 'lib/chef-dk/policyfile_lock.rb', line 199 def validate_cookbooks! cookbook_locks.each do |name, cookbook_lock| cookbook_lock.validate! cookbook_lock.refresh! end # Check that versions and dependencies are still valid. First we need to # refresh the dependency info for everything that has changed, then we # check that the new versions and dependencies are valid for the working # set of cookbooks. We can't do this in a single loop because the user # may have modified two cookbooks such that the versions and constraints # are only valid when both changes are considered together. cookbook_locks.each do |name, cookbook_lock| if cookbook_lock.updated? solution_dependencies.update_cookbook_dep(name, cookbook_lock.version, cookbook_lock.dependencies) end end cookbook_locks.each do |name, cookbook_lock| if cookbook_lock.updated? solution_dependencies.test_conflict!(cookbook_lock.name, cookbook_lock.version) end end true end |