chef-dk 3.9.0 → 3.10.1

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 (377) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +139 -139
  3. data/Gemfile.lock +917 -919
  4. data/LICENSE +201 -201
  5. data/Rakefile +77 -77
  6. data/bin/chef +25 -25
  7. data/chef-dk.gemspec +60 -60
  8. data/lib/chef-dk.rb +19 -19
  9. data/lib/chef-dk/authenticated_http.rb +22 -22
  10. data/lib/chef-dk/builtin_commands.rb +62 -62
  11. data/lib/chef-dk/chef_runner.rb +114 -114
  12. data/lib/chef-dk/chef_server_api_multi.rb +73 -73
  13. data/lib/chef-dk/cli.rb +201 -201
  14. data/lib/chef-dk/command/base.rb +79 -79
  15. data/lib/chef-dk/command/clean_policy_cookbooks.rb +114 -114
  16. data/lib/chef-dk/command/clean_policy_revisions.rb +111 -111
  17. data/lib/chef-dk/command/delete_policy.rb +120 -120
  18. data/lib/chef-dk/command/delete_policy_group.rb +120 -120
  19. data/lib/chef-dk/command/describe_cookbook.rb +95 -95
  20. data/lib/chef-dk/command/diff.rb +315 -315
  21. data/lib/chef-dk/command/env.rb +89 -89
  22. data/lib/chef-dk/command/exec.rb +44 -44
  23. data/lib/chef-dk/command/export.rb +155 -155
  24. data/lib/chef-dk/command/gem.rb +47 -47
  25. data/lib/chef-dk/command/generate.rb +126 -126
  26. data/lib/chef-dk/command/generator_commands.rb +83 -83
  27. data/lib/chef-dk/command/generator_commands/app.rb +106 -106
  28. data/lib/chef-dk/command/generator_commands/attribute.rb +36 -36
  29. data/lib/chef-dk/command/generator_commands/base.rb +157 -157
  30. data/lib/chef-dk/command/generator_commands/build_cookbook.rb +125 -125
  31. data/lib/chef-dk/command/generator_commands/chef_exts/generator_desc_resource.rb +85 -85
  32. data/lib/chef-dk/command/generator_commands/chef_exts/quieter_doc_formatter.rb +38 -38
  33. data/lib/chef-dk/command/generator_commands/chef_exts/recipe_dsl_ext.rb +39 -39
  34. data/lib/chef-dk/command/generator_commands/cookbook.rb +251 -251
  35. data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +100 -100
  36. data/lib/chef-dk/command/generator_commands/cookbook_file.rb +45 -45
  37. data/lib/chef-dk/command/generator_commands/generator_generator.rb +174 -174
  38. data/lib/chef-dk/command/generator_commands/helpers.rb +36 -36
  39. data/lib/chef-dk/command/generator_commands/policyfile.rb +124 -124
  40. data/lib/chef-dk/command/generator_commands/recipe.rb +36 -36
  41. data/lib/chef-dk/command/generator_commands/repo.rb +123 -123
  42. data/lib/chef-dk/command/generator_commands/resource.rb +36 -36
  43. data/lib/chef-dk/command/generator_commands/template.rb +46 -46
  44. data/lib/chef-dk/command/install.rb +120 -120
  45. data/lib/chef-dk/command/provision.rb +439 -439
  46. data/lib/chef-dk/command/push.rb +117 -117
  47. data/lib/chef-dk/command/push_archive.rb +125 -125
  48. data/lib/chef-dk/command/shell_init.rb +179 -179
  49. data/lib/chef-dk/command/show_policy.rb +163 -163
  50. data/lib/chef-dk/command/undelete.rb +154 -154
  51. data/lib/chef-dk/command/update.rb +139 -139
  52. data/lib/chef-dk/command/verify.rb +638 -638
  53. data/lib/chef-dk/commands_map.rb +113 -113
  54. data/lib/chef-dk/completions/bash.sh.erb +5 -5
  55. data/lib/chef-dk/completions/chef.fish.erb +10 -10
  56. data/lib/chef-dk/completions/zsh.zsh.erb +21 -21
  57. data/lib/chef-dk/component_test.rb +227 -227
  58. data/lib/chef-dk/configurable.rb +88 -88
  59. data/lib/chef-dk/cookbook_metadata.rb +45 -45
  60. data/lib/chef-dk/cookbook_omnifetch.rb +32 -32
  61. data/lib/chef-dk/cookbook_profiler/git.rb +152 -152
  62. data/lib/chef-dk/cookbook_profiler/identifiers.rb +72 -72
  63. data/lib/chef-dk/cookbook_profiler/null_scm.rb +31 -31
  64. data/lib/chef-dk/exceptions.rb +151 -151
  65. data/lib/chef-dk/generator.rb +165 -165
  66. data/lib/chef-dk/helpers.rb +176 -176
  67. data/lib/chef-dk/pager.rb +104 -104
  68. data/lib/chef-dk/policyfile/artifactory_cookbook_source.rb +102 -102
  69. data/lib/chef-dk/policyfile/attribute_merge_checker.rb +110 -110
  70. data/lib/chef-dk/policyfile/chef_repo_cookbook_source.rb +138 -138
  71. data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +99 -99
  72. data/lib/chef-dk/policyfile/chef_server_lock_fetcher.rb +167 -167
  73. data/lib/chef-dk/policyfile/community_cookbook_source.rb +95 -95
  74. data/lib/chef-dk/policyfile/comparison_base.rb +123 -123
  75. data/lib/chef-dk/policyfile/cookbook_location_specification.rb +154 -154
  76. data/lib/chef-dk/policyfile/cookbook_locks.rb +466 -466
  77. data/lib/chef-dk/policyfile/cookbook_sources.rb +23 -23
  78. data/lib/chef-dk/policyfile/delivery_supermarket_source.rb +89 -89
  79. data/lib/chef-dk/policyfile/differ.rb +263 -263
  80. data/lib/chef-dk/policyfile/dsl.rb +288 -288
  81. data/lib/chef-dk/policyfile/git_lock_fetcher.rb +265 -265
  82. data/lib/chef-dk/policyfile/included_policies_cookbook_source.rb +156 -156
  83. data/lib/chef-dk/policyfile/lister.rb +229 -229
  84. data/lib/chef-dk/policyfile/local_lock_fetcher.rb +132 -129
  85. data/lib/chef-dk/policyfile/lock_applier.rb +80 -80
  86. data/lib/chef-dk/policyfile/lock_fetcher_mixin.rb +37 -0
  87. data/lib/chef-dk/policyfile/null_cookbook_source.rb +49 -49
  88. data/lib/chef-dk/policyfile/policyfile_location_specification.rb +128 -125
  89. data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -124
  90. data/lib/chef-dk/policyfile/remote_lock_fetcher.rb +108 -0
  91. data/lib/chef-dk/policyfile/reports/install.rb +69 -69
  92. data/lib/chef-dk/policyfile/reports/table_printer.rb +57 -57
  93. data/lib/chef-dk/policyfile/reports/upload.rb +70 -70
  94. data/lib/chef-dk/policyfile/solution_dependencies.rb +311 -311
  95. data/lib/chef-dk/policyfile/source_uri.rb +57 -57
  96. data/lib/chef-dk/policyfile/storage_config.rb +112 -112
  97. data/lib/chef-dk/policyfile/undo_record.rb +139 -139
  98. data/lib/chef-dk/policyfile/undo_stack.rb +128 -128
  99. data/lib/chef-dk/policyfile/uploader.rb +222 -222
  100. data/lib/chef-dk/policyfile_compiler.rb +528 -528
  101. data/lib/chef-dk/policyfile_lock.rb +581 -581
  102. data/lib/chef-dk/policyfile_services/clean_policies.rb +95 -95
  103. data/lib/chef-dk/policyfile_services/clean_policy_cookbooks.rb +123 -123
  104. data/lib/chef-dk/policyfile_services/export_repo.rb +419 -419
  105. data/lib/chef-dk/policyfile_services/install.rb +167 -167
  106. data/lib/chef-dk/policyfile_services/push.rb +112 -112
  107. data/lib/chef-dk/policyfile_services/push_archive.rb +164 -164
  108. data/lib/chef-dk/policyfile_services/rm_policy.rb +141 -141
  109. data/lib/chef-dk/policyfile_services/rm_policy_group.rb +85 -85
  110. data/lib/chef-dk/policyfile_services/show_policy.rb +234 -234
  111. data/lib/chef-dk/policyfile_services/undelete.rb +108 -108
  112. data/lib/chef-dk/policyfile_services/update_attributes.rb +110 -110
  113. data/lib/chef-dk/service_exception_inspectors.rb +24 -24
  114. data/lib/chef-dk/service_exception_inspectors/base.rb +39 -39
  115. data/lib/chef-dk/service_exception_inspectors/http.rb +119 -119
  116. data/lib/chef-dk/service_exceptions.rb +142 -142
  117. data/lib/chef-dk/shell_out.rb +36 -36
  118. data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +4 -4
  119. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/.kitchen.yml +21 -21
  120. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/README.md +146 -146
  121. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +9 -9
  122. data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +104 -104
  123. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -9
  124. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README.md +66 -66
  125. data/lib/chef-dk/skeletons/code_generator/files/default/delivery-config.json +17 -17
  126. data/lib/chef-dk/skeletons/code_generator/files/default/delivery-project.toml +36 -36
  127. data/lib/chef-dk/skeletons/code_generator/files/default/gitignore +22 -22
  128. data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +24 -24
  129. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -27
  130. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +8 -8
  131. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +7 -7
  132. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +9 -9
  133. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +56 -56
  134. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +3 -3
  135. data/lib/chef-dk/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -6
  136. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +9 -9
  137. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/example.json +12 -12
  138. data/lib/chef-dk/skeletons/code_generator/files/default/repo/policyfiles/README.md +24 -24
  139. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +9 -9
  140. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/example.json +12 -12
  141. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +3 -3
  142. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper_policyfile.rb +3 -3
  143. data/lib/chef-dk/skeletons/code_generator/metadata.rb +8 -8
  144. data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +89 -89
  145. data/lib/chef-dk/skeletons/code_generator/recipes/attribute.rb +13 -13
  146. data/lib/chef-dk/skeletons/code_generator/recipes/build_cookbook.rb +177 -177
  147. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +161 -161
  148. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook_file.rb +25 -25
  149. data/lib/chef-dk/skeletons/code_generator/recipes/helpers.rb +21 -21
  150. data/lib/chef-dk/skeletons/code_generator/recipes/policyfile.rb +9 -9
  151. data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +52 -52
  152. data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +68 -68
  153. data/lib/chef-dk/skeletons/code_generator/recipes/resource.rb +13 -13
  154. data/lib/chef-dk/skeletons/code_generator/recipes/template.rb +32 -32
  155. data/lib/chef-dk/skeletons/code_generator/templates/default/CHANGELOG.md.erb +11 -11
  156. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -3
  157. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.apachev2.erb +201 -201
  158. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -339
  159. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -674
  160. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -21
  161. data/lib/chef-dk/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -25
  162. data/lib/chef-dk/skeletons/code_generator/templates/default/README.md.erb +4 -4
  163. data/lib/chef-dk/skeletons/code_generator/templates/default/attribute.rb.erb +0 -0
  164. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/Berksfile.erb +7 -7
  165. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +10 -10
  166. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +8 -8
  167. data/lib/chef-dk/skeletons/code_generator/templates/default/cookbook_file.erb +0 -0
  168. data/lib/chef-dk/skeletons/code_generator/templates/default/helpers.rb.erb +39 -39
  169. data/lib/chef-dk/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +16 -16
  170. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen.yml.erb +26 -26
  171. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_dokken.yml.erb +31 -31
  172. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +33 -33
  173. data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +20 -20
  174. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +5 -5
  175. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe_spec.rb.erb +35 -35
  176. data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +128 -128
  177. data/lib/chef-dk/skeletons/code_generator/templates/default/resource.rb.erb +1 -1
  178. data/lib/chef-dk/skeletons/code_generator/templates/default/template.erb +0 -0
  179. data/lib/chef-dk/ui.rb +57 -57
  180. data/lib/chef-dk/version.rb +20 -20
  181. data/lib/kitchen/provisioner/policyfile_zero.rb +195 -195
  182. data/spec/shared/a_file_generator.rb +125 -125
  183. data/spec/shared/a_generated_file.rb +12 -12
  184. data/spec/shared/command_with_ui_object.rb +11 -11
  185. data/spec/shared/custom_generator_cookbook.rb +136 -136
  186. data/spec/shared/fixture_cookbook_checksums.rb +46 -46
  187. data/spec/shared/setup_git_committer_config.rb +54 -54
  188. data/spec/shared/setup_git_cookbooks.rb +53 -53
  189. data/spec/spec_helper.rb +51 -51
  190. data/spec/test_helpers.rb +84 -84
  191. data/spec/unit/chef_runner_spec.rb +139 -139
  192. data/spec/unit/chef_server_api_multi_spec.rb +120 -120
  193. data/spec/unit/cli_spec.rb +377 -377
  194. data/spec/unit/command/base_spec.rb +172 -172
  195. data/spec/unit/command/clean_policy_cookbooks_spec.rb +180 -180
  196. data/spec/unit/command/clean_policy_revisions_spec.rb +180 -180
  197. data/spec/unit/command/delete_policy_group_spec.rb +206 -206
  198. data/spec/unit/command/delete_policy_spec.rb +206 -206
  199. data/spec/unit/command/diff_spec.rb +311 -311
  200. data/spec/unit/command/env_spec.rb +52 -52
  201. data/spec/unit/command/exec_spec.rb +178 -178
  202. data/spec/unit/command/export_spec.rb +199 -199
  203. data/spec/unit/command/generate_spec.rb +142 -142
  204. data/spec/unit/command/generator_commands/app_spec.rb +166 -166
  205. data/spec/unit/command/generator_commands/attribute_spec.rb +31 -31
  206. data/spec/unit/command/generator_commands/base_spec.rb +181 -181
  207. data/spec/unit/command/generator_commands/build_cookbook_spec.rb +377 -377
  208. data/spec/unit/command/generator_commands/chef_exts/generator_desc_resource_spec.rb +97 -97
  209. data/spec/unit/command/generator_commands/chef_exts/recipe_dsl_ext_spec.rb +111 -111
  210. data/spec/unit/command/generator_commands/cookbook_file_spec.rb +31 -31
  211. data/spec/unit/command/generator_commands/cookbook_spec.rb +765 -765
  212. data/spec/unit/command/generator_commands/generator_generator_spec.rb +227 -227
  213. data/spec/unit/command/generator_commands/helpers_spec.rb +31 -31
  214. data/spec/unit/command/generator_commands/policyfile_spec.rb +223 -223
  215. data/spec/unit/command/generator_commands/recipe_spec.rb +37 -37
  216. data/spec/unit/command/generator_commands/repo_spec.rb +374 -374
  217. data/spec/unit/command/generator_commands/resource_spec.rb +31 -31
  218. data/spec/unit/command/generator_commands/template_spec.rb +31 -31
  219. data/spec/unit/command/install_spec.rb +179 -179
  220. data/spec/unit/command/provision_spec.rb +589 -589
  221. data/spec/unit/command/push_archive_spec.rb +153 -153
  222. data/spec/unit/command/push_spec.rb +198 -198
  223. data/spec/unit/command/shell_init_spec.rb +339 -339
  224. data/spec/unit/command/show_policy_spec.rb +234 -234
  225. data/spec/unit/command/undelete_spec.rb +244 -244
  226. data/spec/unit/command/update_spec.rb +283 -283
  227. data/spec/unit/command/verify_spec.rb +342 -342
  228. data/spec/unit/commands_map_spec.rb +57 -57
  229. data/spec/unit/component_test_spec.rb +128 -128
  230. data/spec/unit/configurable_spec.rb +68 -68
  231. data/spec/unit/cookbook_metadata_spec.rb +96 -96
  232. data/spec/unit/cookbook_profiler/git_spec.rb +176 -176
  233. data/spec/unit/cookbook_profiler/identifiers_spec.rb +81 -81
  234. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -9
  235. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -9
  236. data/spec/unit/fixtures/command/cli_test_command.rb +26 -26
  237. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -7
  238. data/spec/unit/fixtures/configurable/test_config_loader.rb +5 -5
  239. data/spec/unit/fixtures/configurable/test_configurable.rb +10 -10
  240. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  241. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -3
  242. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  243. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -96
  244. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  245. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  246. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -16
  247. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -3
  248. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -4
  249. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -96
  250. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -8
  251. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -8
  252. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/.kitchen.yml +16 -16
  253. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -3
  254. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -4
  255. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -96
  256. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -8
  257. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -8
  258. data/spec/unit/fixtures/cookbooks_api/chef_server_universe.json +56 -56
  259. data/spec/unit/fixtures/cookbooks_api/pruned_chef_server_universe.json +30 -30
  260. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1321 -1321
  261. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -2987
  262. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -1
  263. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +33 -33
  264. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -16
  265. data/spec/unit/fixtures/dev_cookbooks/bar-cookbook.gitbundle +0 -0
  266. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/bin/.keep +0 -0
  267. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/.keep +0 -0
  268. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/bin/.keep +0 -0
  269. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/bin/.keep +0 -0
  270. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/berkshelf/.keep +0 -0
  271. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/test-kitchen/.keep +0 -0
  272. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/bin/.keep +0 -0
  273. data/spec/unit/fixtures/eg_omnibus_dir/valid/bin/.keep +0 -0
  274. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -2
  275. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -5
  276. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef-dk/.keep +0 -0
  277. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -3
  278. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -2
  279. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/bin/.keep +0 -0
  280. data/spec/unit/fixtures/example_app/Policyfile.rb +0 -0
  281. data/spec/unit/fixtures/example_cookbook/.gitignore +17 -17
  282. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -16
  283. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -3
  284. data/spec/unit/fixtures/example_cookbook/README.md +4 -4
  285. data/spec/unit/fixtures/example_cookbook/chefignore +96 -96
  286. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -8
  287. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -8
  288. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -17
  289. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -16
  290. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -3
  291. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -4
  292. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -96
  293. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -5
  294. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -8
  295. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -17
  296. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -16
  297. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -3
  298. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -4
  299. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -96
  300. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -8
  301. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -4
  302. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -96
  303. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -8
  304. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -8
  305. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -3
  306. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -4
  307. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -96
  308. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -9
  309. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -8
  310. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -16
  311. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -3
  312. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -4
  313. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -96
  314. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/extra/extra_file.txt +0 -0
  315. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -8
  316. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -8
  317. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -2
  318. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  319. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  320. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  321. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  322. data/spec/unit/generator_spec.rb +119 -119
  323. data/spec/unit/pager_spec.rb +117 -117
  324. data/spec/unit/policyfile/artifactory_cookbook_source_spec.rb +59 -59
  325. data/spec/unit/policyfile/attribute_merge_checker_spec.rb +80 -80
  326. data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -93
  327. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +55 -55
  328. data/spec/unit/policyfile/chef_server_lock_fetcher_spec.rb +161 -161
  329. data/spec/unit/policyfile/community_cookbook_source_spec.rb +83 -83
  330. data/spec/unit/policyfile/comparison_base_spec.rb +340 -340
  331. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +347 -347
  332. data/spec/unit/policyfile/cookbook_locks_spec.rb +527 -527
  333. data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +129 -129
  334. data/spec/unit/policyfile/differ_spec.rb +686 -686
  335. data/spec/unit/policyfile/git_lock_fetcher_spec.rb +155 -155
  336. data/spec/unit/policyfile/included_policies_cookbook_source_spec.rb +242 -242
  337. data/spec/unit/policyfile/lister_spec.rb +268 -268
  338. data/spec/unit/policyfile/local_lock_fetcher_spec.rb +199 -173
  339. data/spec/unit/policyfile/lock_applier_spec.rb +100 -100
  340. data/spec/unit/policyfile/lock_fetcher_mixin_spec.rb +60 -0
  341. data/spec/unit/policyfile/null_cookbook_source_spec.rb +34 -34
  342. data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -92
  343. data/spec/unit/policyfile/remote_lock_fetcher_spec.rb +129 -0
  344. data/spec/unit/policyfile/reports/install_spec.rb +114 -114
  345. data/spec/unit/policyfile/reports/upload_spec.rb +94 -94
  346. data/spec/unit/policyfile/solution_dependencies_spec.rb +170 -170
  347. data/spec/unit/policyfile/source_uri_spec.rb +36 -36
  348. data/spec/unit/policyfile/storage_config_spec.rb +180 -180
  349. data/spec/unit/policyfile/undo_record_spec.rb +258 -258
  350. data/spec/unit/policyfile/undo_stack_spec.rb +265 -265
  351. data/spec/unit/policyfile/uploader_spec.rb +410 -410
  352. data/spec/unit/policyfile_demands_spec.rb +1197 -1197
  353. data/spec/unit/policyfile_evaluation_spec.rb +628 -628
  354. data/spec/unit/policyfile_includes_dsl_spec.rb +220 -159
  355. data/spec/unit/policyfile_includes_spec.rb +720 -720
  356. data/spec/unit/policyfile_install_with_includes_spec.rb +232 -232
  357. data/spec/unit/policyfile_lock_build_spec.rb +1065 -1065
  358. data/spec/unit/policyfile_lock_install_spec.rb +137 -137
  359. data/spec/unit/policyfile_lock_serialization_spec.rb +424 -424
  360. data/spec/unit/policyfile_lock_validation_spec.rb +608 -608
  361. data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -236
  362. data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +272 -272
  363. data/spec/unit/policyfile_services/export_repo_spec.rb +473 -473
  364. data/spec/unit/policyfile_services/install_spec.rb +209 -209
  365. data/spec/unit/policyfile_services/push_archive_spec.rb +359 -359
  366. data/spec/unit/policyfile_services/push_spec.rb +249 -249
  367. data/spec/unit/policyfile_services/rm_policy_group_spec.rb +237 -237
  368. data/spec/unit/policyfile_services/rm_policy_spec.rb +263 -263
  369. data/spec/unit/policyfile_services/show_policy_spec.rb +887 -887
  370. data/spec/unit/policyfile_services/undelete_spec.rb +302 -302
  371. data/spec/unit/policyfile_services/update_attributes_spec.rb +229 -229
  372. data/spec/unit/policyfile_services/update_spec.rb +162 -162
  373. data/spec/unit/service_exception_inspectors/base_spec.rb +41 -41
  374. data/spec/unit/service_exception_inspectors/http_spec.rb +138 -138
  375. data/spec/unit/shell_out_spec.rb +34 -34
  376. data/warning.txt +9 -9
  377. metadata +8 -2
@@ -1,527 +1,527 @@
1
- #
2
- # Copyright:: Copyright (c) 2014-2018 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 "spec_helper"
19
- require "chef-dk/policyfile/cookbook_locks"
20
-
21
- shared_examples_for "Cookbook Lock" do
22
-
23
- let(:cookbook_lock_data) { cookbook_lock.to_lock }
24
-
25
- it "has a cookbook name" do
26
- expect(cookbook_lock.name).to eq(cookbook_name)
27
- end
28
-
29
- it "has a source_options attribute" do
30
- cookbook_lock.source_options = { artifactserver: "https://artifacts.example.com/nginx/1.0.0/download" }
31
- expect(cookbook_lock.source_options).to eq({ artifactserver: "https://artifacts.example.com/nginx/1.0.0/download" })
32
- end
33
-
34
- it "has an identifier attribute" do
35
- cookbook_lock.identifier = "my-opaque-id"
36
- expect(cookbook_lock.identifier).to eq("my-opaque-id")
37
- end
38
-
39
- it "has a dotted_decimal_identifier attribute" do
40
- cookbook_lock.dotted_decimal_identifier = "123.456.789"
41
- expect(cookbook_lock.dotted_decimal_identifier).to eq("123.456.789")
42
- end
43
-
44
- it "has a version attribute" do
45
- cookbook_lock.version = "1.2.3"
46
- expect(cookbook_lock.version).to eq("1.2.3")
47
- end
48
-
49
- it "has a storage config" do
50
- expect(cookbook_lock.storage_config).to eq(storage_config)
51
- end
52
-
53
- context "when the underlying cookbook has not been mutated, or #refresh! has not been called" do
54
-
55
- it "is not updated" do
56
- expect(cookbook_lock).to_not be_updated
57
- end
58
-
59
- it "does not have an updated identifier" do
60
- expect(cookbook_lock.identifier_updated?).to be false
61
- end
62
-
63
- it "does not have an updated version" do
64
- expect(cookbook_lock.version_updated?).to be false
65
- end
66
-
67
- end
68
-
69
- context "when version and identifier attributes are populated" do
70
-
71
- before do
72
- allow(cookbook_lock).to receive(:validate!)
73
-
74
- cookbook_lock.identifier = "my-opaque-id"
75
- cookbook_lock.dotted_decimal_identifier = "123.456.789"
76
- cookbook_lock.version = "1.2.3"
77
- cookbook_lock.source_options = { sourcekey: "location info" }
78
- end
79
-
80
- it "includes the identifier in the lock data" do
81
- expect(cookbook_lock_data["identifier"]).to eq("my-opaque-id")
82
- end
83
-
84
- it "includes the dotted decimal identifier in the lock data" do
85
- expect(cookbook_lock_data["dotted_decimal_identifier"]).to eq("123.456.789")
86
- end
87
-
88
- it "includes the version in lock data" do
89
- expect(cookbook_lock_data["version"]).to eq("1.2.3")
90
- end
91
-
92
- it "includes the source_options in lock data" do
93
- expect(cookbook_lock_data["source_options"]).to eq({ sourcekey: "location info" })
94
- end
95
-
96
- it "creates a CookbookLocationSpecification with the source and version data" do
97
- location_spec = cookbook_lock.cookbook_location_spec
98
- expect(location_spec.name).to eq(cookbook_name)
99
- expect(location_spec.version_constraint).to eq(Semverse::Constraint.new("= 1.2.3"))
100
- expect(location_spec.source_options).to eq({ sourcekey: "location info" })
101
- end
102
-
103
- it "delegates #dependencies to cookbook_location_spec" do
104
- deps = [ [ "foo", ">= 0.0.0"], [ "bar", "~> 2.1" ] ]
105
- expect(cookbook_lock.cookbook_location_spec).to receive(:dependencies).and_return(deps)
106
- expect(cookbook_lock.dependencies).to eq(deps)
107
- end
108
-
109
- it "delegates #installed? to the CookbookLocationSpecification" do
110
- location_spec = cookbook_lock.cookbook_location_spec
111
- expect(location_spec).to receive(:installed?).and_return(true)
112
- expect(cookbook_lock).to be_installed
113
- expect(location_spec).to receive(:installed?).and_return(false)
114
- expect(cookbook_lock).to_not be_installed
115
- end
116
-
117
- end
118
-
119
- context "when created from lock data" do
120
-
121
- let(:lock_data) do
122
- {
123
- "identifier" => "my-opaque-id",
124
- "dotted_decimal_identifier" => "123.456.789",
125
- "version" => "1.2.3",
126
- "source_options" => { "sourcekey" => "location info" },
127
- "cache_key" => nil,
128
- "source" => "cookbooks_local_path",
129
- }
130
- end
131
-
132
- before do
133
- cookbook_lock.build_from_lock_data(lock_data)
134
- end
135
-
136
- it "sets the identifier attribute" do
137
- expect(cookbook_lock.identifier).to eq("my-opaque-id")
138
- end
139
-
140
- it "sets the dotted_decimal_identifier attribute" do
141
- expect(cookbook_lock.dotted_decimal_identifier).to eq("123.456.789")
142
- end
143
-
144
- it "sets the version attribute" do
145
- expect(cookbook_lock.version).to eq("1.2.3")
146
- end
147
-
148
- it "sets the source options" do
149
- expect(cookbook_lock.source_options).to eq({ sourcekey: "location info" })
150
- end
151
- end
152
-
153
- end
154
-
155
- describe ChefDK::Policyfile::CachedCookbook do
156
-
157
- let(:cookbook_name) { "nginx" }
158
-
159
- let(:storage_config) { ChefDK::Policyfile::StorageConfig.new }
160
-
161
- let(:cookbook_lock) do
162
- described_class.new(cookbook_name, storage_config)
163
- end
164
-
165
- include_examples "Cookbook Lock"
166
-
167
- it "has a cache_key attribute" do
168
- cookbook_lock.cache_key = "nginx-1.0.0-example.com"
169
- expect(cookbook_lock.cache_key).to eq("nginx-1.0.0-example.com")
170
- end
171
-
172
- it "has an origin attribute" do
173
- cookbook_lock.origin = "https://artifacts.example.com/nginx/1.0.0/download"
174
- expect(cookbook_lock.origin).to eq("https://artifacts.example.com/nginx/1.0.0/download")
175
- end
176
-
177
- it "errors locating the cookbook when the cache key is not set" do
178
- expect { cookbook_lock.cookbook_path }.to raise_error(ChefDK::MissingCookbookLockData)
179
- end
180
-
181
- it "ignores calls to #refresh!" do
182
- expect { cookbook_lock.refresh! }.to_not raise_error
183
- end
184
-
185
- context "when populated with valid data" do
186
-
187
- let(:cookbook_name) { "foo" }
188
-
189
- let(:cache_path) { File.join(fixtures_path, "cached_cookbooks") }
190
-
191
- before do
192
- cookbook_lock.cache_key = "foo-1.0.0"
193
-
194
- storage_config.cache_path = cache_path
195
- end
196
-
197
- it "gives the path to the cookbook in the cache" do
198
- expect(cookbook_lock.cookbook_path).to eq(File.join(cache_path, "foo-1.0.0"))
199
- end
200
-
201
- end
202
-
203
- end
204
-
205
- describe ChefDK::Policyfile::LocalCookbook do
206
-
207
- let(:cookbook_name) { "nginx" }
208
-
209
- let(:storage_config) { ChefDK::Policyfile::StorageConfig.new }
210
-
211
- let(:scm_profiler) { instance_double("ChefDK::CookbookProfiler::Git", profile_data: {}) }
212
-
213
- let(:cookbook_lock) do
214
- lock = described_class.new(cookbook_name, storage_config)
215
- allow(lock).to receive(:scm_profiler).and_return(scm_profiler)
216
- lock
217
- end
218
-
219
- include_examples "Cookbook Lock"
220
-
221
- describe "gathering identifier info" do
222
- let(:identifiers) do
223
- instance_double("ChefDK::CookbookProfiler::Identifiers",
224
- content_identifier: "abc123",
225
- dotted_decimal_identifier: "111.222.333",
226
- semver_version: "1.2.3")
227
- end
228
-
229
- before do
230
- allow(cookbook_lock).to receive(:identifiers).and_return(identifiers)
231
- cookbook_lock.gather_profile_data
232
- end
233
-
234
- it "sets the content identifier" do
235
- expect(cookbook_lock.identifier).to eq("abc123")
236
- end
237
-
238
- it "sets the backwards compatible dotted decimal identifer equivalent" do
239
- expect(cookbook_lock.dotted_decimal_identifier).to eq("111.222.333")
240
- end
241
-
242
- it "collects the 'real' SemVer version of the cookbook" do
243
- expect(cookbook_lock.version).to eq("1.2.3")
244
- end
245
-
246
- end
247
-
248
- describe "selecting an SCM profiler" do
249
-
250
- let(:cookbook_source_relpath) { "nginx" }
251
-
252
- let(:cookbook_source_path) do
253
- path = File.join(tempdir, cookbook_source_relpath)
254
- FileUtils.mkdir_p(path)
255
- path
256
- end
257
-
258
- # everywhere else, #scm_profiler is stubbed, we need the unstubbed version
259
- let(:cookbook_lock) do
260
- described_class.new(cookbook_name, storage_config)
261
- end
262
-
263
- before do
264
- cookbook_lock.source = cookbook_source_path
265
- end
266
-
267
- after do
268
- clear_tempdir
269
- end
270
-
271
- context "when the cookbook is in a git-repo" do
272
-
273
- before do
274
- FileUtils.mkdir_p(git_dir_path)
275
- end
276
-
277
- context "when the cookbook is a self-contained git repo" do
278
-
279
- let(:git_dir_path) { File.join(cookbook_source_path, ".git") }
280
-
281
- it "selects the git profiler" do
282
- expect(cookbook_lock.scm_profiler).to be_an_instance_of(ChefDK::CookbookProfiler::Git)
283
- end
284
-
285
- end
286
-
287
- context "when the cookbook is a subdirectory of a git repo" do
288
-
289
- let(:cookbook_source_relpath) { "cookbook_repo/nginx" }
290
-
291
- let(:git_dir_path) { File.join(tempdir, "cookbook_repo/.git") }
292
-
293
- it "selects the git profiler" do
294
- expect(cookbook_lock.scm_profiler).to be_an_instance_of(ChefDK::CookbookProfiler::Git)
295
- end
296
-
297
- end
298
-
299
- end
300
-
301
- context "when the cookbook is not in a git repo" do
302
-
303
- it "selects the null profiler" do
304
- expect(cookbook_lock.scm_profiler).to be_an_instance_of(ChefDK::CookbookProfiler::NullSCM)
305
- end
306
-
307
- end
308
-
309
- end
310
-
311
- context "when loading data from a serialized form" do
312
-
313
- let(:previous_lock_data) do
314
- {
315
- "identifier" => "abc123",
316
- "dotted_decimal_identifier" => "111.222.333",
317
- "version" => "1.2.3",
318
- "source" => "../my_repo/nginx",
319
- "source_options" => {
320
- "path" => "../my_repo/nginx",
321
- },
322
- "cache_key" => nil,
323
- }
324
- end
325
-
326
- before do
327
- cookbook_lock.build_from_lock_data(previous_lock_data)
328
- end
329
-
330
- it "sets the identifier" do
331
- expect(cookbook_lock.identifier).to eq("abc123")
332
- end
333
-
334
- it "sets the dotted_decimal_identifier" do
335
- expect(cookbook_lock.dotted_decimal_identifier).to eq("111.222.333")
336
- end
337
-
338
- it "sets the version" do
339
- expect(cookbook_lock.version).to eq("1.2.3")
340
- end
341
-
342
- it "sets the source attribute" do
343
- expect(cookbook_lock.source).to eq("../my_repo/nginx")
344
- end
345
-
346
- it "sets the source options, symbolizing keys so the data is compatible with CookbookLocationSpecification" do
347
- expected = { path: "../my_repo/nginx" }
348
- expect(cookbook_lock.source_options).to eq(expected)
349
- end
350
-
351
- it "doesn't refresh scm_data when #lock_data is called" do
352
- allow(scm_profiler).to receive(:profile_data).and_raise("This shouldn't get called")
353
- cookbook_lock.lock_data
354
- end
355
-
356
- context "after the data has been refreshed" do
357
-
358
- before do
359
- allow(cookbook_lock).to receive(:identifiers).and_return(identifiers)
360
- cookbook_lock.refresh!
361
- end
362
-
363
- context "and the underlying hasn't been mutated" do
364
-
365
- let(:identifiers) do
366
- instance_double("ChefDK::CookbookProfiler::Identifiers",
367
- content_identifier: "abc123",
368
- dotted_decimal_identifier: "111.222.333",
369
- semver_version: "1.2.3")
370
- end
371
-
372
- it "has the correct identifier" do
373
- expect(cookbook_lock.identifier).to eq("abc123")
374
- end
375
-
376
- it "has the correct dotted_decimal_identifier" do
377
- expect(cookbook_lock.dotted_decimal_identifier).to eq("111.222.333")
378
- end
379
-
380
- it "has the correct version" do
381
- expect(cookbook_lock.version).to eq("1.2.3")
382
- end
383
-
384
- it "sets the updated flag to false" do
385
- expect(cookbook_lock).to_not be_updated
386
- end
387
-
388
- it "sets the version_updated flag to false" do
389
- expect(cookbook_lock.version_updated?).to be(false)
390
- end
391
-
392
- it "sets the identifier_updated flag to false" do
393
- expect(cookbook_lock.identifier_updated?).to be(false)
394
- end
395
-
396
- end
397
-
398
- context "and the underlying data has been mutated" do
399
- # represents the updated state of the cookbook
400
- let(:identifiers) do
401
- instance_double("ChefDK::CookbookProfiler::Identifiers",
402
- content_identifier: "def456",
403
- dotted_decimal_identifier: "777.888.999",
404
- semver_version: "7.8.9")
405
- end
406
-
407
- it "sets the content identifier to the new identifier" do
408
- expect(cookbook_lock.identifier).to eq("def456")
409
- end
410
-
411
- it "sets the dotted_decimal_identifier to the new identifier" do
412
- expect(cookbook_lock.dotted_decimal_identifier).to eq("777.888.999")
413
- end
414
-
415
- it "sets the SemVer version to the new version" do
416
- expect(cookbook_lock.version).to eq("7.8.9")
417
- end
418
-
419
- it "sets the updated flag to true" do
420
- expect(cookbook_lock).to be_updated
421
- end
422
-
423
- it "sets the version_updated flag to true" do
424
- expect(cookbook_lock.version_updated?).to be(true)
425
- end
426
-
427
- it "sets the identifier_updated flag to true" do
428
- expect(cookbook_lock.identifier_updated?).to be(true)
429
- end
430
- end
431
- end
432
- end
433
-
434
- end
435
-
436
- describe ChefDK::Policyfile::ArchivedCookbook do
437
-
438
- let(:cookbook_name) { "nginx" }
439
-
440
- let(:storage_config) { ChefDK::Policyfile::StorageConfig.new }
441
-
442
- let(:wrapped_cookbook_lock_data) do
443
- {
444
- "identifier" => "abc123",
445
- "dotted_decimal_identifier" => "111.222.333",
446
- "version" => "1.2.3",
447
- "source" => "../my_repo/nginx",
448
- "source_options" => {
449
- # when getting the cookbook location spec, source options needs to have
450
- # symbolic keys, so a round trip via LocalCookbook#build_from_lock_data
451
- # will result in this being a symbol
452
- path: "../my_repo/nginx",
453
- },
454
- "cache_key" => nil,
455
- "scm_info" => {},
456
- }
457
- end
458
-
459
- let(:wrapped_cookbook_lock) do
460
- lock = ChefDK::Policyfile::LocalCookbook.new(cookbook_name, storage_config)
461
- allow(lock).to receive(:scm_info).and_return({})
462
- lock.build_from_lock_data(wrapped_cookbook_lock_data)
463
- lock
464
- end
465
-
466
- let(:cookbook_lock) do
467
- described_class.new(wrapped_cookbook_lock, storage_config)
468
- end
469
-
470
- let(:archived_cookbook_path) { File.join(storage_config.relative_paths_root, "cookbook_artifacts", "nginx-abc123") }
471
-
472
- it "sets cookbook_path to the path within the archive" do
473
- expect(cookbook_lock.cookbook_path).to eq(archived_cookbook_path)
474
- end
475
-
476
- it "implements build_from_lock_data" do
477
- msg = "ArchivedCookbook cannot be built from lock data, it can only wrap an existing lock object"
478
- expect { cookbook_lock.build_from_lock_data({}) }.to raise_error(NotImplementedError, msg)
479
- end
480
-
481
- it "implements validate!" do
482
- expect(cookbook_lock.validate!).to be(true)
483
- end
484
-
485
- it "implements refresh!" do
486
- expect(cookbook_lock.refresh!).to be(true)
487
- end
488
-
489
- it "implements installed?" do
490
- allow(File).to receive(:exist?).with(archived_cookbook_path).and_return(false)
491
- allow(File).to receive(:directory?).with(archived_cookbook_path).and_return(false)
492
- expect(cookbook_lock.installed?).to be(false)
493
- allow(File).to receive(:exist?).with(archived_cookbook_path).and_return(true)
494
- allow(File).to receive(:directory?).with(archived_cookbook_path).and_return(true)
495
- expect(cookbook_lock.installed?).to be(true)
496
- end
497
-
498
- describe "delegated behavior" do
499
-
500
- it "sets the identifier" do
501
- expect(cookbook_lock.identifier).to eq("abc123")
502
- end
503
-
504
- it "sets the dotted_decimal_identifier" do
505
- expect(cookbook_lock.dotted_decimal_identifier).to eq("111.222.333")
506
- end
507
-
508
- it "sets the version" do
509
- expect(cookbook_lock.version).to eq("1.2.3")
510
- end
511
-
512
- it "sets the source attribute" do
513
- expect(cookbook_lock.source).to eq("../my_repo/nginx")
514
- end
515
-
516
- it "sets the source options, symbolizing keys so the data is compatible with CookbookLocationSpecification" do
517
- expected = { path: "../my_repo/nginx" }
518
- expect(cookbook_lock.source_options).to eq(expected)
519
- end
520
-
521
- it "returns unchanged data when calling to_lock" do
522
- expect(cookbook_lock.to_lock).to eq(wrapped_cookbook_lock_data)
523
- end
524
-
525
- end
526
-
527
- end
1
+ #
2
+ # Copyright:: Copyright (c) 2014-2018 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 "spec_helper"
19
+ require "chef-dk/policyfile/cookbook_locks"
20
+
21
+ shared_examples_for "Cookbook Lock" do
22
+
23
+ let(:cookbook_lock_data) { cookbook_lock.to_lock }
24
+
25
+ it "has a cookbook name" do
26
+ expect(cookbook_lock.name).to eq(cookbook_name)
27
+ end
28
+
29
+ it "has a source_options attribute" do
30
+ cookbook_lock.source_options = { artifactserver: "https://artifacts.example.com/nginx/1.0.0/download" }
31
+ expect(cookbook_lock.source_options).to eq({ artifactserver: "https://artifacts.example.com/nginx/1.0.0/download" })
32
+ end
33
+
34
+ it "has an identifier attribute" do
35
+ cookbook_lock.identifier = "my-opaque-id"
36
+ expect(cookbook_lock.identifier).to eq("my-opaque-id")
37
+ end
38
+
39
+ it "has a dotted_decimal_identifier attribute" do
40
+ cookbook_lock.dotted_decimal_identifier = "123.456.789"
41
+ expect(cookbook_lock.dotted_decimal_identifier).to eq("123.456.789")
42
+ end
43
+
44
+ it "has a version attribute" do
45
+ cookbook_lock.version = "1.2.3"
46
+ expect(cookbook_lock.version).to eq("1.2.3")
47
+ end
48
+
49
+ it "has a storage config" do
50
+ expect(cookbook_lock.storage_config).to eq(storage_config)
51
+ end
52
+
53
+ context "when the underlying cookbook has not been mutated, or #refresh! has not been called" do
54
+
55
+ it "is not updated" do
56
+ expect(cookbook_lock).to_not be_updated
57
+ end
58
+
59
+ it "does not have an updated identifier" do
60
+ expect(cookbook_lock.identifier_updated?).to be false
61
+ end
62
+
63
+ it "does not have an updated version" do
64
+ expect(cookbook_lock.version_updated?).to be false
65
+ end
66
+
67
+ end
68
+
69
+ context "when version and identifier attributes are populated" do
70
+
71
+ before do
72
+ allow(cookbook_lock).to receive(:validate!)
73
+
74
+ cookbook_lock.identifier = "my-opaque-id"
75
+ cookbook_lock.dotted_decimal_identifier = "123.456.789"
76
+ cookbook_lock.version = "1.2.3"
77
+ cookbook_lock.source_options = { sourcekey: "location info" }
78
+ end
79
+
80
+ it "includes the identifier in the lock data" do
81
+ expect(cookbook_lock_data["identifier"]).to eq("my-opaque-id")
82
+ end
83
+
84
+ it "includes the dotted decimal identifier in the lock data" do
85
+ expect(cookbook_lock_data["dotted_decimal_identifier"]).to eq("123.456.789")
86
+ end
87
+
88
+ it "includes the version in lock data" do
89
+ expect(cookbook_lock_data["version"]).to eq("1.2.3")
90
+ end
91
+
92
+ it "includes the source_options in lock data" do
93
+ expect(cookbook_lock_data["source_options"]).to eq({ sourcekey: "location info" })
94
+ end
95
+
96
+ it "creates a CookbookLocationSpecification with the source and version data" do
97
+ location_spec = cookbook_lock.cookbook_location_spec
98
+ expect(location_spec.name).to eq(cookbook_name)
99
+ expect(location_spec.version_constraint).to eq(Semverse::Constraint.new("= 1.2.3"))
100
+ expect(location_spec.source_options).to eq({ sourcekey: "location info" })
101
+ end
102
+
103
+ it "delegates #dependencies to cookbook_location_spec" do
104
+ deps = [ [ "foo", ">= 0.0.0"], [ "bar", "~> 2.1" ] ]
105
+ expect(cookbook_lock.cookbook_location_spec).to receive(:dependencies).and_return(deps)
106
+ expect(cookbook_lock.dependencies).to eq(deps)
107
+ end
108
+
109
+ it "delegates #installed? to the CookbookLocationSpecification" do
110
+ location_spec = cookbook_lock.cookbook_location_spec
111
+ expect(location_spec).to receive(:installed?).and_return(true)
112
+ expect(cookbook_lock).to be_installed
113
+ expect(location_spec).to receive(:installed?).and_return(false)
114
+ expect(cookbook_lock).to_not be_installed
115
+ end
116
+
117
+ end
118
+
119
+ context "when created from lock data" do
120
+
121
+ let(:lock_data) do
122
+ {
123
+ "identifier" => "my-opaque-id",
124
+ "dotted_decimal_identifier" => "123.456.789",
125
+ "version" => "1.2.3",
126
+ "source_options" => { "sourcekey" => "location info" },
127
+ "cache_key" => nil,
128
+ "source" => "cookbooks_local_path",
129
+ }
130
+ end
131
+
132
+ before do
133
+ cookbook_lock.build_from_lock_data(lock_data)
134
+ end
135
+
136
+ it "sets the identifier attribute" do
137
+ expect(cookbook_lock.identifier).to eq("my-opaque-id")
138
+ end
139
+
140
+ it "sets the dotted_decimal_identifier attribute" do
141
+ expect(cookbook_lock.dotted_decimal_identifier).to eq("123.456.789")
142
+ end
143
+
144
+ it "sets the version attribute" do
145
+ expect(cookbook_lock.version).to eq("1.2.3")
146
+ end
147
+
148
+ it "sets the source options" do
149
+ expect(cookbook_lock.source_options).to eq({ sourcekey: "location info" })
150
+ end
151
+ end
152
+
153
+ end
154
+
155
+ describe ChefDK::Policyfile::CachedCookbook do
156
+
157
+ let(:cookbook_name) { "nginx" }
158
+
159
+ let(:storage_config) { ChefDK::Policyfile::StorageConfig.new }
160
+
161
+ let(:cookbook_lock) do
162
+ described_class.new(cookbook_name, storage_config)
163
+ end
164
+
165
+ include_examples "Cookbook Lock"
166
+
167
+ it "has a cache_key attribute" do
168
+ cookbook_lock.cache_key = "nginx-1.0.0-example.com"
169
+ expect(cookbook_lock.cache_key).to eq("nginx-1.0.0-example.com")
170
+ end
171
+
172
+ it "has an origin attribute" do
173
+ cookbook_lock.origin = "https://artifacts.example.com/nginx/1.0.0/download"
174
+ expect(cookbook_lock.origin).to eq("https://artifacts.example.com/nginx/1.0.0/download")
175
+ end
176
+
177
+ it "errors locating the cookbook when the cache key is not set" do
178
+ expect { cookbook_lock.cookbook_path }.to raise_error(ChefDK::MissingCookbookLockData)
179
+ end
180
+
181
+ it "ignores calls to #refresh!" do
182
+ expect { cookbook_lock.refresh! }.to_not raise_error
183
+ end
184
+
185
+ context "when populated with valid data" do
186
+
187
+ let(:cookbook_name) { "foo" }
188
+
189
+ let(:cache_path) { File.join(fixtures_path, "cached_cookbooks") }
190
+
191
+ before do
192
+ cookbook_lock.cache_key = "foo-1.0.0"
193
+
194
+ storage_config.cache_path = cache_path
195
+ end
196
+
197
+ it "gives the path to the cookbook in the cache" do
198
+ expect(cookbook_lock.cookbook_path).to eq(File.join(cache_path, "foo-1.0.0"))
199
+ end
200
+
201
+ end
202
+
203
+ end
204
+
205
+ describe ChefDK::Policyfile::LocalCookbook do
206
+
207
+ let(:cookbook_name) { "nginx" }
208
+
209
+ let(:storage_config) { ChefDK::Policyfile::StorageConfig.new }
210
+
211
+ let(:scm_profiler) { instance_double("ChefDK::CookbookProfiler::Git", profile_data: {}) }
212
+
213
+ let(:cookbook_lock) do
214
+ lock = described_class.new(cookbook_name, storage_config)
215
+ allow(lock).to receive(:scm_profiler).and_return(scm_profiler)
216
+ lock
217
+ end
218
+
219
+ include_examples "Cookbook Lock"
220
+
221
+ describe "gathering identifier info" do
222
+ let(:identifiers) do
223
+ instance_double("ChefDK::CookbookProfiler::Identifiers",
224
+ content_identifier: "abc123",
225
+ dotted_decimal_identifier: "111.222.333",
226
+ semver_version: "1.2.3")
227
+ end
228
+
229
+ before do
230
+ allow(cookbook_lock).to receive(:identifiers).and_return(identifiers)
231
+ cookbook_lock.gather_profile_data
232
+ end
233
+
234
+ it "sets the content identifier" do
235
+ expect(cookbook_lock.identifier).to eq("abc123")
236
+ end
237
+
238
+ it "sets the backwards compatible dotted decimal identifer equivalent" do
239
+ expect(cookbook_lock.dotted_decimal_identifier).to eq("111.222.333")
240
+ end
241
+
242
+ it "collects the 'real' SemVer version of the cookbook" do
243
+ expect(cookbook_lock.version).to eq("1.2.3")
244
+ end
245
+
246
+ end
247
+
248
+ describe "selecting an SCM profiler" do
249
+
250
+ let(:cookbook_source_relpath) { "nginx" }
251
+
252
+ let(:cookbook_source_path) do
253
+ path = File.join(tempdir, cookbook_source_relpath)
254
+ FileUtils.mkdir_p(path)
255
+ path
256
+ end
257
+
258
+ # everywhere else, #scm_profiler is stubbed, we need the unstubbed version
259
+ let(:cookbook_lock) do
260
+ described_class.new(cookbook_name, storage_config)
261
+ end
262
+
263
+ before do
264
+ cookbook_lock.source = cookbook_source_path
265
+ end
266
+
267
+ after do
268
+ clear_tempdir
269
+ end
270
+
271
+ context "when the cookbook is in a git-repo" do
272
+
273
+ before do
274
+ FileUtils.mkdir_p(git_dir_path)
275
+ end
276
+
277
+ context "when the cookbook is a self-contained git repo" do
278
+
279
+ let(:git_dir_path) { File.join(cookbook_source_path, ".git") }
280
+
281
+ it "selects the git profiler" do
282
+ expect(cookbook_lock.scm_profiler).to be_an_instance_of(ChefDK::CookbookProfiler::Git)
283
+ end
284
+
285
+ end
286
+
287
+ context "when the cookbook is a subdirectory of a git repo" do
288
+
289
+ let(:cookbook_source_relpath) { "cookbook_repo/nginx" }
290
+
291
+ let(:git_dir_path) { File.join(tempdir, "cookbook_repo/.git") }
292
+
293
+ it "selects the git profiler" do
294
+ expect(cookbook_lock.scm_profiler).to be_an_instance_of(ChefDK::CookbookProfiler::Git)
295
+ end
296
+
297
+ end
298
+
299
+ end
300
+
301
+ context "when the cookbook is not in a git repo" do
302
+
303
+ it "selects the null profiler" do
304
+ expect(cookbook_lock.scm_profiler).to be_an_instance_of(ChefDK::CookbookProfiler::NullSCM)
305
+ end
306
+
307
+ end
308
+
309
+ end
310
+
311
+ context "when loading data from a serialized form" do
312
+
313
+ let(:previous_lock_data) do
314
+ {
315
+ "identifier" => "abc123",
316
+ "dotted_decimal_identifier" => "111.222.333",
317
+ "version" => "1.2.3",
318
+ "source" => "../my_repo/nginx",
319
+ "source_options" => {
320
+ "path" => "../my_repo/nginx",
321
+ },
322
+ "cache_key" => nil,
323
+ }
324
+ end
325
+
326
+ before do
327
+ cookbook_lock.build_from_lock_data(previous_lock_data)
328
+ end
329
+
330
+ it "sets the identifier" do
331
+ expect(cookbook_lock.identifier).to eq("abc123")
332
+ end
333
+
334
+ it "sets the dotted_decimal_identifier" do
335
+ expect(cookbook_lock.dotted_decimal_identifier).to eq("111.222.333")
336
+ end
337
+
338
+ it "sets the version" do
339
+ expect(cookbook_lock.version).to eq("1.2.3")
340
+ end
341
+
342
+ it "sets the source attribute" do
343
+ expect(cookbook_lock.source).to eq("../my_repo/nginx")
344
+ end
345
+
346
+ it "sets the source options, symbolizing keys so the data is compatible with CookbookLocationSpecification" do
347
+ expected = { path: "../my_repo/nginx" }
348
+ expect(cookbook_lock.source_options).to eq(expected)
349
+ end
350
+
351
+ it "doesn't refresh scm_data when #lock_data is called" do
352
+ allow(scm_profiler).to receive(:profile_data).and_raise("This shouldn't get called")
353
+ cookbook_lock.lock_data
354
+ end
355
+
356
+ context "after the data has been refreshed" do
357
+
358
+ before do
359
+ allow(cookbook_lock).to receive(:identifiers).and_return(identifiers)
360
+ cookbook_lock.refresh!
361
+ end
362
+
363
+ context "and the underlying hasn't been mutated" do
364
+
365
+ let(:identifiers) do
366
+ instance_double("ChefDK::CookbookProfiler::Identifiers",
367
+ content_identifier: "abc123",
368
+ dotted_decimal_identifier: "111.222.333",
369
+ semver_version: "1.2.3")
370
+ end
371
+
372
+ it "has the correct identifier" do
373
+ expect(cookbook_lock.identifier).to eq("abc123")
374
+ end
375
+
376
+ it "has the correct dotted_decimal_identifier" do
377
+ expect(cookbook_lock.dotted_decimal_identifier).to eq("111.222.333")
378
+ end
379
+
380
+ it "has the correct version" do
381
+ expect(cookbook_lock.version).to eq("1.2.3")
382
+ end
383
+
384
+ it "sets the updated flag to false" do
385
+ expect(cookbook_lock).to_not be_updated
386
+ end
387
+
388
+ it "sets the version_updated flag to false" do
389
+ expect(cookbook_lock.version_updated?).to be(false)
390
+ end
391
+
392
+ it "sets the identifier_updated flag to false" do
393
+ expect(cookbook_lock.identifier_updated?).to be(false)
394
+ end
395
+
396
+ end
397
+
398
+ context "and the underlying data has been mutated" do
399
+ # represents the updated state of the cookbook
400
+ let(:identifiers) do
401
+ instance_double("ChefDK::CookbookProfiler::Identifiers",
402
+ content_identifier: "def456",
403
+ dotted_decimal_identifier: "777.888.999",
404
+ semver_version: "7.8.9")
405
+ end
406
+
407
+ it "sets the content identifier to the new identifier" do
408
+ expect(cookbook_lock.identifier).to eq("def456")
409
+ end
410
+
411
+ it "sets the dotted_decimal_identifier to the new identifier" do
412
+ expect(cookbook_lock.dotted_decimal_identifier).to eq("777.888.999")
413
+ end
414
+
415
+ it "sets the SemVer version to the new version" do
416
+ expect(cookbook_lock.version).to eq("7.8.9")
417
+ end
418
+
419
+ it "sets the updated flag to true" do
420
+ expect(cookbook_lock).to be_updated
421
+ end
422
+
423
+ it "sets the version_updated flag to true" do
424
+ expect(cookbook_lock.version_updated?).to be(true)
425
+ end
426
+
427
+ it "sets the identifier_updated flag to true" do
428
+ expect(cookbook_lock.identifier_updated?).to be(true)
429
+ end
430
+ end
431
+ end
432
+ end
433
+
434
+ end
435
+
436
+ describe ChefDK::Policyfile::ArchivedCookbook do
437
+
438
+ let(:cookbook_name) { "nginx" }
439
+
440
+ let(:storage_config) { ChefDK::Policyfile::StorageConfig.new }
441
+
442
+ let(:wrapped_cookbook_lock_data) do
443
+ {
444
+ "identifier" => "abc123",
445
+ "dotted_decimal_identifier" => "111.222.333",
446
+ "version" => "1.2.3",
447
+ "source" => "../my_repo/nginx",
448
+ "source_options" => {
449
+ # when getting the cookbook location spec, source options needs to have
450
+ # symbolic keys, so a round trip via LocalCookbook#build_from_lock_data
451
+ # will result in this being a symbol
452
+ path: "../my_repo/nginx",
453
+ },
454
+ "cache_key" => nil,
455
+ "scm_info" => {},
456
+ }
457
+ end
458
+
459
+ let(:wrapped_cookbook_lock) do
460
+ lock = ChefDK::Policyfile::LocalCookbook.new(cookbook_name, storage_config)
461
+ allow(lock).to receive(:scm_info).and_return({})
462
+ lock.build_from_lock_data(wrapped_cookbook_lock_data)
463
+ lock
464
+ end
465
+
466
+ let(:cookbook_lock) do
467
+ described_class.new(wrapped_cookbook_lock, storage_config)
468
+ end
469
+
470
+ let(:archived_cookbook_path) { File.join(storage_config.relative_paths_root, "cookbook_artifacts", "nginx-abc123") }
471
+
472
+ it "sets cookbook_path to the path within the archive" do
473
+ expect(cookbook_lock.cookbook_path).to eq(archived_cookbook_path)
474
+ end
475
+
476
+ it "implements build_from_lock_data" do
477
+ msg = "ArchivedCookbook cannot be built from lock data, it can only wrap an existing lock object"
478
+ expect { cookbook_lock.build_from_lock_data({}) }.to raise_error(NotImplementedError, msg)
479
+ end
480
+
481
+ it "implements validate!" do
482
+ expect(cookbook_lock.validate!).to be(true)
483
+ end
484
+
485
+ it "implements refresh!" do
486
+ expect(cookbook_lock.refresh!).to be(true)
487
+ end
488
+
489
+ it "implements installed?" do
490
+ allow(File).to receive(:exist?).with(archived_cookbook_path).and_return(false)
491
+ allow(File).to receive(:directory?).with(archived_cookbook_path).and_return(false)
492
+ expect(cookbook_lock.installed?).to be(false)
493
+ allow(File).to receive(:exist?).with(archived_cookbook_path).and_return(true)
494
+ allow(File).to receive(:directory?).with(archived_cookbook_path).and_return(true)
495
+ expect(cookbook_lock.installed?).to be(true)
496
+ end
497
+
498
+ describe "delegated behavior" do
499
+
500
+ it "sets the identifier" do
501
+ expect(cookbook_lock.identifier).to eq("abc123")
502
+ end
503
+
504
+ it "sets the dotted_decimal_identifier" do
505
+ expect(cookbook_lock.dotted_decimal_identifier).to eq("111.222.333")
506
+ end
507
+
508
+ it "sets the version" do
509
+ expect(cookbook_lock.version).to eq("1.2.3")
510
+ end
511
+
512
+ it "sets the source attribute" do
513
+ expect(cookbook_lock.source).to eq("../my_repo/nginx")
514
+ end
515
+
516
+ it "sets the source options, symbolizing keys so the data is compatible with CookbookLocationSpecification" do
517
+ expected = { path: "../my_repo/nginx" }
518
+ expect(cookbook_lock.source_options).to eq(expected)
519
+ end
520
+
521
+ it "returns unchanged data when calling to_lock" do
522
+ expect(cookbook_lock.to_lock).to eq(wrapped_cookbook_lock_data)
523
+ end
524
+
525
+ end
526
+
527
+ end