chef-dk 3.0.36 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (377) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +124 -126
  3. data/Gemfile.lock +815 -812
  4. data/LICENSE +201 -201
  5. data/README.md +333 -333
  6. data/Rakefile +74 -74
  7. data/acceptance/.shared/kitchen_acceptance/.kitchen.digitalocean.yml +27 -27
  8. data/acceptance/.shared/kitchen_acceptance/.kitchen.ec2.yml +287 -287
  9. data/acceptance/.shared/kitchen_acceptance/.kitchen.vagrant.yml +52 -52
  10. data/acceptance/.shared/kitchen_acceptance/libraries/kitchen.rb +51 -51
  11. data/acceptance/.shared/kitchen_acceptance/metadata.rb +1 -1
  12. data/acceptance/Gemfile +21 -21
  13. data/acceptance/Gemfile.lock +334 -334
  14. data/acceptance/README.md +132 -132
  15. data/acceptance/trivial/.acceptance/acceptance-cookbook/.gitignore +2 -2
  16. data/acceptance/trivial/.acceptance/acceptance-cookbook/metadata.rb +2 -2
  17. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
  18. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
  19. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
  20. data/acceptance/trivial/.kitchen.yml +7 -7
  21. data/acceptance/trivial/test/integration/chefdk-current-install/inspec/chef_client_spec.rb +5 -5
  22. data/bin/chef +25 -25
  23. data/chef-dk.gemspec +60 -60
  24. data/lib/chef-dk.rb +19 -19
  25. data/lib/chef-dk/authenticated_http.rb +22 -22
  26. data/lib/chef-dk/builtin_commands.rb +59 -59
  27. data/lib/chef-dk/chef_runner.rb +114 -114
  28. data/lib/chef-dk/chef_server_api_multi.rb +73 -73
  29. data/lib/chef-dk/cli.rb +201 -201
  30. data/lib/chef-dk/command/base.rb +79 -79
  31. data/lib/chef-dk/command/clean_policy_cookbooks.rb +114 -114
  32. data/lib/chef-dk/command/clean_policy_revisions.rb +111 -111
  33. data/lib/chef-dk/command/delete_policy.rb +120 -120
  34. data/lib/chef-dk/command/delete_policy_group.rb +120 -120
  35. data/lib/chef-dk/command/diff.rb +315 -315
  36. data/lib/chef-dk/command/env.rb +89 -89
  37. data/lib/chef-dk/command/exec.rb +44 -44
  38. data/lib/chef-dk/command/export.rb +155 -155
  39. data/lib/chef-dk/command/gem.rb +47 -47
  40. data/lib/chef-dk/command/generate.rb +125 -125
  41. data/lib/chef-dk/command/generator_commands.rb +83 -83
  42. data/lib/chef-dk/command/generator_commands/app.rb +106 -106
  43. data/lib/chef-dk/command/generator_commands/attribute.rb +36 -36
  44. data/lib/chef-dk/command/generator_commands/base.rb +157 -157
  45. data/lib/chef-dk/command/generator_commands/build_cookbook.rb +125 -125
  46. data/lib/chef-dk/command/generator_commands/chef_exts/generator_desc_resource.rb +85 -85
  47. data/lib/chef-dk/command/generator_commands/chef_exts/quieter_doc_formatter.rb +38 -38
  48. data/lib/chef-dk/command/generator_commands/chef_exts/recipe_dsl_ext.rb +39 -39
  49. data/lib/chef-dk/command/generator_commands/cookbook.rb +241 -241
  50. data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +100 -100
  51. data/lib/chef-dk/command/generator_commands/cookbook_file.rb +45 -45
  52. data/lib/chef-dk/command/generator_commands/generator_generator.rb +174 -174
  53. data/lib/chef-dk/command/generator_commands/helpers.rb +36 -36
  54. data/lib/chef-dk/command/generator_commands/policyfile.rb +124 -124
  55. data/lib/chef-dk/command/generator_commands/recipe.rb +36 -36
  56. data/lib/chef-dk/command/generator_commands/repo.rb +123 -123
  57. data/lib/chef-dk/command/generator_commands/resource.rb +36 -36
  58. data/lib/chef-dk/command/generator_commands/template.rb +46 -46
  59. data/lib/chef-dk/command/install.rb +120 -120
  60. data/lib/chef-dk/command/provision.rb +436 -436
  61. data/lib/chef-dk/command/push.rb +117 -117
  62. data/lib/chef-dk/command/push_archive.rb +125 -125
  63. data/lib/chef-dk/command/shell_init.rb +179 -179
  64. data/lib/chef-dk/command/show_policy.rb +163 -163
  65. data/lib/chef-dk/command/undelete.rb +154 -154
  66. data/lib/chef-dk/command/update.rb +133 -133
  67. data/lib/chef-dk/command/verify.rb +629 -629
  68. data/lib/chef-dk/commands_map.rb +113 -113
  69. data/lib/chef-dk/completions/bash.sh.erb +5 -5
  70. data/lib/chef-dk/completions/chef.fish.erb +10 -10
  71. data/lib/chef-dk/completions/zsh.zsh.erb +21 -21
  72. data/lib/chef-dk/component_test.rb +227 -227
  73. data/lib/chef-dk/configurable.rb +88 -88
  74. data/lib/chef-dk/cookbook_metadata.rb +45 -45
  75. data/lib/chef-dk/cookbook_omnifetch.rb +32 -32
  76. data/lib/chef-dk/cookbook_profiler/git.rb +152 -152
  77. data/lib/chef-dk/cookbook_profiler/identifiers.rb +72 -72
  78. data/lib/chef-dk/cookbook_profiler/null_scm.rb +31 -31
  79. data/lib/chef-dk/exceptions.rb +151 -151
  80. data/lib/chef-dk/generator.rb +165 -165
  81. data/lib/chef-dk/helpers.rb +176 -176
  82. data/lib/chef-dk/pager.rb +104 -104
  83. data/lib/chef-dk/policyfile/artifactory_cookbook_source.rb +102 -102
  84. data/lib/chef-dk/policyfile/attribute_merge_checker.rb +110 -110
  85. data/lib/chef-dk/policyfile/chef_repo_cookbook_source.rb +138 -138
  86. data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +99 -99
  87. data/lib/chef-dk/policyfile/chef_server_lock_fetcher.rb +167 -167
  88. data/lib/chef-dk/policyfile/community_cookbook_source.rb +95 -95
  89. data/lib/chef-dk/policyfile/comparison_base.rb +123 -123
  90. data/lib/chef-dk/policyfile/cookbook_location_specification.rb +154 -154
  91. data/lib/chef-dk/policyfile/cookbook_locks.rb +466 -466
  92. data/lib/chef-dk/policyfile/cookbook_sources.rb +23 -23
  93. data/lib/chef-dk/policyfile/delivery_supermarket_source.rb +89 -89
  94. data/lib/chef-dk/policyfile/differ.rb +263 -263
  95. data/lib/chef-dk/policyfile/dsl.rb +288 -288
  96. data/lib/chef-dk/policyfile/git_lock_fetcher.rb +265 -265
  97. data/lib/chef-dk/policyfile/included_policies_cookbook_source.rb +156 -156
  98. data/lib/chef-dk/policyfile/lister.rb +229 -229
  99. data/lib/chef-dk/policyfile/local_lock_fetcher.rb +129 -129
  100. data/lib/chef-dk/policyfile/lock_applier.rb +80 -80
  101. data/lib/chef-dk/policyfile/null_cookbook_source.rb +49 -49
  102. data/lib/chef-dk/policyfile/policyfile_location_specification.rb +125 -125
  103. data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -124
  104. data/lib/chef-dk/policyfile/reports/install.rb +69 -69
  105. data/lib/chef-dk/policyfile/reports/table_printer.rb +57 -57
  106. data/lib/chef-dk/policyfile/reports/upload.rb +70 -70
  107. data/lib/chef-dk/policyfile/solution_dependencies.rb +311 -311
  108. data/lib/chef-dk/policyfile/source_uri.rb +57 -57
  109. data/lib/chef-dk/policyfile/storage_config.rb +112 -112
  110. data/lib/chef-dk/policyfile/undo_record.rb +139 -139
  111. data/lib/chef-dk/policyfile/undo_stack.rb +128 -128
  112. data/lib/chef-dk/policyfile/uploader.rb +213 -213
  113. data/lib/chef-dk/policyfile_compiler.rb +528 -528
  114. data/lib/chef-dk/policyfile_lock.rb +581 -581
  115. data/lib/chef-dk/policyfile_services/clean_policies.rb +95 -95
  116. data/lib/chef-dk/policyfile_services/clean_policy_cookbooks.rb +123 -123
  117. data/lib/chef-dk/policyfile_services/export_repo.rb +419 -419
  118. data/lib/chef-dk/policyfile_services/install.rb +162 -162
  119. data/lib/chef-dk/policyfile_services/push.rb +112 -112
  120. data/lib/chef-dk/policyfile_services/push_archive.rb +164 -164
  121. data/lib/chef-dk/policyfile_services/rm_policy.rb +141 -141
  122. data/lib/chef-dk/policyfile_services/rm_policy_group.rb +85 -85
  123. data/lib/chef-dk/policyfile_services/show_policy.rb +234 -234
  124. data/lib/chef-dk/policyfile_services/undelete.rb +108 -108
  125. data/lib/chef-dk/policyfile_services/update_attributes.rb +110 -110
  126. data/lib/chef-dk/service_exception_inspectors.rb +24 -24
  127. data/lib/chef-dk/service_exception_inspectors/base.rb +39 -39
  128. data/lib/chef-dk/service_exception_inspectors/http.rb +119 -119
  129. data/lib/chef-dk/service_exceptions.rb +142 -142
  130. data/lib/chef-dk/shell_out.rb +36 -36
  131. data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +4 -4
  132. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/.kitchen.yml +21 -21
  133. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/README.md +146 -146
  134. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +9 -9
  135. data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +104 -104
  136. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -9
  137. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README.md +66 -66
  138. data/lib/chef-dk/skeletons/code_generator/files/default/delivery-config.json +17 -17
  139. data/lib/chef-dk/skeletons/code_generator/files/default/delivery-project.toml +36 -36
  140. data/lib/chef-dk/skeletons/code_generator/files/default/gitignore +22 -22
  141. data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +24 -24
  142. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -27
  143. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +8 -8
  144. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +7 -7
  145. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +9 -9
  146. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +56 -56
  147. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +3 -3
  148. data/lib/chef-dk/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -6
  149. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +9 -9
  150. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/example.json +12 -12
  151. data/lib/chef-dk/skeletons/code_generator/files/default/repo/policies/README.md +24 -24
  152. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +9 -9
  153. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/example.json +12 -12
  154. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +3 -3
  155. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper_policyfile.rb +3 -3
  156. data/lib/chef-dk/skeletons/code_generator/metadata.rb +8 -8
  157. data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +89 -89
  158. data/lib/chef-dk/skeletons/code_generator/recipes/attribute.rb +13 -13
  159. data/lib/chef-dk/skeletons/code_generator/recipes/build_cookbook.rb +177 -177
  160. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +158 -158
  161. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook_file.rb +25 -25
  162. data/lib/chef-dk/skeletons/code_generator/recipes/helpers.rb +21 -21
  163. data/lib/chef-dk/skeletons/code_generator/recipes/policyfile.rb +9 -9
  164. data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +52 -52
  165. data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +68 -68
  166. data/lib/chef-dk/skeletons/code_generator/recipes/resource.rb +13 -13
  167. data/lib/chef-dk/skeletons/code_generator/recipes/template.rb +32 -32
  168. data/lib/chef-dk/skeletons/code_generator/templates/default/CHANGELOG.md.erb +11 -11
  169. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -3
  170. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.apachev2.erb +201 -201
  171. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -339
  172. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -674
  173. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -21
  174. data/lib/chef-dk/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -25
  175. data/lib/chef-dk/skeletons/code_generator/templates/default/README.md.erb +4 -4
  176. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/Berksfile.erb +7 -7
  177. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +10 -10
  178. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +8 -8
  179. data/lib/chef-dk/skeletons/code_generator/templates/default/helpers.rb.erb +39 -39
  180. data/lib/chef-dk/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +18 -18
  181. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen.yml.erb +26 -26
  182. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +33 -33
  183. data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +20 -20
  184. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +5 -5
  185. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe_spec.rb.erb +35 -35
  186. data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +128 -128
  187. data/lib/chef-dk/skeletons/code_generator/templates/default/resource.rb.erb +1 -1
  188. data/lib/chef-dk/ui.rb +57 -57
  189. data/lib/chef-dk/version.rb +20 -20
  190. data/lib/kitchen/provisioner/policyfile_zero.rb +195 -195
  191. data/omnibus_overrides.rb +25 -25
  192. data/spec/shared/a_file_generator.rb +125 -125
  193. data/spec/shared/a_generated_file.rb +12 -12
  194. data/spec/shared/command_with_ui_object.rb +11 -11
  195. data/spec/shared/custom_generator_cookbook.rb +136 -136
  196. data/spec/shared/fixture_cookbook_checksums.rb +46 -46
  197. data/spec/shared/setup_git_committer_config.rb +54 -54
  198. data/spec/shared/setup_git_cookbooks.rb +53 -53
  199. data/spec/spec_helper.rb +51 -51
  200. data/spec/test_helpers.rb +84 -84
  201. data/spec/unit/chef_runner_spec.rb +139 -139
  202. data/spec/unit/chef_server_api_multi_spec.rb +120 -120
  203. data/spec/unit/cli_spec.rb +377 -377
  204. data/spec/unit/command/base_spec.rb +172 -172
  205. data/spec/unit/command/clean_policy_cookbooks_spec.rb +180 -180
  206. data/spec/unit/command/clean_policy_revisions_spec.rb +180 -180
  207. data/spec/unit/command/delete_policy_group_spec.rb +206 -206
  208. data/spec/unit/command/delete_policy_spec.rb +206 -206
  209. data/spec/unit/command/diff_spec.rb +311 -311
  210. data/spec/unit/command/env_spec.rb +52 -52
  211. data/spec/unit/command/exec_spec.rb +178 -178
  212. data/spec/unit/command/export_spec.rb +199 -199
  213. data/spec/unit/command/generate_spec.rb +142 -142
  214. data/spec/unit/command/generator_commands/app_spec.rb +166 -166
  215. data/spec/unit/command/generator_commands/attribute_spec.rb +31 -31
  216. data/spec/unit/command/generator_commands/base_spec.rb +181 -181
  217. data/spec/unit/command/generator_commands/build_cookbook_spec.rb +377 -377
  218. data/spec/unit/command/generator_commands/chef_exts/generator_desc_resource_spec.rb +97 -97
  219. data/spec/unit/command/generator_commands/chef_exts/recipe_dsl_ext_spec.rb +111 -111
  220. data/spec/unit/command/generator_commands/cookbook_file_spec.rb +31 -31
  221. data/spec/unit/command/generator_commands/cookbook_spec.rb +765 -765
  222. data/spec/unit/command/generator_commands/generator_generator_spec.rb +227 -227
  223. data/spec/unit/command/generator_commands/helpers_spec.rb +31 -31
  224. data/spec/unit/command/generator_commands/policyfile_spec.rb +223 -223
  225. data/spec/unit/command/generator_commands/recipe_spec.rb +37 -37
  226. data/spec/unit/command/generator_commands/repo_spec.rb +374 -374
  227. data/spec/unit/command/generator_commands/resource_spec.rb +31 -31
  228. data/spec/unit/command/generator_commands/template_spec.rb +31 -31
  229. data/spec/unit/command/install_spec.rb +179 -179
  230. data/spec/unit/command/provision_spec.rb +589 -589
  231. data/spec/unit/command/push_archive_spec.rb +153 -153
  232. data/spec/unit/command/push_spec.rb +198 -198
  233. data/spec/unit/command/shell_init_spec.rb +339 -339
  234. data/spec/unit/command/show_policy_spec.rb +234 -234
  235. data/spec/unit/command/undelete_spec.rb +244 -244
  236. data/spec/unit/command/update_spec.rb +283 -283
  237. data/spec/unit/command/verify_spec.rb +341 -341
  238. data/spec/unit/commands_map_spec.rb +57 -57
  239. data/spec/unit/component_test_spec.rb +128 -128
  240. data/spec/unit/configurable_spec.rb +68 -68
  241. data/spec/unit/cookbook_metadata_spec.rb +96 -96
  242. data/spec/unit/cookbook_profiler/git_spec.rb +176 -176
  243. data/spec/unit/cookbook_profiler/identifiers_spec.rb +81 -81
  244. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -9
  245. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -9
  246. data/spec/unit/fixtures/command/cli_test_command.rb +26 -26
  247. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -7
  248. data/spec/unit/fixtures/configurable/test_config_loader.rb +5 -5
  249. data/spec/unit/fixtures/configurable/test_configurable.rb +10 -10
  250. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  251. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -3
  252. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  253. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -96
  254. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  255. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  256. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -16
  257. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -3
  258. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -4
  259. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -96
  260. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -8
  261. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -8
  262. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/.kitchen.yml +16 -16
  263. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -3
  264. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -4
  265. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -96
  266. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -8
  267. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -8
  268. data/spec/unit/fixtures/cookbooks_api/chef_server_universe.json +56 -56
  269. data/spec/unit/fixtures/cookbooks_api/pruned_chef_server_universe.json +30 -30
  270. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1321 -1321
  271. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -2987
  272. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -1
  273. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +33 -33
  274. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -16
  275. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -2
  276. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -5
  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/example_cookbook/.gitignore +17 -17
  280. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -16
  281. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -3
  282. data/spec/unit/fixtures/example_cookbook/README.md +4 -4
  283. data/spec/unit/fixtures/example_cookbook/chefignore +96 -96
  284. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -8
  285. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -8
  286. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -17
  287. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -16
  288. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -3
  289. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -4
  290. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -96
  291. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -5
  292. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -8
  293. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -17
  294. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -16
  295. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -3
  296. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -4
  297. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -96
  298. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -8
  299. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -4
  300. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -96
  301. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -8
  302. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -8
  303. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -3
  304. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -4
  305. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -96
  306. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -9
  307. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -8
  308. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -16
  309. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -3
  310. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -4
  311. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -96
  312. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -8
  313. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -8
  314. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -2
  315. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  316. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  317. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  318. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  319. data/spec/unit/generator_spec.rb +119 -119
  320. data/spec/unit/pager_spec.rb +117 -117
  321. data/spec/unit/policyfile/artifactory_cookbook_source_spec.rb +59 -59
  322. data/spec/unit/policyfile/attribute_merge_checker_spec.rb +80 -80
  323. data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -93
  324. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +55 -55
  325. data/spec/unit/policyfile/chef_server_lock_fetcher_spec.rb +161 -161
  326. data/spec/unit/policyfile/community_cookbook_source_spec.rb +83 -83
  327. data/spec/unit/policyfile/comparison_base_spec.rb +340 -340
  328. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +347 -347
  329. data/spec/unit/policyfile/cookbook_locks_spec.rb +527 -527
  330. data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +129 -129
  331. data/spec/unit/policyfile/differ_spec.rb +686 -686
  332. data/spec/unit/policyfile/git_lock_fetcher_spec.rb +155 -155
  333. data/spec/unit/policyfile/included_policies_cookbook_source_spec.rb +242 -242
  334. data/spec/unit/policyfile/lister_spec.rb +268 -268
  335. data/spec/unit/policyfile/local_lock_fetcher_spec.rb +173 -173
  336. data/spec/unit/policyfile/lock_applier_spec.rb +100 -100
  337. data/spec/unit/policyfile/null_cookbook_source_spec.rb +34 -34
  338. data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -92
  339. data/spec/unit/policyfile/reports/install_spec.rb +114 -114
  340. data/spec/unit/policyfile/reports/upload_spec.rb +94 -94
  341. data/spec/unit/policyfile/solution_dependencies_spec.rb +170 -170
  342. data/spec/unit/policyfile/source_uri_spec.rb +36 -36
  343. data/spec/unit/policyfile/storage_config_spec.rb +180 -180
  344. data/spec/unit/policyfile/undo_record_spec.rb +258 -258
  345. data/spec/unit/policyfile/undo_stack_spec.rb +265 -265
  346. data/spec/unit/policyfile/uploader_spec.rb +409 -409
  347. data/spec/unit/policyfile_demands_spec.rb +1197 -1197
  348. data/spec/unit/policyfile_evaluation_spec.rb +628 -628
  349. data/spec/unit/policyfile_includes_dsl_spec.rb +159 -159
  350. data/spec/unit/policyfile_includes_spec.rb +720 -720
  351. data/spec/unit/policyfile_install_with_includes_spec.rb +232 -232
  352. data/spec/unit/policyfile_lock_build_spec.rb +1065 -1065
  353. data/spec/unit/policyfile_lock_install_spec.rb +137 -137
  354. data/spec/unit/policyfile_lock_serialization_spec.rb +424 -424
  355. data/spec/unit/policyfile_lock_validation_spec.rb +608 -608
  356. data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -236
  357. data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +272 -272
  358. data/spec/unit/policyfile_services/export_repo_spec.rb +473 -473
  359. data/spec/unit/policyfile_services/install_spec.rb +209 -209
  360. data/spec/unit/policyfile_services/push_archive_spec.rb +359 -359
  361. data/spec/unit/policyfile_services/push_spec.rb +249 -249
  362. data/spec/unit/policyfile_services/rm_policy_group_spec.rb +237 -237
  363. data/spec/unit/policyfile_services/rm_policy_spec.rb +263 -263
  364. data/spec/unit/policyfile_services/show_policy_spec.rb +887 -887
  365. data/spec/unit/policyfile_services/undelete_spec.rb +302 -302
  366. data/spec/unit/policyfile_services/update_attributes_spec.rb +229 -229
  367. data/spec/unit/policyfile_services/update_spec.rb +140 -140
  368. data/spec/unit/service_exception_inspectors/base_spec.rb +41 -41
  369. data/spec/unit/service_exception_inspectors/http_spec.rb +138 -138
  370. data/spec/unit/shell_out_spec.rb +34 -34
  371. data/tasks/announce.rb +57 -57
  372. data/tasks/bin/bundle-platform.bat +2 -2
  373. data/tasks/dependencies.rb +89 -89
  374. data/tasks/templates/prerelease.md.erb +35 -35
  375. data/tasks/templates/release.md.erb +34 -34
  376. data/warning.txt +9 -9
  377. metadata +2 -2
@@ -1,409 +1,409 @@
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/uploader"
20
-
21
- # We load this here to ensure we get the "verifying doubles" behavior from
22
- # RSpec. It's not used by Policyfile::Uploader, but it's a collaborator.
23
- require "chef/server_api"
24
-
25
- describe ChefDK::Policyfile::Uploader do
26
-
27
- let(:policyfile_lock_data) do
28
- {
29
- "name" => "example",
30
- "run_list" => [ "recipe[omnibus::default]" ],
31
- "cookbook_locks" => {
32
- "omnibus" => {
33
- "version" => "2.2.0",
34
- "identifier" => "64b3e64306cff223206348e46af545b19032b170",
35
- "dotted_decimal_identifier" => "28345299219435506.9887234981653237.76628930769264",
36
- "cache_key" => "omnibus-2cf98f9797cacce9c8688fc4e74858b858e2bc14",
37
- "origin" => "git@github.com:opscode-cookbooks/omnibus.git",
38
- "source_options" => {
39
- "git" => "git@github.com:opscode-cookbooks/omnibus.git",
40
- "revision" => "2cf98f9797cacce9c8688fc4e74858b858e2bc14",
41
- "branch" => "master",
42
- },
43
- },
44
- },
45
- }
46
- end
47
-
48
- let(:policyfile_lock) do
49
- instance_double("ChefDK::PolicyfileLock", name: "example",
50
- to_lock: policyfile_lock_data) end
51
-
52
- let(:policy_group) { "unit-test" }
53
-
54
- let(:http_client) { instance_double("Chef::ServerAPI") }
55
-
56
- let(:policy_document_native_api) { false }
57
-
58
- let(:uploader) do
59
- described_class.new(policyfile_lock,
60
- policy_group,
61
- http_client: http_client,
62
- policy_document_native_api: policy_document_native_api)
63
- end
64
-
65
- let(:policyfile_as_data_bag_item) do
66
-
67
- policyfile_as_data_bag_item = {
68
- "id" => "example-unit-test",
69
- "name" => "data_bag_item_policyfiles_example-unit-test",
70
- "data_bag" => "policyfiles",
71
- }
72
- policyfile_as_data_bag_item["raw_data"] = policyfile_lock_data.dup
73
- policyfile_as_data_bag_item["raw_data"]["id"] = "example-unit-test"
74
- policyfile_as_data_bag_item["json_class"] = "Chef::DataBagItem"
75
- policyfile_as_data_bag_item
76
- end
77
-
78
- it "has a lockfile" do
79
- expect(uploader.policyfile_lock).to eq(policyfile_lock)
80
- end
81
-
82
- it "has a policy group" do
83
- expect(uploader.policy_group).to eq(policy_group)
84
- end
85
-
86
- it "has an HTTP client" do
87
- expect(uploader.http_client).to eq(http_client)
88
- end
89
-
90
- describe "uploading policies and cookbooks" do
91
-
92
- let(:cookbook_locks) { {} }
93
- let(:cookbook_versions) { {} }
94
-
95
- before do
96
- allow(policyfile_lock).to receive(:cookbook_locks).and_return(cookbook_locks)
97
- end
98
-
99
- def lock_double(name, identifier, dotted_decimal_id)
100
- cache_path = "/home/user/cache_path/#{name}"
101
-
102
- lock = instance_double("ChefDK::Policyfile::CookbookLock",
103
- name: name,
104
- version: "1.0.0",
105
- identifier: identifier,
106
- dotted_decimal_identifier: dotted_decimal_id,
107
- cookbook_path: cache_path)
108
-
109
- cookbook_version = instance_double("Chef::CookbookVersion",
110
- name: name,
111
- identifier: lock.identifier,
112
- version: dotted_decimal_id)
113
-
114
- allow(cookbook_version).to receive(:identifier=).with(lock.identifier)
115
-
116
- allow(ChefDK::Policyfile::ReadCookbookForCompatModeUpload).
117
- to receive(:load).
118
- with(name, dotted_decimal_id, cache_path).
119
- and_return(cookbook_version)
120
-
121
- allow(ChefDK::Policyfile::CookbookLoaderWithChefignore).
122
- to receive(:load).
123
- with(name, cache_path).
124
- and_return(cookbook_version)
125
-
126
- cookbook_versions[name] = cookbook_version
127
- cookbook_locks[name] = lock
128
-
129
- lock
130
- end
131
-
132
- shared_examples_for "uploading cookbooks" do
133
-
134
- describe "uploading cookbooks" do
135
-
136
- it "enumerates the cookbooks already on the server" do
137
- expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
138
- expect(uploader.existing_cookbook_on_remote).to eq(existing_cookbook_on_remote)
139
- end
140
-
141
- context "with an empty policyfile lock" do
142
-
143
- it "has an empty list of cookbooks for possible upload" do
144
- expect(policyfile_lock).to receive(:validate_cookbooks!)
145
-
146
- expect(uploader.cookbook_versions_for_policy).to eq([])
147
- end
148
-
149
- it "has an empty list of cookbooks that need to be uploaded" do
150
- expect(policyfile_lock).to receive(:validate_cookbooks!)
151
-
152
- expect(uploader.cookbook_versions_to_upload).to eq([])
153
- end
154
-
155
- end
156
-
157
- context "with a set of cookbooks that don't exist on the server" do
158
-
159
- before do
160
- lock_double("my_apache2", "1111111111111111111111111111111111111111", "123.456.789")
161
- lock_double("my_jenkins", "2222222222222222222222222222222222222222", "321.654.987")
162
- end
163
-
164
- it "lists the cookbooks in the lock as possibly needing to be uploaded" do
165
- expect(policyfile_lock).to receive(:validate_cookbooks!)
166
-
167
- expected_versions_for_policy = cookbook_versions.keys.map do |cb_name|
168
- cb = cookbook_versions[cb_name]
169
- lock = cookbook_locks[cb_name]
170
- ChefDK::Policyfile::Uploader::LockedCookbookForUpload.new(cb, lock)
171
- end
172
-
173
- expect(uploader.cookbook_versions_for_policy).to eq(expected_versions_for_policy)
174
- end
175
-
176
- it "lists all cookbooks in the lock as needing to be uploaded" do
177
- expect(policyfile_lock).to receive(:validate_cookbooks!)
178
- expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
179
-
180
- expect(uploader.cookbook_versions_to_upload).to eq(cookbook_versions.values)
181
- end
182
-
183
- it "uploads the cookbooks and then the policy" do
184
- expect(policyfile_lock).to receive(:validate_cookbooks!)
185
- expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
186
-
187
- cookbook_uploader = instance_double("Chef::CookbookUploader")
188
- expect(Chef::CookbookUploader).to receive(:new).
189
- with(cookbook_versions.values, rest: http_client, policy_mode: policy_document_native_api).
190
- and_return(cookbook_uploader)
191
- expect(cookbook_uploader).to receive(:upload_cookbooks)
192
-
193
- expect_policyfile_upload
194
-
195
- uploader.upload
196
- end
197
-
198
- end
199
-
200
- context "with a set of cookbooks where some already exist on the server" do
201
-
202
- before do
203
- # These are new:
204
- lock_double("my_apache2", "1111111111111111111111111111111111111111", "123.456.789")
205
- lock_double("my_jenkins", "2222222222222222222222222222222222222222", "321.654.987")
206
-
207
- # Have this one:
208
- lock_double("build-essential", "571d8ebd02b296fe90b2e4d68754af7e8e185f28", "67369247788170534.26353953100055918.55660493423796")
209
- end
210
-
211
- let(:expected_cookbooks_for_upload) do
212
- [
213
- cookbook_versions["my_apache2"],
214
- cookbook_versions["my_jenkins"],
215
- ]
216
- end
217
-
218
- it "lists only cookbooks not on the server as needing to be uploaded" do
219
- expect(policyfile_lock).to receive(:validate_cookbooks!)
220
- expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
221
-
222
- expect(uploader.cookbook_versions_to_upload).to eq(expected_cookbooks_for_upload)
223
- end
224
-
225
- it "uploads the cookbooks and then the policy" do
226
- expect(policyfile_lock).to receive(:validate_cookbooks!)
227
- expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
228
-
229
- cookbook_uploader = instance_double("Chef::CookbookUploader")
230
- expect(Chef::CookbookUploader).to receive(:new).
231
- with(expected_cookbooks_for_upload, rest: http_client, policy_mode: policy_document_native_api).
232
- and_return(cookbook_uploader)
233
- expect(cookbook_uploader).to receive(:upload_cookbooks)
234
-
235
- expect_policyfile_upload
236
-
237
- uploader.upload
238
- end
239
-
240
- end
241
-
242
- context "with a set of cookbooks that all exist on the server" do
243
-
244
- before do
245
- # Have this one:
246
- lock_double("build-essential", "571d8ebd02b296fe90b2e4d68754af7e8e185f28", "67369247788170534.26353953100055918.55660493423796")
247
- end
248
-
249
- let(:expected_cookbooks_for_upload) do
250
- []
251
- end
252
-
253
- it "lists no cookbooks as needing to be uploaded" do
254
- expect(policyfile_lock).to receive(:validate_cookbooks!)
255
- expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
256
-
257
- expect(uploader.cookbook_versions_to_upload).to eq(expected_cookbooks_for_upload)
258
- end
259
-
260
- it "skips cookbooks uploads, then uploads the policy" do
261
- expect(policyfile_lock).to receive(:validate_cookbooks!)
262
- expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
263
-
264
- expect(uploader.uploader).to_not receive(:upload_cookbooks)
265
-
266
- expect_policyfile_upload
267
-
268
- uploader.upload
269
- end
270
- end
271
- end
272
- end # uploading cookbooks shared examples
273
-
274
- context "when configured for policy document compat mode" do
275
-
276
- let(:policyfiles_data_bag) { { "name" => "policyfiles" } }
277
-
278
- let(:list_cookbooks_url) { "cookbooks?num_versions=all" }
279
-
280
- let(:existing_cookbook_on_remote) do
281
- { "apt" =>
282
- { "url" => "http://localhost:8889/cookbooks/apt",
283
- "versions" =>
284
- [{ "url" =>
285
- "http://localhost:8889/cookbooks/apt/46097674477573307.43471642740453733.243606720748315",
286
- "version" => "46097674477573307.43471642740453733.243606720748315" }] },
287
- "build-essential" =>
288
- { "url" => "http://localhost:8889/cookbooks/build-essential",
289
- "versions" =>
290
- [{ "url" =>
291
- "http://localhost:8889/cookbooks/build-essential/67369247788170534.26353953100055918.55660493423796",
292
- "version" => "67369247788170534.26353953100055918.55660493423796" }] },
293
- "java" =>
294
- { "url" => "http://localhost:8889/cookbooks/java",
295
- "versions" =>
296
- [{ "url" =>
297
- "http://localhost:8889/cookbooks/java/5664982062912610.52588194571203830.6215746262253",
298
- "version" => "5664982062912610.52588194571203830.6215746262253" }] },
299
- "jenkins" =>
300
- { "url" => "http://localhost:8889/cookbooks/jenkins",
301
- "versions" =>
302
- [{ "url" =>
303
- "http://localhost:8889/cookbooks/jenkins/69194928762630300.30177357398946006.269829039948647",
304
- "version" => "69194928762630300.30177357398946006.269829039948647" }] },
305
- }
306
- end
307
-
308
- def expect_policyfile_upload
309
- expect(uploader).to receive(:data_bag_create)
310
- expect(uploader).to receive(:data_bag_item_create)
311
- end
312
-
313
- it "ensures a data bag named 'policyfiles' exists" do
314
- expect(http_client).to receive(:post).with("data", policyfiles_data_bag)
315
- uploader.data_bag_create
316
- end
317
-
318
- it "does not error when the 'policyfiles' data bag exists" do
319
- response = double("Net::HTTP response", code: "409")
320
- error = Net::HTTPServerException.new("conflict", response)
321
- expect(http_client).to receive(:post).with("data", { "name" => "policyfiles" }).and_raise(error)
322
- expect { uploader.data_bag_create }.to_not raise_error
323
- end
324
-
325
- it "uploads the policyfile as a data bag item" do
326
- response = double("Net::HTTP response", code: "404")
327
- error = Net::HTTPServerException.new("Not Found", response)
328
- expect(http_client).to receive(:put).
329
- with("data/policyfiles/example-unit-test", policyfile_as_data_bag_item).
330
- and_raise(error)
331
- expect(http_client).to receive(:post).
332
- with("data/policyfiles", policyfile_as_data_bag_item)
333
-
334
- uploader.data_bag_item_create
335
- end
336
-
337
- it "replaces an existing policyfile on the server if it exists" do
338
- expect(http_client).to receive(:put).
339
- with("data/policyfiles/example-unit-test", policyfile_as_data_bag_item)
340
- uploader.data_bag_item_create
341
- end
342
-
343
- it "creates the data bag and item to upload the policy" do
344
- expect(http_client).to receive(:post).with("data", policyfiles_data_bag)
345
- expect(http_client).to receive(:put).
346
- with("data/policyfiles/example-unit-test", policyfile_as_data_bag_item)
347
- uploader.upload_policy
348
- end
349
-
350
- include_examples "uploading cookbooks"
351
-
352
- end
353
-
354
- context "when configured for policy document native mode" do
355
-
356
- let(:policy_document_native_api) { true }
357
-
358
- let(:list_cookbooks_url) { "cookbook_artifacts?num_versions=all" }
359
-
360
- let(:existing_cookbook_on_remote) do
361
- { "apt" =>
362
- { "url" => "http://localhost:8889/cookbook_artifacts/apt",
363
- "versions" =>
364
- [{ "url" =>
365
- "http://localhost:8889/cookbook_artifacts/apt/5f7045a8aeaf6ccda3b3594258df9ee982b3a023",
366
- "identifier" => "5f7045a8aeaf6ccda3b3594258df9ee982b3a023" }] },
367
- "build-essential" =>
368
- { "url" => "http://localhost:8889/cookbook_artifacts/build-essential",
369
- "versions" =>
370
- [{ "url" =>
371
- "http://localhost:8889/cookbook_artifacts/build-essential/571d8ebd02b296fe90b2e4d68754af7e8e185f28",
372
- "identifier" => "571d8ebd02b296fe90b2e4d68754af7e8e185f28" }] },
373
- "java" =>
374
- { "url" => "http://localhost:8889/cookbook_artifacts/java",
375
- "versions" =>
376
- [{ "url" =>
377
- "http://localhost:8889/cookbook_artifacts/java/9178a38ad3e3baa55b49c1b8d9f4bf6a43dbc358",
378
- "identifier" => "9178a38ad3e3baa55b49c1b8d9f4bf6a43dbc358" }] },
379
- "jenkins" =>
380
- { "url" => "http://localhost:8889/cookbook_artifacts/jenkins",
381
- "versions" =>
382
- [{ "url" =>
383
- "http://localhost:8889/cookbook_artifacts/jenkins/0be380429add00d189b4431059ac967a60052323",
384
- "identifier" => "0be380429add00d189b4431059ac967a60052323" }] },
385
- }
386
- end
387
- def expect_policyfile_upload
388
- expect(http_client).to receive(:put).
389
- with("/policy_groups/unit-test/policies/example", policyfile_lock_data)
390
- end
391
-
392
- it "enables native document mode for policyfiles" do
393
- expect(uploader.using_policy_document_native_api?).to be(true)
394
- end
395
-
396
- it "uploads the policyfile to the native API" do
397
- expect(http_client).to receive(:put).
398
- with("/policy_groups/unit-test/policies/example", policyfile_lock_data)
399
-
400
- uploader.upload_policy
401
- end
402
-
403
- include_examples "uploading cookbooks"
404
-
405
- end
406
-
407
- end
408
-
409
- 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/uploader"
20
+
21
+ # We load this here to ensure we get the "verifying doubles" behavior from
22
+ # RSpec. It's not used by Policyfile::Uploader, but it's a collaborator.
23
+ require "chef/server_api"
24
+
25
+ describe ChefDK::Policyfile::Uploader do
26
+
27
+ let(:policyfile_lock_data) do
28
+ {
29
+ "name" => "example",
30
+ "run_list" => [ "recipe[omnibus::default]" ],
31
+ "cookbook_locks" => {
32
+ "omnibus" => {
33
+ "version" => "2.2.0",
34
+ "identifier" => "64b3e64306cff223206348e46af545b19032b170",
35
+ "dotted_decimal_identifier" => "28345299219435506.9887234981653237.76628930769264",
36
+ "cache_key" => "omnibus-2cf98f9797cacce9c8688fc4e74858b858e2bc14",
37
+ "origin" => "git@github.com:opscode-cookbooks/omnibus.git",
38
+ "source_options" => {
39
+ "git" => "git@github.com:opscode-cookbooks/omnibus.git",
40
+ "revision" => "2cf98f9797cacce9c8688fc4e74858b858e2bc14",
41
+ "branch" => "master",
42
+ },
43
+ },
44
+ },
45
+ }
46
+ end
47
+
48
+ let(:policyfile_lock) do
49
+ instance_double("ChefDK::PolicyfileLock", name: "example",
50
+ to_lock: policyfile_lock_data) end
51
+
52
+ let(:policy_group) { "unit-test" }
53
+
54
+ let(:http_client) { instance_double("Chef::ServerAPI") }
55
+
56
+ let(:policy_document_native_api) { false }
57
+
58
+ let(:uploader) do
59
+ described_class.new(policyfile_lock,
60
+ policy_group,
61
+ http_client: http_client,
62
+ policy_document_native_api: policy_document_native_api)
63
+ end
64
+
65
+ let(:policyfile_as_data_bag_item) do
66
+
67
+ policyfile_as_data_bag_item = {
68
+ "id" => "example-unit-test",
69
+ "name" => "data_bag_item_policyfiles_example-unit-test",
70
+ "data_bag" => "policyfiles",
71
+ }
72
+ policyfile_as_data_bag_item["raw_data"] = policyfile_lock_data.dup
73
+ policyfile_as_data_bag_item["raw_data"]["id"] = "example-unit-test"
74
+ policyfile_as_data_bag_item["json_class"] = "Chef::DataBagItem"
75
+ policyfile_as_data_bag_item
76
+ end
77
+
78
+ it "has a lockfile" do
79
+ expect(uploader.policyfile_lock).to eq(policyfile_lock)
80
+ end
81
+
82
+ it "has a policy group" do
83
+ expect(uploader.policy_group).to eq(policy_group)
84
+ end
85
+
86
+ it "has an HTTP client" do
87
+ expect(uploader.http_client).to eq(http_client)
88
+ end
89
+
90
+ describe "uploading policies and cookbooks" do
91
+
92
+ let(:cookbook_locks) { {} }
93
+ let(:cookbook_versions) { {} }
94
+
95
+ before do
96
+ allow(policyfile_lock).to receive(:cookbook_locks).and_return(cookbook_locks)
97
+ end
98
+
99
+ def lock_double(name, identifier, dotted_decimal_id)
100
+ cache_path = "/home/user/cache_path/#{name}"
101
+
102
+ lock = instance_double("ChefDK::Policyfile::CookbookLock",
103
+ name: name,
104
+ version: "1.0.0",
105
+ identifier: identifier,
106
+ dotted_decimal_identifier: dotted_decimal_id,
107
+ cookbook_path: cache_path)
108
+
109
+ cookbook_version = instance_double("Chef::CookbookVersion",
110
+ name: name,
111
+ identifier: lock.identifier,
112
+ version: dotted_decimal_id)
113
+
114
+ allow(cookbook_version).to receive(:identifier=).with(lock.identifier)
115
+
116
+ allow(ChefDK::Policyfile::ReadCookbookForCompatModeUpload).
117
+ to receive(:load).
118
+ with(name, dotted_decimal_id, cache_path).
119
+ and_return(cookbook_version)
120
+
121
+ allow(ChefDK::Policyfile::CookbookLoaderWithChefignore).
122
+ to receive(:load).
123
+ with(name, cache_path).
124
+ and_return(cookbook_version)
125
+
126
+ cookbook_versions[name] = cookbook_version
127
+ cookbook_locks[name] = lock
128
+
129
+ lock
130
+ end
131
+
132
+ shared_examples_for "uploading cookbooks" do
133
+
134
+ describe "uploading cookbooks" do
135
+
136
+ it "enumerates the cookbooks already on the server" do
137
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
138
+ expect(uploader.existing_cookbook_on_remote).to eq(existing_cookbook_on_remote)
139
+ end
140
+
141
+ context "with an empty policyfile lock" do
142
+
143
+ it "has an empty list of cookbooks for possible upload" do
144
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
145
+
146
+ expect(uploader.cookbook_versions_for_policy).to eq([])
147
+ end
148
+
149
+ it "has an empty list of cookbooks that need to be uploaded" do
150
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
151
+
152
+ expect(uploader.cookbook_versions_to_upload).to eq([])
153
+ end
154
+
155
+ end
156
+
157
+ context "with a set of cookbooks that don't exist on the server" do
158
+
159
+ before do
160
+ lock_double("my_apache2", "1111111111111111111111111111111111111111", "123.456.789")
161
+ lock_double("my_jenkins", "2222222222222222222222222222222222222222", "321.654.987")
162
+ end
163
+
164
+ it "lists the cookbooks in the lock as possibly needing to be uploaded" do
165
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
166
+
167
+ expected_versions_for_policy = cookbook_versions.keys.map do |cb_name|
168
+ cb = cookbook_versions[cb_name]
169
+ lock = cookbook_locks[cb_name]
170
+ ChefDK::Policyfile::Uploader::LockedCookbookForUpload.new(cb, lock)
171
+ end
172
+
173
+ expect(uploader.cookbook_versions_for_policy).to eq(expected_versions_for_policy)
174
+ end
175
+
176
+ it "lists all cookbooks in the lock as needing to be uploaded" do
177
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
178
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
179
+
180
+ expect(uploader.cookbook_versions_to_upload).to eq(cookbook_versions.values)
181
+ end
182
+
183
+ it "uploads the cookbooks and then the policy" do
184
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
185
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
186
+
187
+ cookbook_uploader = instance_double("Chef::CookbookUploader")
188
+ expect(Chef::CookbookUploader).to receive(:new).
189
+ with(cookbook_versions.values, rest: http_client, policy_mode: policy_document_native_api).
190
+ and_return(cookbook_uploader)
191
+ expect(cookbook_uploader).to receive(:upload_cookbooks)
192
+
193
+ expect_policyfile_upload
194
+
195
+ uploader.upload
196
+ end
197
+
198
+ end
199
+
200
+ context "with a set of cookbooks where some already exist on the server" do
201
+
202
+ before do
203
+ # These are new:
204
+ lock_double("my_apache2", "1111111111111111111111111111111111111111", "123.456.789")
205
+ lock_double("my_jenkins", "2222222222222222222222222222222222222222", "321.654.987")
206
+
207
+ # Have this one:
208
+ lock_double("build-essential", "571d8ebd02b296fe90b2e4d68754af7e8e185f28", "67369247788170534.26353953100055918.55660493423796")
209
+ end
210
+
211
+ let(:expected_cookbooks_for_upload) do
212
+ [
213
+ cookbook_versions["my_apache2"],
214
+ cookbook_versions["my_jenkins"],
215
+ ]
216
+ end
217
+
218
+ it "lists only cookbooks not on the server as needing to be uploaded" do
219
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
220
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
221
+
222
+ expect(uploader.cookbook_versions_to_upload).to eq(expected_cookbooks_for_upload)
223
+ end
224
+
225
+ it "uploads the cookbooks and then the policy" do
226
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
227
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
228
+
229
+ cookbook_uploader = instance_double("Chef::CookbookUploader")
230
+ expect(Chef::CookbookUploader).to receive(:new).
231
+ with(expected_cookbooks_for_upload, rest: http_client, policy_mode: policy_document_native_api).
232
+ and_return(cookbook_uploader)
233
+ expect(cookbook_uploader).to receive(:upload_cookbooks)
234
+
235
+ expect_policyfile_upload
236
+
237
+ uploader.upload
238
+ end
239
+
240
+ end
241
+
242
+ context "with a set of cookbooks that all exist on the server" do
243
+
244
+ before do
245
+ # Have this one:
246
+ lock_double("build-essential", "571d8ebd02b296fe90b2e4d68754af7e8e185f28", "67369247788170534.26353953100055918.55660493423796")
247
+ end
248
+
249
+ let(:expected_cookbooks_for_upload) do
250
+ []
251
+ end
252
+
253
+ it "lists no cookbooks as needing to be uploaded" do
254
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
255
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
256
+
257
+ expect(uploader.cookbook_versions_to_upload).to eq(expected_cookbooks_for_upload)
258
+ end
259
+
260
+ it "skips cookbooks uploads, then uploads the policy" do
261
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
262
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
263
+
264
+ expect(uploader.uploader).to_not receive(:upload_cookbooks)
265
+
266
+ expect_policyfile_upload
267
+
268
+ uploader.upload
269
+ end
270
+ end
271
+ end
272
+ end # uploading cookbooks shared examples
273
+
274
+ context "when configured for policy document compat mode" do
275
+
276
+ let(:policyfiles_data_bag) { { "name" => "policyfiles" } }
277
+
278
+ let(:list_cookbooks_url) { "cookbooks?num_versions=all" }
279
+
280
+ let(:existing_cookbook_on_remote) do
281
+ { "apt" =>
282
+ { "url" => "http://localhost:8889/cookbooks/apt",
283
+ "versions" =>
284
+ [{ "url" =>
285
+ "http://localhost:8889/cookbooks/apt/46097674477573307.43471642740453733.243606720748315",
286
+ "version" => "46097674477573307.43471642740453733.243606720748315" }] },
287
+ "build-essential" =>
288
+ { "url" => "http://localhost:8889/cookbooks/build-essential",
289
+ "versions" =>
290
+ [{ "url" =>
291
+ "http://localhost:8889/cookbooks/build-essential/67369247788170534.26353953100055918.55660493423796",
292
+ "version" => "67369247788170534.26353953100055918.55660493423796" }] },
293
+ "java" =>
294
+ { "url" => "http://localhost:8889/cookbooks/java",
295
+ "versions" =>
296
+ [{ "url" =>
297
+ "http://localhost:8889/cookbooks/java/5664982062912610.52588194571203830.6215746262253",
298
+ "version" => "5664982062912610.52588194571203830.6215746262253" }] },
299
+ "jenkins" =>
300
+ { "url" => "http://localhost:8889/cookbooks/jenkins",
301
+ "versions" =>
302
+ [{ "url" =>
303
+ "http://localhost:8889/cookbooks/jenkins/69194928762630300.30177357398946006.269829039948647",
304
+ "version" => "69194928762630300.30177357398946006.269829039948647" }] },
305
+ }
306
+ end
307
+
308
+ def expect_policyfile_upload
309
+ expect(uploader).to receive(:data_bag_create)
310
+ expect(uploader).to receive(:data_bag_item_create)
311
+ end
312
+
313
+ it "ensures a data bag named 'policyfiles' exists" do
314
+ expect(http_client).to receive(:post).with("data", policyfiles_data_bag)
315
+ uploader.data_bag_create
316
+ end
317
+
318
+ it "does not error when the 'policyfiles' data bag exists" do
319
+ response = double("Net::HTTP response", code: "409")
320
+ error = Net::HTTPServerException.new("conflict", response)
321
+ expect(http_client).to receive(:post).with("data", { "name" => "policyfiles" }).and_raise(error)
322
+ expect { uploader.data_bag_create }.to_not raise_error
323
+ end
324
+
325
+ it "uploads the policyfile as a data bag item" do
326
+ response = double("Net::HTTP response", code: "404")
327
+ error = Net::HTTPServerException.new("Not Found", response)
328
+ expect(http_client).to receive(:put).
329
+ with("data/policyfiles/example-unit-test", policyfile_as_data_bag_item).
330
+ and_raise(error)
331
+ expect(http_client).to receive(:post).
332
+ with("data/policyfiles", policyfile_as_data_bag_item)
333
+
334
+ uploader.data_bag_item_create
335
+ end
336
+
337
+ it "replaces an existing policyfile on the server if it exists" do
338
+ expect(http_client).to receive(:put).
339
+ with("data/policyfiles/example-unit-test", policyfile_as_data_bag_item)
340
+ uploader.data_bag_item_create
341
+ end
342
+
343
+ it "creates the data bag and item to upload the policy" do
344
+ expect(http_client).to receive(:post).with("data", policyfiles_data_bag)
345
+ expect(http_client).to receive(:put).
346
+ with("data/policyfiles/example-unit-test", policyfile_as_data_bag_item)
347
+ uploader.upload_policy
348
+ end
349
+
350
+ include_examples "uploading cookbooks"
351
+
352
+ end
353
+
354
+ context "when configured for policy document native mode" do
355
+
356
+ let(:policy_document_native_api) { true }
357
+
358
+ let(:list_cookbooks_url) { "cookbook_artifacts?num_versions=all" }
359
+
360
+ let(:existing_cookbook_on_remote) do
361
+ { "apt" =>
362
+ { "url" => "http://localhost:8889/cookbook_artifacts/apt",
363
+ "versions" =>
364
+ [{ "url" =>
365
+ "http://localhost:8889/cookbook_artifacts/apt/5f7045a8aeaf6ccda3b3594258df9ee982b3a023",
366
+ "identifier" => "5f7045a8aeaf6ccda3b3594258df9ee982b3a023" }] },
367
+ "build-essential" =>
368
+ { "url" => "http://localhost:8889/cookbook_artifacts/build-essential",
369
+ "versions" =>
370
+ [{ "url" =>
371
+ "http://localhost:8889/cookbook_artifacts/build-essential/571d8ebd02b296fe90b2e4d68754af7e8e185f28",
372
+ "identifier" => "571d8ebd02b296fe90b2e4d68754af7e8e185f28" }] },
373
+ "java" =>
374
+ { "url" => "http://localhost:8889/cookbook_artifacts/java",
375
+ "versions" =>
376
+ [{ "url" =>
377
+ "http://localhost:8889/cookbook_artifacts/java/9178a38ad3e3baa55b49c1b8d9f4bf6a43dbc358",
378
+ "identifier" => "9178a38ad3e3baa55b49c1b8d9f4bf6a43dbc358" }] },
379
+ "jenkins" =>
380
+ { "url" => "http://localhost:8889/cookbook_artifacts/jenkins",
381
+ "versions" =>
382
+ [{ "url" =>
383
+ "http://localhost:8889/cookbook_artifacts/jenkins/0be380429add00d189b4431059ac967a60052323",
384
+ "identifier" => "0be380429add00d189b4431059ac967a60052323" }] },
385
+ }
386
+ end
387
+ def expect_policyfile_upload
388
+ expect(http_client).to receive(:put).
389
+ with("/policy_groups/unit-test/policies/example", policyfile_lock_data)
390
+ end
391
+
392
+ it "enables native document mode for policyfiles" do
393
+ expect(uploader.using_policy_document_native_api?).to be(true)
394
+ end
395
+
396
+ it "uploads the policyfile to the native API" do
397
+ expect(http_client).to receive(:put).
398
+ with("/policy_groups/unit-test/policies/example", policyfile_lock_data)
399
+
400
+ uploader.upload_policy
401
+ end
402
+
403
+ include_examples "uploading cookbooks"
404
+
405
+ end
406
+
407
+ end
408
+
409
+ end