chef-dk 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +190 -190
  3. data/Gemfile +26 -26
  4. data/LICENSE +201 -201
  5. data/README.md +292 -276
  6. data/Rakefile +18 -18
  7. data/bin/chef +25 -25
  8. data/chef-dk.gemspec +62 -0
  9. data/lib/chef-dk.rb +19 -19
  10. data/lib/chef-dk/authenticated_http.rb +40 -40
  11. data/lib/chef-dk/builtin_commands.rb +60 -60
  12. data/lib/chef-dk/chef_runner.rb +98 -98
  13. data/lib/chef-dk/cli.rb +200 -200
  14. data/lib/chef-dk/command/base.rb +79 -79
  15. data/lib/chef-dk/command/clean_policy_cookbooks.rb +116 -116
  16. data/lib/chef-dk/command/clean_policy_revisions.rb +113 -113
  17. data/lib/chef-dk/command/delete_policy.rb +122 -122
  18. data/lib/chef-dk/command/delete_policy_group.rb +122 -122
  19. data/lib/chef-dk/command/diff.rb +316 -316
  20. data/lib/chef-dk/command/env.rb +90 -90
  21. data/lib/chef-dk/command/exec.rb +45 -45
  22. data/lib/chef-dk/command/export.rb +151 -151
  23. data/lib/chef-dk/command/gem.rb +47 -47
  24. data/lib/chef-dk/command/generate.rb +120 -120
  25. data/lib/chef-dk/command/generator_commands.rb +80 -80
  26. data/lib/chef-dk/command/generator_commands/app.rb +107 -107
  27. data/lib/chef-dk/command/generator_commands/attribute.rb +37 -37
  28. data/lib/chef-dk/command/generator_commands/base.rb +121 -121
  29. data/lib/chef-dk/command/generator_commands/cookbook.rb +153 -119
  30. data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +100 -100
  31. data/lib/chef-dk/command/generator_commands/cookbook_file.rb +45 -45
  32. data/lib/chef-dk/command/generator_commands/generator_generator.rb +177 -177
  33. data/lib/chef-dk/command/generator_commands/lwrp.rb +36 -36
  34. data/lib/chef-dk/command/generator_commands/policyfile.rb +127 -86
  35. data/lib/chef-dk/command/generator_commands/recipe.rb +36 -36
  36. data/lib/chef-dk/command/generator_commands/repo.rb +125 -96
  37. data/lib/chef-dk/command/generator_commands/template.rb +46 -46
  38. data/lib/chef-dk/command/install.rb +121 -121
  39. data/lib/chef-dk/command/provision.rb +438 -438
  40. data/lib/chef-dk/command/push.rb +118 -118
  41. data/lib/chef-dk/command/push_archive.rb +126 -126
  42. data/lib/chef-dk/command/shell_init.rb +180 -180
  43. data/lib/chef-dk/command/show_policy.rb +165 -165
  44. data/lib/chef-dk/command/undelete.rb +155 -155
  45. data/lib/chef-dk/command/update.rb +129 -129
  46. data/lib/chef-dk/command/verify.rb +534 -490
  47. data/lib/chef-dk/commands_map.rb +115 -115
  48. data/lib/chef-dk/completions/bash.sh.erb +5 -5
  49. data/lib/chef-dk/completions/chef.fish.erb +10 -10
  50. data/lib/chef-dk/completions/zsh.zsh.erb +21 -21
  51. data/lib/chef-dk/component_test.rb +173 -171
  52. data/lib/chef-dk/configurable.rb +57 -57
  53. data/lib/chef-dk/cookbook_metadata.rb +45 -45
  54. data/lib/chef-dk/cookbook_omnifetch.rb +32 -32
  55. data/lib/chef-dk/cookbook_profiler/git.rb +151 -151
  56. data/lib/chef-dk/cookbook_profiler/identifiers.rb +72 -72
  57. data/lib/chef-dk/cookbook_profiler/null_scm.rb +32 -32
  58. data/lib/chef-dk/exceptions.rb +126 -113
  59. data/lib/chef-dk/generator.rb +163 -163
  60. data/lib/chef-dk/helpers.rb +159 -159
  61. data/lib/chef-dk/pager.rb +106 -106
  62. data/lib/chef-dk/policyfile/chef_repo_cookbook_source.rb +138 -122
  63. data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +54 -54
  64. data/lib/chef-dk/policyfile/community_cookbook_source.rb +97 -82
  65. data/lib/chef-dk/policyfile/comparison_base.rb +124 -124
  66. data/lib/chef-dk/policyfile/cookbook_location_specification.rb +141 -133
  67. data/lib/chef-dk/policyfile/cookbook_locks.rb +466 -466
  68. data/lib/chef-dk/policyfile/cookbook_sources.rb +22 -21
  69. data/lib/chef-dk/policyfile/delivery_supermarket_source.rb +90 -0
  70. data/lib/chef-dk/policyfile/differ.rb +266 -266
  71. data/lib/chef-dk/policyfile/dsl.rb +223 -197
  72. data/lib/chef-dk/policyfile/lister.rb +232 -232
  73. data/lib/chef-dk/policyfile/null_cookbook_source.rb +45 -45
  74. data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -124
  75. data/lib/chef-dk/policyfile/reports/install.rb +70 -70
  76. data/lib/chef-dk/policyfile/reports/table_printer.rb +58 -58
  77. data/lib/chef-dk/policyfile/reports/upload.rb +70 -70
  78. data/lib/chef-dk/policyfile/solution_dependencies.rb +298 -298
  79. data/lib/chef-dk/policyfile/storage_config.rb +100 -100
  80. data/lib/chef-dk/policyfile/undo_record.rb +142 -142
  81. data/lib/chef-dk/policyfile/undo_stack.rb +130 -130
  82. data/lib/chef-dk/policyfile/uploader.rb +213 -213
  83. data/lib/chef-dk/policyfile_compiler.rb +380 -322
  84. data/lib/chef-dk/policyfile_lock.rb +552 -552
  85. data/lib/chef-dk/policyfile_services/clean_policies.rb +95 -95
  86. data/lib/chef-dk/policyfile_services/clean_policy_cookbooks.rb +125 -125
  87. data/lib/chef-dk/policyfile_services/export_repo.rb +309 -309
  88. data/lib/chef-dk/policyfile_services/install.rb +125 -125
  89. data/lib/chef-dk/policyfile_services/push.rb +114 -114
  90. data/lib/chef-dk/policyfile_services/push_archive.rb +173 -173
  91. data/lib/chef-dk/policyfile_services/rm_policy.rb +142 -142
  92. data/lib/chef-dk/policyfile_services/rm_policy_group.rb +86 -86
  93. data/lib/chef-dk/policyfile_services/show_policy.rb +237 -237
  94. data/lib/chef-dk/policyfile_services/undelete.rb +108 -108
  95. data/lib/chef-dk/policyfile_services/update_attributes.rb +104 -104
  96. data/lib/chef-dk/service_exception_inspectors.rb +25 -25
  97. data/lib/chef-dk/service_exception_inspectors/base.rb +40 -40
  98. data/lib/chef-dk/service_exception_inspectors/http.rb +121 -121
  99. data/lib/chef-dk/service_exceptions.rb +143 -143
  100. data/lib/chef-dk/shell_out.rb +36 -36
  101. data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +3 -3
  102. data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +100 -100
  103. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -9
  104. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README.md +54 -54
  105. data/lib/chef-dk/skeletons/code_generator/files/default/gitignore +16 -16
  106. data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +28 -28
  107. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -27
  108. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -7
  109. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +3 -3
  110. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -8
  111. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +58 -58
  112. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +3 -3
  113. data/lib/chef-dk/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -0
  114. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +9 -9
  115. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/example.json +12 -12
  116. data/lib/chef-dk/skeletons/code_generator/files/default/repo/policies/README.md +24 -0
  117. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +9 -9
  118. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/example.json +12 -12
  119. data/lib/chef-dk/skeletons/code_generator/files/default/serverspec_spec_helper.rb +8 -8
  120. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +2 -2
  121. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper_policyfile.rb +2 -0
  122. data/lib/chef-dk/skeletons/code_generator/metadata.rb +8 -8
  123. data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +97 -97
  124. data/lib/chef-dk/skeletons/code_generator/recipes/attribute.rb +12 -12
  125. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +117 -104
  126. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook_file.rb +24 -24
  127. data/lib/chef-dk/skeletons/code_generator/recipes/lwrp.rb +23 -23
  128. data/lib/chef-dk/skeletons/code_generator/recipes/policyfile.rb +8 -8
  129. data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +27 -27
  130. data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +67 -48
  131. data/lib/chef-dk/skeletons/code_generator/recipes/template.rb +32 -32
  132. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -3
  133. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.apache2.erb +201 -201
  134. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -339
  135. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -674
  136. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -21
  137. data/lib/chef-dk/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -20
  138. data/lib/chef-dk/skeletons/code_generator/templates/default/README.md.erb +4 -4
  139. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen.yml.erb +21 -16
  140. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +32 -27
  141. data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +7 -7
  142. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +5 -5
  143. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe_spec.rb.erb +20 -20
  144. data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +11 -11
  145. data/lib/chef-dk/skeletons/code_generator/templates/default/serverspec_default_spec.rb.erb +9 -9
  146. data/lib/chef-dk/ui.rb +58 -58
  147. data/lib/chef-dk/version.rb +20 -20
  148. data/lib/kitchen/provisioner/policyfile_zero.rb +189 -193
  149. data/spec/shared/a_file_generator.rb +125 -125
  150. data/spec/shared/a_generated_file.rb +12 -12
  151. data/spec/shared/command_with_ui_object.rb +11 -11
  152. data/spec/shared/custom_generator_cookbook.rb +117 -117
  153. data/spec/shared/fixture_cookbook_checksums.rb +47 -47
  154. data/spec/shared/setup_git_cookbooks.rb +53 -53
  155. data/spec/spec_helper.rb +50 -49
  156. data/spec/test_helpers.rb +84 -84
  157. data/spec/unit/chef_runner_spec.rb +111 -111
  158. data/spec/unit/cli_spec.rb +357 -357
  159. data/spec/unit/command/base_spec.rb +169 -169
  160. data/spec/unit/command/clean_policy_cookbooks_spec.rb +181 -181
  161. data/spec/unit/command/clean_policy_revisions_spec.rb +181 -181
  162. data/spec/unit/command/delete_policy_group_spec.rb +207 -207
  163. data/spec/unit/command/delete_policy_spec.rb +207 -207
  164. data/spec/unit/command/diff_spec.rb +312 -312
  165. data/spec/unit/command/env_spec.rb +52 -52
  166. data/spec/unit/command/exec_spec.rb +179 -179
  167. data/spec/unit/command/export_spec.rb +189 -189
  168. data/spec/unit/command/generate_spec.rb +142 -142
  169. data/spec/unit/command/generator_commands/app_spec.rb +169 -169
  170. data/spec/unit/command/generator_commands/attribute_spec.rb +32 -32
  171. data/spec/unit/command/generator_commands/cookbook_file_spec.rb +32 -32
  172. data/spec/unit/command/generator_commands/cookbook_spec.rb +450 -320
  173. data/spec/unit/command/generator_commands/generator_generator_spec.rb +229 -229
  174. data/spec/unit/command/generator_commands/lwrp_spec.rb +32 -32
  175. data/spec/unit/command/generator_commands/policyfile_spec.rb +225 -125
  176. data/spec/unit/command/generator_commands/recipe_spec.rb +34 -34
  177. data/spec/unit/command/generator_commands/repo_spec.rb +367 -283
  178. data/spec/unit/command/generator_commands/template_spec.rb +32 -32
  179. data/spec/unit/command/install_spec.rb +179 -179
  180. data/spec/unit/command/provision_spec.rb +592 -592
  181. data/spec/unit/command/push_archive_spec.rb +153 -153
  182. data/spec/unit/command/push_spec.rb +199 -199
  183. data/spec/unit/command/shell_init_spec.rb +329 -329
  184. data/spec/unit/command/show_policy_spec.rb +235 -235
  185. data/spec/unit/command/undelete_spec.rb +246 -246
  186. data/spec/unit/command/update_spec.rb +251 -251
  187. data/spec/unit/command/verify_spec.rb +325 -323
  188. data/spec/unit/commands_map_spec.rb +57 -57
  189. data/spec/unit/component_test_spec.rb +126 -126
  190. data/spec/unit/cookbook_metadata_spec.rb +98 -98
  191. data/spec/unit/cookbook_profiler/git_spec.rb +176 -176
  192. data/spec/unit/cookbook_profiler/identifiers_spec.rb +83 -83
  193. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -9
  194. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -9
  195. data/spec/unit/fixtures/command/cli_test_command.rb +26 -26
  196. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -7
  197. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  198. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -3
  199. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  200. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -96
  201. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  202. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  203. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -16
  204. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -3
  205. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -4
  206. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -96
  207. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -8
  208. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -8
  209. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/.kitchen.yml +16 -16
  210. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -3
  211. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -4
  212. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -96
  213. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -8
  214. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -8
  215. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1321 -1321
  216. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -2987
  217. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -1
  218. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +36 -36
  219. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -16
  220. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -2
  221. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -5
  222. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -3
  223. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -2
  224. data/spec/unit/fixtures/example_cookbook/.gitignore +17 -17
  225. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -16
  226. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -3
  227. data/spec/unit/fixtures/example_cookbook/README.md +4 -4
  228. data/spec/unit/fixtures/example_cookbook/chefignore +96 -96
  229. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -8
  230. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -8
  231. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -17
  232. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -16
  233. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -3
  234. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -4
  235. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -96
  236. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -5
  237. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -8
  238. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -17
  239. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -16
  240. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -3
  241. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -4
  242. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -96
  243. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -8
  244. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -4
  245. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -96
  246. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -8
  247. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -8
  248. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -3
  249. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -4
  250. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -96
  251. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -9
  252. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -8
  253. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -16
  254. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -3
  255. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -4
  256. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -96
  257. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -8
  258. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -8
  259. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -2
  260. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  261. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  262. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  263. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  264. data/spec/unit/generator_spec.rb +120 -120
  265. data/spec/unit/helpers_spec.rb +92 -92
  266. data/spec/unit/pager_spec.rb +119 -119
  267. data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -66
  268. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +34 -34
  269. data/spec/unit/policyfile/community_cookbook_source_spec.rb +84 -51
  270. data/spec/unit/policyfile/comparison_base_spec.rb +343 -343
  271. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +257 -252
  272. data/spec/unit/policyfile/cookbook_locks_spec.rb +529 -529
  273. data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +130 -0
  274. data/spec/unit/policyfile/differ_spec.rb +687 -687
  275. data/spec/unit/policyfile/lister_spec.rb +272 -272
  276. data/spec/unit/policyfile/null_cookbook_source_spec.rb +35 -35
  277. data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -92
  278. data/spec/unit/policyfile/reports/install_spec.rb +115 -115
  279. data/spec/unit/policyfile/reports/upload_spec.rb +96 -96
  280. data/spec/unit/policyfile/solution_dependencies_spec.rb +145 -145
  281. data/spec/unit/policyfile/storage_config_spec.rb +172 -172
  282. data/spec/unit/policyfile/undo_record_spec.rb +260 -260
  283. data/spec/unit/policyfile/undo_stack_spec.rb +266 -266
  284. data/spec/unit/policyfile/uploader_spec.rb +410 -410
  285. data/spec/unit/policyfile_demands_spec.rb +997 -876
  286. data/spec/unit/policyfile_evaluation_spec.rb +557 -441
  287. data/spec/unit/policyfile_lock_build_spec.rb +1056 -1056
  288. data/spec/unit/policyfile_lock_install_spec.rb +138 -138
  289. data/spec/unit/policyfile_lock_serialization_spec.rb +425 -425
  290. data/spec/unit/policyfile_lock_validation_spec.rb +611 -611
  291. data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -236
  292. data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +275 -275
  293. data/spec/unit/policyfile_services/export_repo_spec.rb +439 -439
  294. data/spec/unit/policyfile_services/install_spec.rb +191 -191
  295. data/spec/unit/policyfile_services/push_archive_spec.rb +345 -345
  296. data/spec/unit/policyfile_services/push_spec.rb +233 -233
  297. data/spec/unit/policyfile_services/rm_policy_group_spec.rb +241 -241
  298. data/spec/unit/policyfile_services/rm_policy_spec.rb +266 -266
  299. data/spec/unit/policyfile_services/show_policy_spec.rb +889 -889
  300. data/spec/unit/policyfile_services/undelete_spec.rb +304 -304
  301. data/spec/unit/policyfile_services/update_attributes_spec.rb +217 -217
  302. data/spec/unit/service_exception_inspectors/base_spec.rb +43 -43
  303. data/spec/unit/service_exception_inspectors/http_spec.rb +140 -140
  304. data/spec/unit/shell_out_spec.rb +34 -34
  305. data/warning.txt +9 -0
  306. metadata +18 -5
@@ -1,322 +1,380 @@
1
- #
2
- # Copyright:: Copyright (c) 2014 Chef Software Inc.
3
- # License:: Apache License, Version 2.0
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
- #
17
-
18
- require 'forwardable'
19
-
20
- require 'solve'
21
- require 'chef/run_list'
22
-
23
- require 'chef-dk/policyfile/dsl'
24
- require 'chef-dk/policyfile_lock'
25
- require 'chef-dk/ui'
26
- require 'chef-dk/policyfile/reports/install'
27
- require 'chef-dk/exceptions'
28
-
29
- module ChefDK
30
-
31
- class PolicyfileCompiler
32
-
33
- extend Forwardable
34
-
35
- DEFAULT_DEMAND_CONSTRAINT = '>= 0.0.0'.freeze
36
-
37
- # Cookbooks from these sources lock that cookbook to exactly one version
38
- SOURCE_TYPES_WITH_FIXED_VERSIONS = [:git, :path].freeze
39
-
40
- def self.evaluate(policyfile_string, policyfile_filename, ui: nil)
41
- compiler = new(ui: ui)
42
- compiler.evaluate_policyfile(policyfile_string, policyfile_filename)
43
- compiler
44
- end
45
-
46
- def_delegator :@dsl, :name
47
- def_delegator :@dsl, :run_list
48
- def_delegator :@dsl, :named_run_list
49
- def_delegator :@dsl, :named_run_lists
50
- def_delegator :@dsl, :errors
51
- def_delegator :@dsl, :default_source
52
- def_delegator :@dsl, :cookbook_location_specs
53
-
54
- attr_reader :dsl
55
- attr_reader :storage_config
56
- attr_reader :install_report
57
-
58
- def initialize(ui: nil)
59
- @storage_config = Policyfile::StorageConfig.new
60
- @dsl = Policyfile::DSL.new(storage_config)
61
- @artifact_server_cookbook_location_specs = {}
62
-
63
- @merged_graph = nil
64
-
65
- @ui = ui || UI.null
66
- @install_report = Policyfile::Reports::Install.new(ui: @ui, policyfile_compiler: self)
67
- end
68
-
69
- def error!
70
- unless errors.empty?
71
- raise PolicyfileError, errors.join("\n")
72
- end
73
- end
74
-
75
- def cookbook_location_spec_for(cookbook_name)
76
- cookbook_location_specs[cookbook_name]
77
- end
78
-
79
- def expanded_run_list
80
- # doesn't support roles yet...
81
- Chef::RunList.new(*run_list)
82
- end
83
-
84
- # copy of the expanded_run_list, properly formatted for use in a lockfile
85
- def normalized_run_list
86
- expanded_run_list.map { |i| normalize_recipe(i) }
87
- end
88
-
89
- def expanded_named_run_lists
90
- named_run_lists.inject({}) do |expanded, (name, run_list_items)|
91
- expanded[name] = Chef::RunList.new(*run_list_items)
92
- expanded
93
- end
94
- end
95
-
96
- def normalized_named_run_lists
97
- expanded_named_run_lists.inject({}) do |normalized,(name, run_list)|
98
- normalized[name] = run_list.map { |i| normalize_recipe(i) }
99
- normalized
100
- end
101
- end
102
-
103
- def default_attributes
104
- dsl.node_attributes.combined_default.to_hash
105
- end
106
-
107
- def override_attributes
108
- dsl.node_attributes.combined_override.to_hash
109
- end
110
-
111
- def lock
112
- @policyfile_lock ||= PolicyfileLock.build_from_compiler(self, storage_config)
113
- end
114
-
115
- def install
116
- ensure_cache_dir_exists
117
-
118
- graph_solution.each do |cookbook_name, version|
119
- spec = cookbook_location_spec_for(cookbook_name)
120
- if spec.nil? or !spec.version_fixed?
121
- spec = create_spec_for_cookbook(cookbook_name, version)
122
- install_report.installing_cookbook(spec)
123
- spec.ensure_cached
124
- end
125
- end
126
- end
127
-
128
- def create_spec_for_cookbook(cookbook_name, version)
129
- matching_source = default_source.find { |s|
130
- s.universe_graph.has_key?(cookbook_name)
131
- }
132
-
133
- source_options = matching_source.source_options_for(cookbook_name, version)
134
- spec = Policyfile::CookbookLocationSpecification.new(cookbook_name, "= #{version}", source_options, storage_config)
135
- @artifact_server_cookbook_location_specs[cookbook_name] = spec
136
- end
137
-
138
- def all_cookbook_location_specs
139
- # in the installation proces, we create "artifact_server_cookbook_location_specs"
140
- # for any cookbook that isn't sourced from a single-version source (e.g.,
141
- # path and git only support one version at a time), but we might have
142
- # specs for them to track additional version constraint demands. Merging
143
- # in this order ensures the artifact_server_cookbook_location_specs "win".
144
- cookbook_location_specs.merge(@artifact_server_cookbook_location_specs)
145
- end
146
-
147
- ##
148
- # Compilation Methods
149
- ##
150
-
151
- def graph_solution
152
- return @solution if @solution
153
- cache_fixed_version_cookbooks
154
- @solution = Solve.it!(graph, graph_demands)
155
- end
156
-
157
- def graph
158
- @graph ||= Solve::Graph.new.tap do |g|
159
- artifacts_graph.each do |name, dependencies_by_version|
160
- dependencies_by_version.each do |version, dependencies|
161
- artifact = g.artifact(name, version)
162
- dependencies.each do |dep_name, constraint|
163
- artifact.dependency(dep_name, constraint)
164
- end
165
- end
166
- end
167
- end
168
- end
169
-
170
- def solution_dependencies
171
- solution_deps = Policyfile::SolutionDependencies.new
172
-
173
- all_cookbook_location_specs.each do |name, spec|
174
- solution_deps.add_policyfile_dep(name, spec.version_constraint)
175
- end
176
-
177
- graph_solution.each do |name, version|
178
- transitive_deps = artifacts_graph[name][version]
179
- solution_deps.add_cookbook_dep(name, version, transitive_deps)
180
- end
181
- solution_deps
182
- end
183
-
184
- def graph_demands
185
- cookbooks_for_demands.map do |cookbook_name|
186
- spec = cookbook_location_spec_for(cookbook_name)
187
- if spec.nil?
188
- [ cookbook_name, DEFAULT_DEMAND_CONSTRAINT ]
189
- elsif spec.version_fixed?
190
- [ cookbook_name, "= #{spec.version}" ]
191
- else
192
- [ cookbook_name, spec.version_constraint.to_s ]
193
- end
194
- end
195
- end
196
-
197
- def artifacts_graph
198
- remote_artifacts_graph.merge(local_artifacts_graph)
199
- end
200
-
201
- # Gives a dependency graph for cookbooks that are source from an alternate
202
- # location. These cookbooks could have a different set of dependencies
203
- # compared to an unmodified copy upstream. For example, the community site
204
- # may have a cookbook "apache2" at version "1.10.4", which the user has
205
- # forked on github and modified the dependencies without changing the
206
- # version number. To accomodate this, the local_artifacts_graph should be
207
- # merged over the upstream's artifacts graph.
208
- def local_artifacts_graph
209
- cookbook_location_specs.inject({}) do |local_artifacts, (cookbook_name, cookbook_location_spec)|
210
- if cookbook_location_spec.version_fixed?
211
- local_artifacts[cookbook_name] = { cookbook_location_spec.version => cookbook_location_spec.dependencies }
212
- end
213
- local_artifacts
214
- end
215
- end
216
-
217
- def remote_artifacts_graph
218
- @merged_graph ||=
219
- begin
220
- conflicting_cb_names = []
221
- merged = {}
222
- default_source.each do |source|
223
- merged.merge!(source.universe_graph) do |conflicting_cb_name, _old, _new|
224
- conflicting_cb_names << conflicting_cb_name
225
- end
226
- end
227
- handle_conflicting_cookbooks(conflicting_cb_names)
228
- merged
229
- end
230
- end
231
-
232
-
233
- def version_constraint_for(cookbook_name)
234
- if (cookbook_location_spec = cookbook_location_spec_for(cookbook_name)) and cookbook_location_spec.version_fixed?
235
- version = cookbook_location_spec.version
236
- "= #{version}"
237
- else
238
- DEFAULT_DEMAND_CONSTRAINT
239
- end
240
- end
241
-
242
- def cookbook_version_fixed?(cookbook_name)
243
- if cookbook_location_spec = cookbook_location_spec_for(cookbook_name)
244
- cookbook_location_spec.version_fixed?
245
- else
246
- false
247
- end
248
- end
249
-
250
- def cookbooks_in_run_list
251
- combined_run_lists = expanded_named_run_lists.values.inject(expanded_run_list.to_a) do |accum_run_lists, run_list|
252
- accum_run_lists |= run_list.to_a
253
- end
254
-
255
- recipes = combined_run_lists.map {|recipe| recipe.name }
256
- recipes.map { |r| r[/^([^:]+)/, 1] }
257
- end
258
-
259
- def build
260
- yield @dsl
261
- self
262
- end
263
-
264
- def evaluate_policyfile(policyfile_string, policyfile_filename)
265
- storage_config.use_policyfile(policyfile_filename)
266
- @dsl.eval_policyfile(policyfile_string)
267
- self
268
- end
269
-
270
- def fixed_version_cookbooks_specs
271
- @fixed_version_cookbooks_specs ||= cookbook_location_specs.select do |_cookbook_name, cookbook_location_spec|
272
- cookbook_location_spec.version_fixed?
273
- end
274
- end
275
-
276
- private
277
-
278
- def normalize_recipe(run_list_item)
279
- name = run_list_item.name
280
- name = "#{name}::default" unless name.include?("::")
281
- "recipe[#{name}]"
282
- end
283
-
284
- def cookbooks_for_demands
285
- (cookbooks_in_run_list + cookbook_location_specs.keys).uniq
286
- end
287
-
288
- def cache_fixed_version_cookbooks
289
- ensure_cache_dir_exists
290
-
291
- fixed_version_cookbooks_specs.each do |name, cookbook_location_spec|
292
- install_report.installing_fixed_version_cookbook(cookbook_location_spec)
293
- cookbook_location_spec.ensure_cached
294
- end
295
- end
296
-
297
- def ensure_cache_dir_exists
298
- unless File.exist?(cache_path)
299
- FileUtils.mkdir_p(cache_path)
300
- end
301
- end
302
-
303
- def cache_path
304
- CookbookOmnifetch.storage_path
305
- end
306
-
307
- def handle_conflicting_cookbooks(conflicting_cookbooks)
308
- # ignore any cookbooks that have a source set.
309
- cookbooks_wo_source = conflicting_cookbooks.select do |cookbook_name|
310
- location_spec = cookbook_location_spec_for(cookbook_name)
311
- location_spec.nil? || location_spec.source_options.empty?
312
- end
313
-
314
- if cookbooks_wo_source.empty?
315
- nil
316
- else
317
- raise CookbookSourceConflict.new(cookbooks_wo_source, default_source)
318
- end
319
- end
320
-
321
- end
322
- end
1
+ #
2
+ # Copyright:: Copyright (c) 2014 Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require 'set'
19
+ require 'forwardable'
20
+
21
+ require 'solve'
22
+ require 'chef/run_list'
23
+
24
+ require 'chef-dk/policyfile/dsl'
25
+ require 'chef-dk/policyfile_lock'
26
+ require 'chef-dk/ui'
27
+ require 'chef-dk/policyfile/reports/install'
28
+ require 'chef-dk/exceptions'
29
+
30
+ module ChefDK
31
+
32
+ class PolicyfileCompiler
33
+
34
+ extend Forwardable
35
+
36
+ DEFAULT_DEMAND_CONSTRAINT = '>= 0.0.0'.freeze
37
+
38
+ # Cookbooks from these sources lock that cookbook to exactly one version
39
+ SOURCE_TYPES_WITH_FIXED_VERSIONS = [:git, :path].freeze
40
+
41
+ def self.evaluate(policyfile_string, policyfile_filename, ui: nil)
42
+ compiler = new(ui: ui)
43
+ compiler.evaluate_policyfile(policyfile_string, policyfile_filename)
44
+ compiler
45
+ end
46
+
47
+ def_delegator :@dsl, :name
48
+ def_delegator :@dsl, :run_list
49
+ def_delegator :@dsl, :named_run_list
50
+ def_delegator :@dsl, :named_run_lists
51
+ def_delegator :@dsl, :errors
52
+ def_delegator :@dsl, :default_source
53
+ def_delegator :@dsl, :cookbook_location_specs
54
+
55
+ attr_reader :dsl
56
+ attr_reader :storage_config
57
+ attr_reader :install_report
58
+
59
+ def initialize(ui: nil)
60
+ @storage_config = Policyfile::StorageConfig.new
61
+ @dsl = Policyfile::DSL.new(storage_config)
62
+ @artifact_server_cookbook_location_specs = {}
63
+
64
+ @merged_graph = nil
65
+
66
+ @ui = ui || UI.null
67
+ @install_report = Policyfile::Reports::Install.new(ui: @ui, policyfile_compiler: self)
68
+ end
69
+
70
+ def error!
71
+ unless errors.empty?
72
+ raise PolicyfileError, errors.join("\n")
73
+ end
74
+ end
75
+
76
+ def cookbook_location_spec_for(cookbook_name)
77
+ cookbook_location_specs[cookbook_name]
78
+ end
79
+
80
+ def expanded_run_list
81
+ # doesn't support roles yet...
82
+ Chef::RunList.new(*run_list)
83
+ end
84
+
85
+ # copy of the expanded_run_list, properly formatted for use in a lockfile
86
+ def normalized_run_list
87
+ expanded_run_list.map { |i| normalize_recipe(i) }
88
+ end
89
+
90
+ def expanded_named_run_lists
91
+ named_run_lists.inject({}) do |expanded, (name, run_list_items)|
92
+ expanded[name] = Chef::RunList.new(*run_list_items)
93
+ expanded
94
+ end
95
+ end
96
+
97
+ def normalized_named_run_lists
98
+ expanded_named_run_lists.inject({}) do |normalized,(name, run_list)|
99
+ normalized[name] = run_list.map { |i| normalize_recipe(i) }
100
+ normalized
101
+ end
102
+ end
103
+
104
+ def default_attributes
105
+ dsl.node_attributes.combined_default.to_hash
106
+ end
107
+
108
+ def override_attributes
109
+ dsl.node_attributes.combined_override.to_hash
110
+ end
111
+
112
+ def lock
113
+ @policyfile_lock ||= PolicyfileLock.build_from_compiler(self, storage_config)
114
+ end
115
+
116
+ def install
117
+ ensure_cache_dir_exists
118
+
119
+ graph_solution.each do |cookbook_name, version|
120
+ spec = cookbook_location_spec_for(cookbook_name)
121
+ if spec.nil? or !spec.version_fixed?
122
+ spec = create_spec_for_cookbook(cookbook_name, version)
123
+ install_report.installing_cookbook(spec)
124
+ spec.ensure_cached
125
+ end
126
+ end
127
+ end
128
+
129
+ def create_spec_for_cookbook(cookbook_name, version)
130
+ matching_source = best_source_for(cookbook_name)
131
+ source_options = matching_source.source_options_for(cookbook_name, version)
132
+ spec = Policyfile::CookbookLocationSpecification.new(cookbook_name, "= #{version}", source_options, storage_config)
133
+ @artifact_server_cookbook_location_specs[cookbook_name] = spec
134
+ end
135
+
136
+ def all_cookbook_location_specs
137
+ # in the installation proces, we create "artifact_server_cookbook_location_specs"
138
+ # for any cookbook that isn't sourced from a single-version source (e.g.,
139
+ # path and git only support one version at a time), but we might have
140
+ # specs for them to track additional version constraint demands. Merging
141
+ # in this order ensures the artifact_server_cookbook_location_specs "win".
142
+ cookbook_location_specs.merge(@artifact_server_cookbook_location_specs)
143
+ end
144
+
145
+ ##
146
+ # Compilation Methods
147
+ ##
148
+
149
+ def graph_solution
150
+ return @solution if @solution
151
+ cache_fixed_version_cookbooks
152
+ @solution = Solve.it!(graph, graph_demands)
153
+ end
154
+
155
+ def graph
156
+ @graph ||= Solve::Graph.new.tap do |g|
157
+ artifacts_graph.each do |name, dependencies_by_version|
158
+ dependencies_by_version.each do |version, dependencies|
159
+ artifact = g.artifact(name, version)
160
+ dependencies.each do |dep_name, constraint|
161
+ artifact.dependency(dep_name, constraint)
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
167
+
168
+ def solution_dependencies
169
+ solution_deps = Policyfile::SolutionDependencies.new
170
+
171
+ all_cookbook_location_specs.each do |name, spec|
172
+ solution_deps.add_policyfile_dep(name, spec.version_constraint)
173
+ end
174
+
175
+ graph_solution.each do |name, version|
176
+ transitive_deps = artifacts_graph[name][version]
177
+ solution_deps.add_cookbook_dep(name, version, transitive_deps)
178
+ end
179
+ solution_deps
180
+ end
181
+
182
+ def graph_demands
183
+ cookbooks_for_demands.map do |cookbook_name|
184
+ spec = cookbook_location_spec_for(cookbook_name)
185
+ if spec.nil?
186
+ [ cookbook_name, DEFAULT_DEMAND_CONSTRAINT ]
187
+ elsif spec.version_fixed?
188
+ [ cookbook_name, "= #{spec.version}" ]
189
+ else
190
+ [ cookbook_name, spec.version_constraint.to_s ]
191
+ end
192
+ end
193
+ end
194
+
195
+ def artifacts_graph
196
+ remote_artifacts_graph.merge(local_artifacts_graph)
197
+ end
198
+
199
+ # Gives a dependency graph for cookbooks that are source from an alternate
200
+ # location. These cookbooks could have a different set of dependencies
201
+ # compared to an unmodified copy upstream. For example, the community site
202
+ # may have a cookbook "apache2" at version "1.10.4", which the user has
203
+ # forked on github and modified the dependencies without changing the
204
+ # version number. To accomodate this, the local_artifacts_graph should be
205
+ # merged over the upstream's artifacts graph.
206
+ def local_artifacts_graph
207
+ cookbook_location_specs.inject({}) do |local_artifacts, (cookbook_name, cookbook_location_spec)|
208
+ if cookbook_location_spec.version_fixed?
209
+ local_artifacts[cookbook_name] = { cookbook_location_spec.version => cookbook_location_spec.dependencies }
210
+ end
211
+ local_artifacts
212
+ end
213
+ end
214
+
215
+ def remote_artifacts_graph
216
+ @merged_graph ||=
217
+ begin
218
+ conflicting_cb_names = []
219
+ merged = {}
220
+ default_source.each do |source|
221
+ merged.merge!(source.universe_graph) do |conflicting_cb_name, _old, _new|
222
+ if (preference = preferred_source_for_cookbook(conflicting_cb_name))
223
+ preference.universe_graph[conflicting_cb_name]
224
+ elsif cookbook_could_appear_in_solution?(conflicting_cb_name)
225
+ conflicting_cb_names << conflicting_cb_name
226
+ {} # return empty set of versions
227
+ else
228
+ {} # return empty set of versions
229
+ end
230
+ end
231
+ end
232
+ handle_conflicting_cookbooks(conflicting_cb_names)
233
+ merged
234
+ end
235
+ end
236
+
237
+ def version_constraint_for(cookbook_name)
238
+ if (cookbook_location_spec = cookbook_location_spec_for(cookbook_name)) and cookbook_location_spec.version_fixed?
239
+ version = cookbook_location_spec.version
240
+ "= #{version}"
241
+ else
242
+ DEFAULT_DEMAND_CONSTRAINT
243
+ end
244
+ end
245
+
246
+ def cookbook_version_fixed?(cookbook_name)
247
+ if cookbook_location_spec = cookbook_location_spec_for(cookbook_name)
248
+ cookbook_location_spec.version_fixed?
249
+ else
250
+ false
251
+ end
252
+ end
253
+
254
+ def cookbooks_in_run_list
255
+ combined_run_lists = expanded_named_run_lists.values.inject(expanded_run_list.to_a) do |accum_run_lists, run_list|
256
+ accum_run_lists |= run_list.to_a
257
+ end
258
+
259
+ recipes = combined_run_lists.map {|recipe| recipe.name }
260
+ recipes.map { |r| r[/^([^:]+)/, 1] }
261
+ end
262
+
263
+ def build
264
+ yield @dsl
265
+ self
266
+ end
267
+
268
+ def evaluate_policyfile(policyfile_string, policyfile_filename)
269
+ storage_config.use_policyfile(policyfile_filename)
270
+ @dsl.eval_policyfile(policyfile_string)
271
+ self
272
+ end
273
+
274
+ def fixed_version_cookbooks_specs
275
+ @fixed_version_cookbooks_specs ||= cookbook_location_specs.select do |_cookbook_name, cookbook_location_spec|
276
+ cookbook_location_spec.version_fixed?
277
+ end
278
+ end
279
+
280
+ private
281
+
282
+ def normalize_recipe(run_list_item)
283
+ name = run_list_item.name
284
+ name = "#{name}::default" unless name.include?("::")
285
+ "recipe[#{name}]"
286
+ end
287
+
288
+ def cookbooks_for_demands
289
+ (cookbooks_in_run_list + cookbook_location_specs.keys).uniq
290
+ end
291
+
292
+ def cache_fixed_version_cookbooks
293
+ ensure_cache_dir_exists
294
+
295
+ fixed_version_cookbooks_specs.each do |name, cookbook_location_spec|
296
+ install_report.installing_fixed_version_cookbook(cookbook_location_spec)
297
+ cookbook_location_spec.ensure_cached
298
+ end
299
+ end
300
+
301
+ def ensure_cache_dir_exists
302
+ unless File.exist?(cache_path)
303
+ FileUtils.mkdir_p(cache_path)
304
+ end
305
+ end
306
+
307
+ def cache_path
308
+ CookbookOmnifetch.storage_path
309
+ end
310
+
311
+ def best_source_for(cookbook_name)
312
+ preferred = default_source.find { |s| s.preferred_source_for?(cookbook_name) }
313
+ if preferred.nil?
314
+ default_source.find { |s|
315
+ s.universe_graph.has_key?(cookbook_name)
316
+ }
317
+ else
318
+ preferred
319
+ end
320
+ end
321
+
322
+
323
+ def preferred_source_for_cookbook(conflicting_cb_name)
324
+ default_source.find { |s| s.preferred_source_for?(conflicting_cb_name) }
325
+ end
326
+
327
+ def handle_conflicting_cookbooks(conflicting_cookbooks)
328
+ # ignore any cookbooks that have a source set.
329
+ cookbooks_wo_source = conflicting_cookbooks.select do |cookbook_name|
330
+ location_spec = cookbook_location_spec_for(cookbook_name)
331
+ location_spec.nil? || location_spec.source_options.empty?
332
+ end
333
+
334
+ if cookbooks_wo_source.empty?
335
+ nil
336
+ else
337
+ raise CookbookSourceConflict.new(cookbooks_wo_source, default_source)
338
+ end
339
+ end
340
+
341
+ def cookbook_could_appear_in_solution?(cookbook_name)
342
+ all_possible_dep_names.include?(cookbook_name)
343
+ end
344
+
345
+ # Traverses the dependency graph in a simple manner to find the set of
346
+ # cookbooks that could be considered in the dependency solution. Version
347
+ # constraints are not considered so this could include extra cookbooks.
348
+ def all_possible_dep_names
349
+ @all_possible_dep_names ||= cookbooks_for_demands.inject(Set.new) do |deps_set, demand_cookbook|
350
+
351
+ deps_set_for_source = default_source.inject(Set.new) do |deps_set_for_cb, source|
352
+ possible_deps = possible_dependencies_of(demand_cookbook, source)
353
+ deps_set_for_cb.merge(possible_deps)
354
+ end
355
+
356
+ deps_set.merge(deps_set_for_source)
357
+ end
358
+ end
359
+
360
+ def possible_dependencies_of(cookbook_name, source, dependency_set = Set.new)
361
+ return dependency_set if dependency_set.include?(cookbook_name)
362
+ return dependency_set unless source.universe_graph.key?(cookbook_name)
363
+
364
+ dependency_set << cookbook_name
365
+
366
+ deps_by_version = source.universe_graph[cookbook_name]
367
+
368
+ dep_cookbook_names = deps_by_version.values.inject(Set.new) do |names, constraint_list|
369
+ names.merge(constraint_list.map { |c| c.first })
370
+ end
371
+
372
+ dep_cookbook_names.each do |dep_cookbook_name|
373
+ possible_dependencies_of(dep_cookbook_name, source, dependency_set)
374
+ end
375
+
376
+ dependency_set
377
+ end
378
+
379
+ end
380
+ end