chef-dk 0.11.2 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +186 -190
  3. data/Gemfile +30 -26
  4. data/LICENSE +201 -201
  5. data/README.md +307 -307
  6. data/Rakefile +29 -27
  7. data/acceptance/.shared/kitchen_acceptance/.kitchen.digitalocean.yml +27 -0
  8. data/acceptance/.shared/kitchen_acceptance/.kitchen.ec2.yml +284 -0
  9. data/acceptance/.shared/kitchen_acceptance/.kitchen.vagrant.yml +52 -0
  10. data/acceptance/.shared/kitchen_acceptance/libraries/kitchen.rb +51 -0
  11. data/acceptance/.shared/kitchen_acceptance/metadata.rb +1 -0
  12. data/acceptance/Gemfile +11 -0
  13. data/acceptance/README.md +132 -0
  14. data/acceptance/trivial/.acceptance/acceptance-cookbook/.gitignore +2 -0
  15. data/acceptance/trivial/.acceptance/acceptance-cookbook/metadata.rb +2 -0
  16. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -0
  17. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -0
  18. data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -0
  19. data/acceptance/trivial/.kitchen.yml +7 -0
  20. data/acceptance/trivial/test/integration/chefdk-current-install/inspec/chef_client_spec.rb +5 -0
  21. data/bin/chef +25 -25
  22. data/chef-dk.gemspec +64 -64
  23. data/lib/chef-dk.rb +19 -19
  24. data/lib/chef-dk/authenticated_http.rb +40 -40
  25. data/lib/chef-dk/builtin_commands.rb +60 -60
  26. data/lib/chef-dk/chef_runner.rb +107 -107
  27. data/lib/chef-dk/cli.rb +200 -200
  28. data/lib/chef-dk/command/base.rb +79 -79
  29. data/lib/chef-dk/command/clean_policy_cookbooks.rb +116 -116
  30. data/lib/chef-dk/command/clean_policy_revisions.rb +113 -113
  31. data/lib/chef-dk/command/delete_policy.rb +122 -122
  32. data/lib/chef-dk/command/delete_policy_group.rb +122 -122
  33. data/lib/chef-dk/command/diff.rb +316 -316
  34. data/lib/chef-dk/command/env.rb +90 -90
  35. data/lib/chef-dk/command/exec.rb +45 -45
  36. data/lib/chef-dk/command/export.rb +157 -157
  37. data/lib/chef-dk/command/gem.rb +47 -47
  38. data/lib/chef-dk/command/generate.rb +120 -120
  39. data/lib/chef-dk/command/generator_commands.rb +80 -80
  40. data/lib/chef-dk/command/generator_commands/app.rb +107 -107
  41. data/lib/chef-dk/command/generator_commands/attribute.rb +37 -37
  42. data/lib/chef-dk/command/generator_commands/base.rb +148 -148
  43. data/lib/chef-dk/command/generator_commands/cookbook.rb +153 -153
  44. data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +100 -100
  45. data/lib/chef-dk/command/generator_commands/cookbook_file.rb +45 -45
  46. data/lib/chef-dk/command/generator_commands/generator_generator.rb +177 -177
  47. data/lib/chef-dk/command/generator_commands/lwrp.rb +36 -36
  48. data/lib/chef-dk/command/generator_commands/policyfile.rb +127 -127
  49. data/lib/chef-dk/command/generator_commands/recipe.rb +36 -36
  50. data/lib/chef-dk/command/generator_commands/repo.rb +125 -125
  51. data/lib/chef-dk/command/generator_commands/template.rb +46 -46
  52. data/lib/chef-dk/command/install.rb +121 -121
  53. data/lib/chef-dk/command/provision.rb +438 -438
  54. data/lib/chef-dk/command/push.rb +118 -118
  55. data/lib/chef-dk/command/push_archive.rb +126 -126
  56. data/lib/chef-dk/command/shell_init.rb +180 -180
  57. data/lib/chef-dk/command/show_policy.rb +165 -165
  58. data/lib/chef-dk/command/undelete.rb +155 -155
  59. data/lib/chef-dk/command/update.rb +148 -148
  60. data/lib/chef-dk/command/verify.rb +534 -534
  61. data/lib/chef-dk/commands_map.rb +115 -115
  62. data/lib/chef-dk/completions/bash.sh.erb +5 -5
  63. data/lib/chef-dk/completions/chef.fish.erb +10 -10
  64. data/lib/chef-dk/completions/zsh.zsh.erb +21 -21
  65. data/lib/chef-dk/component_test.rb +194 -173
  66. data/lib/chef-dk/configurable.rb +69 -69
  67. data/lib/chef-dk/cookbook_metadata.rb +45 -45
  68. data/lib/chef-dk/cookbook_omnifetch.rb +32 -32
  69. data/lib/chef-dk/cookbook_profiler/git.rb +151 -151
  70. data/lib/chef-dk/cookbook_profiler/identifiers.rb +72 -72
  71. data/lib/chef-dk/cookbook_profiler/null_scm.rb +32 -32
  72. data/lib/chef-dk/exceptions.rb +129 -129
  73. data/lib/chef-dk/generator.rb +163 -163
  74. data/lib/chef-dk/helpers.rb +159 -159
  75. data/lib/chef-dk/pager.rb +106 -106
  76. data/lib/chef-dk/policyfile/chef_repo_cookbook_source.rb +138 -138
  77. data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +54 -54
  78. data/lib/chef-dk/policyfile/community_cookbook_source.rb +97 -97
  79. data/lib/chef-dk/policyfile/comparison_base.rb +124 -124
  80. data/lib/chef-dk/policyfile/cookbook_location_specification.rb +154 -154
  81. data/lib/chef-dk/policyfile/cookbook_locks.rb +466 -466
  82. data/lib/chef-dk/policyfile/cookbook_sources.rb +22 -22
  83. data/lib/chef-dk/policyfile/delivery_supermarket_source.rb +90 -90
  84. data/lib/chef-dk/policyfile/differ.rb +266 -266
  85. data/lib/chef-dk/policyfile/dsl.rb +261 -261
  86. data/lib/chef-dk/policyfile/lister.rb +232 -232
  87. data/lib/chef-dk/policyfile/null_cookbook_source.rb +45 -45
  88. data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -124
  89. data/lib/chef-dk/policyfile/reports/install.rb +70 -70
  90. data/lib/chef-dk/policyfile/reports/table_printer.rb +58 -58
  91. data/lib/chef-dk/policyfile/reports/upload.rb +70 -70
  92. data/lib/chef-dk/policyfile/solution_dependencies.rb +298 -298
  93. data/lib/chef-dk/policyfile/storage_config.rb +100 -100
  94. data/lib/chef-dk/policyfile/undo_record.rb +142 -142
  95. data/lib/chef-dk/policyfile/undo_stack.rb +130 -130
  96. data/lib/chef-dk/policyfile/uploader.rb +213 -213
  97. data/lib/chef-dk/policyfile_compiler.rb +419 -419
  98. data/lib/chef-dk/policyfile_lock.rb +552 -552
  99. data/lib/chef-dk/policyfile_services/clean_policies.rb +95 -95
  100. data/lib/chef-dk/policyfile_services/clean_policy_cookbooks.rb +125 -125
  101. data/lib/chef-dk/policyfile_services/export_repo.rb +421 -414
  102. data/lib/chef-dk/policyfile_services/install.rb +126 -126
  103. data/lib/chef-dk/policyfile_services/push.rb +114 -114
  104. data/lib/chef-dk/policyfile_services/push_archive.rb +204 -204
  105. data/lib/chef-dk/policyfile_services/rm_policy.rb +142 -142
  106. data/lib/chef-dk/policyfile_services/rm_policy_group.rb +86 -86
  107. data/lib/chef-dk/policyfile_services/show_policy.rb +237 -237
  108. data/lib/chef-dk/policyfile_services/undelete.rb +108 -108
  109. data/lib/chef-dk/policyfile_services/update_attributes.rb +104 -104
  110. data/lib/chef-dk/service_exception_inspectors.rb +25 -25
  111. data/lib/chef-dk/service_exception_inspectors/base.rb +40 -40
  112. data/lib/chef-dk/service_exception_inspectors/http.rb +121 -121
  113. data/lib/chef-dk/service_exceptions.rb +143 -143
  114. data/lib/chef-dk/shell_out.rb +36 -36
  115. data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +3 -3
  116. data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +102 -102
  117. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -9
  118. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README.md +54 -54
  119. data/lib/chef-dk/skeletons/code_generator/files/default/gitignore +16 -16
  120. data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +28 -28
  121. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -27
  122. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -7
  123. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +3 -3
  124. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -8
  125. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +58 -58
  126. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +3 -3
  127. data/lib/chef-dk/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -6
  128. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +9 -9
  129. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/example.json +12 -12
  130. data/lib/chef-dk/skeletons/code_generator/files/default/repo/policies/README.md +24 -24
  131. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +9 -9
  132. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/example.json +12 -12
  133. data/lib/chef-dk/skeletons/code_generator/files/default/serverspec_spec_helper.rb +8 -8
  134. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +2 -2
  135. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper_policyfile.rb +2 -2
  136. data/lib/chef-dk/skeletons/code_generator/metadata.rb +8 -8
  137. data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +97 -97
  138. data/lib/chef-dk/skeletons/code_generator/recipes/attribute.rb +12 -12
  139. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +117 -117
  140. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook_file.rb +24 -24
  141. data/lib/chef-dk/skeletons/code_generator/recipes/lwrp.rb +23 -23
  142. data/lib/chef-dk/skeletons/code_generator/recipes/policyfile.rb +8 -8
  143. data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +27 -27
  144. data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +67 -67
  145. data/lib/chef-dk/skeletons/code_generator/recipes/template.rb +32 -32
  146. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -3
  147. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.apache2.erb +201 -201
  148. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -339
  149. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -674
  150. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -21
  151. data/lib/chef-dk/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -25
  152. data/lib/chef-dk/skeletons/code_generator/templates/default/README.md.erb +4 -4
  153. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen.yml.erb +21 -21
  154. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +32 -32
  155. data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +7 -7
  156. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +5 -5
  157. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe_spec.rb.erb +20 -20
  158. data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +11 -11
  159. data/lib/chef-dk/skeletons/code_generator/templates/default/serverspec_default_spec.rb.erb +9 -9
  160. data/lib/chef-dk/ui.rb +58 -58
  161. data/lib/chef-dk/version.rb +20 -20
  162. data/lib/kitchen/provisioner/policyfile_zero.rb +194 -194
  163. data/spec/shared/a_file_generator.rb +125 -125
  164. data/spec/shared/a_generated_file.rb +12 -12
  165. data/spec/shared/command_with_ui_object.rb +11 -11
  166. data/spec/shared/custom_generator_cookbook.rb +130 -130
  167. data/spec/shared/fixture_cookbook_checksums.rb +47 -47
  168. data/spec/shared/setup_git_cookbooks.rb +53 -53
  169. data/spec/spec_helper.rb +51 -50
  170. data/spec/test_helpers.rb +84 -84
  171. data/spec/unit/chef_runner_spec.rb +139 -139
  172. data/spec/unit/cli_spec.rb +357 -357
  173. data/spec/unit/command/base_spec.rb +169 -169
  174. data/spec/unit/command/clean_policy_cookbooks_spec.rb +181 -181
  175. data/spec/unit/command/clean_policy_revisions_spec.rb +181 -181
  176. data/spec/unit/command/delete_policy_group_spec.rb +207 -207
  177. data/spec/unit/command/delete_policy_spec.rb +207 -207
  178. data/spec/unit/command/diff_spec.rb +312 -312
  179. data/spec/unit/command/env_spec.rb +52 -52
  180. data/spec/unit/command/exec_spec.rb +179 -179
  181. data/spec/unit/command/export_spec.rb +200 -200
  182. data/spec/unit/command/generate_spec.rb +142 -142
  183. data/spec/unit/command/generator_commands/app_spec.rb +169 -169
  184. data/spec/unit/command/generator_commands/attribute_spec.rb +32 -32
  185. data/spec/unit/command/generator_commands/base_spec.rb +136 -136
  186. data/spec/unit/command/generator_commands/cookbook_file_spec.rb +32 -32
  187. data/spec/unit/command/generator_commands/cookbook_spec.rb +450 -450
  188. data/spec/unit/command/generator_commands/generator_generator_spec.rb +229 -229
  189. data/spec/unit/command/generator_commands/lwrp_spec.rb +32 -32
  190. data/spec/unit/command/generator_commands/policyfile_spec.rb +225 -225
  191. data/spec/unit/command/generator_commands/recipe_spec.rb +34 -34
  192. data/spec/unit/command/generator_commands/repo_spec.rb +367 -367
  193. data/spec/unit/command/generator_commands/template_spec.rb +32 -32
  194. data/spec/unit/command/install_spec.rb +179 -179
  195. data/spec/unit/command/provision_spec.rb +592 -592
  196. data/spec/unit/command/push_archive_spec.rb +153 -153
  197. data/spec/unit/command/push_spec.rb +199 -199
  198. data/spec/unit/command/shell_init_spec.rb +329 -329
  199. data/spec/unit/command/show_policy_spec.rb +235 -235
  200. data/spec/unit/command/undelete_spec.rb +246 -246
  201. data/spec/unit/command/update_spec.rb +275 -275
  202. data/spec/unit/command/verify_spec.rb +325 -325
  203. data/spec/unit/commands_map_spec.rb +57 -57
  204. data/spec/unit/component_test_spec.rb +126 -126
  205. data/spec/unit/configurable_spec.rb +41 -41
  206. data/spec/unit/cookbook_metadata_spec.rb +98 -98
  207. data/spec/unit/cookbook_profiler/git_spec.rb +176 -176
  208. data/spec/unit/cookbook_profiler/identifiers_spec.rb +83 -83
  209. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -9
  210. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -9
  211. data/spec/unit/fixtures/command/cli_test_command.rb +26 -26
  212. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -7
  213. data/spec/unit/fixtures/configurable/test_config_loader.rb +5 -5
  214. data/spec/unit/fixtures/configurable/test_configurable.rb +10 -10
  215. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  216. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -3
  217. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  218. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -96
  219. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  220. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  221. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -16
  222. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -3
  223. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -4
  224. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -96
  225. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -8
  226. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -8
  227. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/.kitchen.yml +16 -16
  228. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -3
  229. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -4
  230. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -96
  231. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -8
  232. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -8
  233. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1321 -1321
  234. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -2987
  235. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -1
  236. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +36 -36
  237. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -16
  238. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -2
  239. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -5
  240. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -3
  241. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -2
  242. data/spec/unit/fixtures/example_cookbook/.gitignore +17 -17
  243. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -16
  244. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -3
  245. data/spec/unit/fixtures/example_cookbook/README.md +4 -4
  246. data/spec/unit/fixtures/example_cookbook/chefignore +96 -96
  247. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -8
  248. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -8
  249. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -17
  250. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -16
  251. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -3
  252. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -4
  253. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -96
  254. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -5
  255. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -8
  256. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -17
  257. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -16
  258. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -3
  259. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -4
  260. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -96
  261. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -8
  262. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -4
  263. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -96
  264. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -8
  265. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -8
  266. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -3
  267. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -4
  268. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -96
  269. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -9
  270. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -8
  271. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -16
  272. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -3
  273. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -4
  274. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -96
  275. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/extra/extra_file.txt +0 -0
  276. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -8
  277. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -8
  278. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -2
  279. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  280. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  281. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  282. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  283. data/spec/unit/generator_spec.rb +120 -120
  284. data/spec/unit/helpers_spec.rb +92 -92
  285. data/spec/unit/pager_spec.rb +119 -119
  286. data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -93
  287. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +34 -34
  288. data/spec/unit/policyfile/community_cookbook_source_spec.rb +84 -84
  289. data/spec/unit/policyfile/comparison_base_spec.rb +343 -343
  290. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +277 -277
  291. data/spec/unit/policyfile/cookbook_locks_spec.rb +529 -529
  292. data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +130 -130
  293. data/spec/unit/policyfile/differ_spec.rb +687 -687
  294. data/spec/unit/policyfile/lister_spec.rb +272 -272
  295. data/spec/unit/policyfile/null_cookbook_source_spec.rb +35 -35
  296. data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -92
  297. data/spec/unit/policyfile/reports/install_spec.rb +115 -115
  298. data/spec/unit/policyfile/reports/upload_spec.rb +96 -96
  299. data/spec/unit/policyfile/solution_dependencies_spec.rb +145 -145
  300. data/spec/unit/policyfile/storage_config_spec.rb +172 -172
  301. data/spec/unit/policyfile/undo_record_spec.rb +260 -260
  302. data/spec/unit/policyfile/undo_stack_spec.rb +266 -266
  303. data/spec/unit/policyfile/uploader_spec.rb +410 -410
  304. data/spec/unit/policyfile_demands_spec.rb +1203 -1203
  305. data/spec/unit/policyfile_evaluation_spec.rb +642 -642
  306. data/spec/unit/policyfile_lock_build_spec.rb +1056 -1056
  307. data/spec/unit/policyfile_lock_install_spec.rb +138 -138
  308. data/spec/unit/policyfile_lock_serialization_spec.rb +425 -425
  309. data/spec/unit/policyfile_lock_validation_spec.rb +611 -611
  310. data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -236
  311. data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +275 -275
  312. data/spec/unit/policyfile_services/export_repo_spec.rb +481 -481
  313. data/spec/unit/policyfile_services/install_spec.rb +211 -211
  314. data/spec/unit/policyfile_services/push_archive_spec.rb +378 -378
  315. data/spec/unit/policyfile_services/push_spec.rb +233 -233
  316. data/spec/unit/policyfile_services/rm_policy_group_spec.rb +241 -241
  317. data/spec/unit/policyfile_services/rm_policy_spec.rb +266 -266
  318. data/spec/unit/policyfile_services/show_policy_spec.rb +889 -889
  319. data/spec/unit/policyfile_services/undelete_spec.rb +304 -304
  320. data/spec/unit/policyfile_services/update_attributes_spec.rb +217 -217
  321. data/spec/unit/service_exception_inspectors/base_spec.rb +43 -43
  322. data/spec/unit/service_exception_inspectors/http_spec.rb +140 -140
  323. data/spec/unit/shell_out_spec.rb +34 -34
  324. data/warning.txt +9 -9
  325. metadata +24 -19
@@ -1,204 +1,204 @@
1
- #
2
- # Copyright:: Copyright (c) 2015 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 'zlib'
19
- require 'archive/tar/minitar'
20
-
21
- require 'chef-dk/service_exceptions'
22
- require 'chef-dk/policyfile_lock'
23
- require 'chef-dk/authenticated_http'
24
- require 'chef-dk/policyfile/uploader'
25
-
26
- module ChefDK
27
- module PolicyfileServices
28
- class PushArchive
29
-
30
- USTAR_INDICATOR = "ustar\0".force_encoding(Encoding::ASCII_8BIT).freeze
31
-
32
- attr_reader :archive_file
33
- attr_reader :policy_group
34
- attr_reader :root_dir
35
- attr_reader :ui
36
- attr_reader :config
37
-
38
- attr_reader :policyfile_lock
39
-
40
-
41
- def initialize(archive_file: nil, policy_group: nil, root_dir: nil, ui: nil, config: nil)
42
- @archive_file = archive_file
43
- @policy_group = policy_group
44
- @root_dir = root_dir || Dir.pwd
45
- @ui = ui
46
- @config = config
47
-
48
- @policyfile_lock = nil
49
- end
50
-
51
- def archive_file_path
52
- File.expand_path(archive_file, root_dir)
53
- end
54
-
55
- def run
56
- unless File.exist?(archive_file_path)
57
- raise InvalidPolicyArchive, "Archive file #{archive_file_path} not found"
58
- end
59
- stage_unpacked_archive do |staging_dir|
60
- read_policyfile_lock(staging_dir)
61
-
62
- uploader.upload
63
- end
64
-
65
- rescue => e
66
- raise PolicyfilePushArchiveError.new("Failed to publish archived policy", e)
67
- end
68
-
69
- # @api private
70
- def uploader
71
- ChefDK::Policyfile::Uploader.new(policyfile_lock, policy_group,
72
- ui: ui,
73
- http_client: http_client,
74
- policy_document_native_api: config.policy_document_native_api)
75
- end
76
-
77
- # @api private
78
- def http_client
79
- @http_client ||= ChefDK::AuthenticatedHTTP.new(config.chef_server_url,
80
- signing_key_filename: config.client_key,
81
- client_name: config.node_name)
82
- end
83
-
84
- private
85
-
86
- def read_policyfile_lock(staging_dir)
87
- policyfile_lock_path = File.join(staging_dir, "Policyfile.lock.json")
88
-
89
- if looks_like_old_format_archive?(staging_dir)
90
- raise InvalidPolicyArchive, <<-MESSAGE
91
- This archive is in an unsupported format.
92
-
93
- This archive was created with an older version of ChefDK. This version of
94
- ChefDK does not support archives in the older format. Re-create the archive
95
- with a newer version of ChefDK or downgrade ChefDK.
96
- MESSAGE
97
- end
98
-
99
- unless File.exist?(policyfile_lock_path)
100
- raise InvalidPolicyArchive, "Archive does not contain a Policyfile.lock.json"
101
- end
102
-
103
- unless File.directory?(File.join(staging_dir, "cookbook_artifacts"))
104
- raise InvalidPolicyArchive, "Archive does not contain a cookbook_artifacts directory"
105
- end
106
-
107
-
108
- policy_data = load_policy_data(policyfile_lock_path)
109
- storage_config = Policyfile::StorageConfig.new.use_policyfile_lock(policyfile_lock_path)
110
- @policyfile_lock = ChefDK::PolicyfileLock.new(storage_config).build_from_archive(policy_data)
111
-
112
- missing_cookbooks = policyfile_lock.cookbook_locks.select do |name, lock|
113
- !lock.installed?
114
- end
115
-
116
- unless missing_cookbooks.empty?
117
- message = "Archive does not have all cookbooks required by the Policyfile.lock. " +
118
- "Missing cookbooks: '#{missing_cookbooks.keys.join('", "')}'."
119
- raise InvalidPolicyArchive, message
120
- end
121
-
122
- end
123
-
124
- def load_policy_data(policyfile_lock_path)
125
- FFI_Yajl::Parser.parse(IO.read(policyfile_lock_path))
126
- end
127
-
128
- def stage_unpacked_archive
129
- p = Process.pid
130
- t = Time.new.utc.strftime("%Y%m%d%H%M%S")
131
- Dir.mktmpdir("chefdk-push-archive-#{p}-#{t}") do |staging_dir|
132
- unpack_to(staging_dir)
133
- yield staging_dir
134
- end
135
-
136
- end
137
-
138
- def unpack_to(staging_dir)
139
- Zlib::GzipReader.open(archive_file_path) do |gz_file|
140
- untar_to(gz_file, staging_dir)
141
- end
142
-
143
- # untar_to can raise InvalidPolicyArchive, let it through
144
- rescue InvalidPolicyArchive
145
- raise
146
- rescue => e
147
- raise InvalidPolicyArchive, "Archive file #{archive_file_path} could not be unpacked. #{e}"
148
- end
149
-
150
- def untar_to(tar_file, staging_dir)
151
- # Minitar doesn't do much input checking, so if you feed it a
152
- # garbage-enough file it will just do weird things and blow up. For
153
- # example, if tar_file is just a bunch of nul characters, then tar will
154
- # try to open a file named '.'; if you give it some random string that
155
- # fits in the size of the filename header, it will create that file.
156
- #
157
- # Tar archives that we create via `chef export -a` and probably
158
- # everything else we might encounter should be in ustar format. For
159
- # such a tar file, bytes 257-263 should be "ustar\0", so we use this as
160
- # a sanity check.
161
- # https://en.wikipedia.org/wiki/Tar_(computing)
162
-
163
- first_tar_header = tar_file.read(512)
164
- ustar_indicator = first_tar_header[257, 6]
165
-
166
- unless ustar_indicator == USTAR_INDICATOR
167
- raise InvalidPolicyArchive, "Archive file #{archive_file_path} could not be unpacked. Tar archive looks corrupt."
168
- end
169
-
170
- # "undo" read of the first 512 bytes
171
- tar_file.rewind
172
-
173
- Archive::Tar::Minitar::Input.open(tar_file) do |stream|
174
- stream.each do |entry|
175
- stream.extract_entry(staging_dir, entry)
176
- end
177
- end
178
- end
179
-
180
- def looks_like_old_format_archive?(staging_dir)
181
- cookbooks_dir = File.join(staging_dir, "cookbooks")
182
- data_bags_dir = File.join(staging_dir, "data_bags")
183
-
184
- cookbook_artifacts_dir = File.join(staging_dir, "cookbook_artifacts")
185
- policies_dir = File.join(staging_dir, "policies")
186
- policy_groups_dir = File.join(staging_dir, "policy_groups")
187
-
188
- # Old archives just had these two dirs
189
- have_old_dirs = File.exist?(cookbooks_dir) && File.exist?(data_bags_dir)
190
-
191
- # New archives created by `chef export` will have all of these; it's
192
- # also possible we'll encounter an "artisanal" archive, which might
193
- # only be missing one of these by accident. In that case we want to
194
- # trigger a different error than we're detecting here.
195
- have_any_new_dirs = File.exist?(cookbook_artifacts_dir) ||
196
- File.exist?(policies_dir) ||
197
- File.exist?(policy_groups_dir)
198
-
199
- have_old_dirs && !have_any_new_dirs
200
- end
201
-
202
- end
203
- end
204
- end
1
+ #
2
+ # Copyright:: Copyright (c) 2015 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 'zlib'
19
+ require 'archive/tar/minitar'
20
+
21
+ require 'chef-dk/service_exceptions'
22
+ require 'chef-dk/policyfile_lock'
23
+ require 'chef-dk/authenticated_http'
24
+ require 'chef-dk/policyfile/uploader'
25
+
26
+ module ChefDK
27
+ module PolicyfileServices
28
+ class PushArchive
29
+
30
+ USTAR_INDICATOR = "ustar\0".force_encoding(Encoding::ASCII_8BIT).freeze
31
+
32
+ attr_reader :archive_file
33
+ attr_reader :policy_group
34
+ attr_reader :root_dir
35
+ attr_reader :ui
36
+ attr_reader :config
37
+
38
+ attr_reader :policyfile_lock
39
+
40
+
41
+ def initialize(archive_file: nil, policy_group: nil, root_dir: nil, ui: nil, config: nil)
42
+ @archive_file = archive_file
43
+ @policy_group = policy_group
44
+ @root_dir = root_dir || Dir.pwd
45
+ @ui = ui
46
+ @config = config
47
+
48
+ @policyfile_lock = nil
49
+ end
50
+
51
+ def archive_file_path
52
+ File.expand_path(archive_file, root_dir)
53
+ end
54
+
55
+ def run
56
+ unless File.exist?(archive_file_path)
57
+ raise InvalidPolicyArchive, "Archive file #{archive_file_path} not found"
58
+ end
59
+ stage_unpacked_archive do |staging_dir|
60
+ read_policyfile_lock(staging_dir)
61
+
62
+ uploader.upload
63
+ end
64
+
65
+ rescue => e
66
+ raise PolicyfilePushArchiveError.new("Failed to publish archived policy", e)
67
+ end
68
+
69
+ # @api private
70
+ def uploader
71
+ ChefDK::Policyfile::Uploader.new(policyfile_lock, policy_group,
72
+ ui: ui,
73
+ http_client: http_client,
74
+ policy_document_native_api: config.policy_document_native_api)
75
+ end
76
+
77
+ # @api private
78
+ def http_client
79
+ @http_client ||= ChefDK::AuthenticatedHTTP.new(config.chef_server_url,
80
+ signing_key_filename: config.client_key,
81
+ client_name: config.node_name)
82
+ end
83
+
84
+ private
85
+
86
+ def read_policyfile_lock(staging_dir)
87
+ policyfile_lock_path = File.join(staging_dir, "Policyfile.lock.json")
88
+
89
+ if looks_like_old_format_archive?(staging_dir)
90
+ raise InvalidPolicyArchive, <<-MESSAGE
91
+ This archive is in an unsupported format.
92
+
93
+ This archive was created with an older version of ChefDK. This version of
94
+ ChefDK does not support archives in the older format. Re-create the archive
95
+ with a newer version of ChefDK or downgrade ChefDK.
96
+ MESSAGE
97
+ end
98
+
99
+ unless File.exist?(policyfile_lock_path)
100
+ raise InvalidPolicyArchive, "Archive does not contain a Policyfile.lock.json"
101
+ end
102
+
103
+ unless File.directory?(File.join(staging_dir, "cookbook_artifacts"))
104
+ raise InvalidPolicyArchive, "Archive does not contain a cookbook_artifacts directory"
105
+ end
106
+
107
+
108
+ policy_data = load_policy_data(policyfile_lock_path)
109
+ storage_config = Policyfile::StorageConfig.new.use_policyfile_lock(policyfile_lock_path)
110
+ @policyfile_lock = ChefDK::PolicyfileLock.new(storage_config).build_from_archive(policy_data)
111
+
112
+ missing_cookbooks = policyfile_lock.cookbook_locks.select do |name, lock|
113
+ !lock.installed?
114
+ end
115
+
116
+ unless missing_cookbooks.empty?
117
+ message = "Archive does not have all cookbooks required by the Policyfile.lock. " +
118
+ "Missing cookbooks: '#{missing_cookbooks.keys.join('", "')}'."
119
+ raise InvalidPolicyArchive, message
120
+ end
121
+
122
+ end
123
+
124
+ def load_policy_data(policyfile_lock_path)
125
+ FFI_Yajl::Parser.parse(IO.read(policyfile_lock_path))
126
+ end
127
+
128
+ def stage_unpacked_archive
129
+ p = Process.pid
130
+ t = Time.new.utc.strftime("%Y%m%d%H%M%S")
131
+ Dir.mktmpdir("chefdk-push-archive-#{p}-#{t}") do |staging_dir|
132
+ unpack_to(staging_dir)
133
+ yield staging_dir
134
+ end
135
+
136
+ end
137
+
138
+ def unpack_to(staging_dir)
139
+ Zlib::GzipReader.open(archive_file_path) do |gz_file|
140
+ untar_to(gz_file, staging_dir)
141
+ end
142
+
143
+ # untar_to can raise InvalidPolicyArchive, let it through
144
+ rescue InvalidPolicyArchive
145
+ raise
146
+ rescue => e
147
+ raise InvalidPolicyArchive, "Archive file #{archive_file_path} could not be unpacked. #{e}"
148
+ end
149
+
150
+ def untar_to(tar_file, staging_dir)
151
+ # Minitar doesn't do much input checking, so if you feed it a
152
+ # garbage-enough file it will just do weird things and blow up. For
153
+ # example, if tar_file is just a bunch of nul characters, then tar will
154
+ # try to open a file named '.'; if you give it some random string that
155
+ # fits in the size of the filename header, it will create that file.
156
+ #
157
+ # Tar archives that we create via `chef export -a` and probably
158
+ # everything else we might encounter should be in ustar format. For
159
+ # such a tar file, bytes 257-263 should be "ustar\0", so we use this as
160
+ # a sanity check.
161
+ # https://en.wikipedia.org/wiki/Tar_(computing)
162
+
163
+ first_tar_header = tar_file.read(512)
164
+ ustar_indicator = first_tar_header[257, 6]
165
+
166
+ unless ustar_indicator == USTAR_INDICATOR
167
+ raise InvalidPolicyArchive, "Archive file #{archive_file_path} could not be unpacked. Tar archive looks corrupt."
168
+ end
169
+
170
+ # "undo" read of the first 512 bytes
171
+ tar_file.rewind
172
+
173
+ Archive::Tar::Minitar::Input.open(tar_file) do |stream|
174
+ stream.each do |entry|
175
+ stream.extract_entry(staging_dir, entry)
176
+ end
177
+ end
178
+ end
179
+
180
+ def looks_like_old_format_archive?(staging_dir)
181
+ cookbooks_dir = File.join(staging_dir, "cookbooks")
182
+ data_bags_dir = File.join(staging_dir, "data_bags")
183
+
184
+ cookbook_artifacts_dir = File.join(staging_dir, "cookbook_artifacts")
185
+ policies_dir = File.join(staging_dir, "policies")
186
+ policy_groups_dir = File.join(staging_dir, "policy_groups")
187
+
188
+ # Old archives just had these two dirs
189
+ have_old_dirs = File.exist?(cookbooks_dir) && File.exist?(data_bags_dir)
190
+
191
+ # New archives created by `chef export` will have all of these; it's
192
+ # also possible we'll encounter an "artisanal" archive, which might
193
+ # only be missing one of these by accident. In that case we want to
194
+ # trigger a different error than we're detecting here.
195
+ have_any_new_dirs = File.exist?(cookbook_artifacts_dir) ||
196
+ File.exist?(policies_dir) ||
197
+ File.exist?(policy_groups_dir)
198
+
199
+ have_old_dirs && !have_any_new_dirs
200
+ end
201
+
202
+ end
203
+ end
204
+ end
@@ -1,142 +1,142 @@
1
- #
2
- # Copyright:: Copyright (c) 2015 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 'chef-dk/service_exceptions'
19
- require 'chef-dk/authenticated_http'
20
- require 'chef-dk/policyfile/undo_stack'
21
- require 'chef-dk/policyfile/undo_record'
22
-
23
- module ChefDK
24
- module PolicyfileServices
25
-
26
- class RmPolicy
27
-
28
- attr_reader :policy_name
29
-
30
- # @api private
31
- attr_reader :chef_config
32
-
33
- # @api private
34
- attr_reader :ui
35
-
36
- # @api private
37
- attr_reader :undo_record
38
-
39
- # @api private
40
- attr_reader :undo_stack
41
-
42
- def initialize(config: nil, ui: nil, policy_name: nil)
43
- @chef_config = config
44
- @ui = ui
45
- @policy_name = policy_name
46
-
47
- @policy_revision_data = nil
48
- @policy_exists = false
49
- @policy_group_data = nil
50
-
51
- @undo_record = Policyfile::UndoRecord.new
52
- @undo_stack = Policyfile::UndoStack.new
53
- end
54
-
55
- def run
56
- unless policy_exists?
57
- ui.err("Policy '#{policy_name}' does not exist on the server")
58
- return false
59
- end
60
-
61
- undo_record.description = "delete-policy #{policy_name}"
62
-
63
- unless policy_has_no_revisions?
64
- gather_policy_data_for_undo
65
- end
66
-
67
- http_client.delete("/policies/#{policy_name}")
68
- undo_stack.push(undo_record)
69
- ui.err("Removed policy '#{policy_name}'.")
70
- rescue => e
71
- raise DeletePolicyError.new("Failed to delete policy '#{policy_name}'", e)
72
- end
73
-
74
- # @api private
75
- # An instance of ChefDK::AuthenticatedHTTP configured with the user's
76
- # server URL and credentials.
77
- def http_client
78
- @http_client ||= ChefDK::AuthenticatedHTTP.new(chef_config.chef_server_url,
79
- signing_key_filename: chef_config.client_key,
80
- client_name: chef_config.node_name)
81
- end
82
-
83
- private
84
-
85
- def policy_has_no_revisions?
86
- policy_revision_data.empty? || policy_revision_data["revisions"].empty?
87
- end
88
-
89
- def gather_policy_data_for_undo
90
- revisions = policy_revision_data["revisions"].keys
91
-
92
- revisions.each do |revision_id|
93
- policy_revision_data = http_client.get("/policies/#{policy_name}/revisions/#{revision_id}")
94
- policy_groups = policy_groups_using_revision(revision_id)
95
- if policy_groups.empty?
96
- undo_record.add_policy_revision(policy_name, nil, policy_revision_data)
97
- else
98
- policy_groups.each do |policy_group|
99
- undo_record.add_policy_revision(policy_name, policy_group, policy_revision_data)
100
- end
101
- end
102
- end
103
- end
104
-
105
- def policy_groups_using_revision(revision_id)
106
- groups = []
107
- policy_group_data.each do |group_name, group_info|
108
- next unless group_info.key?("policies") && !group_info["policies"].empty?
109
- next unless group_info["policies"].key?(policy_name)
110
- next unless group_info["policies"][policy_name]["revision_id"] == revision_id
111
- groups << group_name if group_info
112
- end
113
- groups
114
- end
115
-
116
- def policy_group_data
117
- @policy_group_data ||= http_client.get("/policy_groups")
118
- end
119
-
120
- def policy_exists?
121
- return true if @policy_exists
122
- fetch_policy_revision_data
123
- @policy_exists
124
- end
125
-
126
- def policy_revision_data
127
- return @policy_revision_data if @policy_exists
128
- fetch_policy_revision_data
129
- end
130
-
131
- def fetch_policy_revision_data
132
- @policy_revision_data = http_client.get("/policies/#{policy_name}")
133
- @policy_exists = true
134
- rescue Net::HTTPServerException => e
135
- raise unless e.response.code == "404"
136
- @policy_exists = false
137
- end
138
-
139
- end
140
- end
141
- end
142
-
1
+ #
2
+ # Copyright:: Copyright (c) 2015 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 'chef-dk/service_exceptions'
19
+ require 'chef-dk/authenticated_http'
20
+ require 'chef-dk/policyfile/undo_stack'
21
+ require 'chef-dk/policyfile/undo_record'
22
+
23
+ module ChefDK
24
+ module PolicyfileServices
25
+
26
+ class RmPolicy
27
+
28
+ attr_reader :policy_name
29
+
30
+ # @api private
31
+ attr_reader :chef_config
32
+
33
+ # @api private
34
+ attr_reader :ui
35
+
36
+ # @api private
37
+ attr_reader :undo_record
38
+
39
+ # @api private
40
+ attr_reader :undo_stack
41
+
42
+ def initialize(config: nil, ui: nil, policy_name: nil)
43
+ @chef_config = config
44
+ @ui = ui
45
+ @policy_name = policy_name
46
+
47
+ @policy_revision_data = nil
48
+ @policy_exists = false
49
+ @policy_group_data = nil
50
+
51
+ @undo_record = Policyfile::UndoRecord.new
52
+ @undo_stack = Policyfile::UndoStack.new
53
+ end
54
+
55
+ def run
56
+ unless policy_exists?
57
+ ui.err("Policy '#{policy_name}' does not exist on the server")
58
+ return false
59
+ end
60
+
61
+ undo_record.description = "delete-policy #{policy_name}"
62
+
63
+ unless policy_has_no_revisions?
64
+ gather_policy_data_for_undo
65
+ end
66
+
67
+ http_client.delete("/policies/#{policy_name}")
68
+ undo_stack.push(undo_record)
69
+ ui.err("Removed policy '#{policy_name}'.")
70
+ rescue => e
71
+ raise DeletePolicyError.new("Failed to delete policy '#{policy_name}'", e)
72
+ end
73
+
74
+ # @api private
75
+ # An instance of ChefDK::AuthenticatedHTTP configured with the user's
76
+ # server URL and credentials.
77
+ def http_client
78
+ @http_client ||= ChefDK::AuthenticatedHTTP.new(chef_config.chef_server_url,
79
+ signing_key_filename: chef_config.client_key,
80
+ client_name: chef_config.node_name)
81
+ end
82
+
83
+ private
84
+
85
+ def policy_has_no_revisions?
86
+ policy_revision_data.empty? || policy_revision_data["revisions"].empty?
87
+ end
88
+
89
+ def gather_policy_data_for_undo
90
+ revisions = policy_revision_data["revisions"].keys
91
+
92
+ revisions.each do |revision_id|
93
+ policy_revision_data = http_client.get("/policies/#{policy_name}/revisions/#{revision_id}")
94
+ policy_groups = policy_groups_using_revision(revision_id)
95
+ if policy_groups.empty?
96
+ undo_record.add_policy_revision(policy_name, nil, policy_revision_data)
97
+ else
98
+ policy_groups.each do |policy_group|
99
+ undo_record.add_policy_revision(policy_name, policy_group, policy_revision_data)
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+ def policy_groups_using_revision(revision_id)
106
+ groups = []
107
+ policy_group_data.each do |group_name, group_info|
108
+ next unless group_info.key?("policies") && !group_info["policies"].empty?
109
+ next unless group_info["policies"].key?(policy_name)
110
+ next unless group_info["policies"][policy_name]["revision_id"] == revision_id
111
+ groups << group_name if group_info
112
+ end
113
+ groups
114
+ end
115
+
116
+ def policy_group_data
117
+ @policy_group_data ||= http_client.get("/policy_groups")
118
+ end
119
+
120
+ def policy_exists?
121
+ return true if @policy_exists
122
+ fetch_policy_revision_data
123
+ @policy_exists
124
+ end
125
+
126
+ def policy_revision_data
127
+ return @policy_revision_data if @policy_exists
128
+ fetch_policy_revision_data
129
+ end
130
+
131
+ def fetch_policy_revision_data
132
+ @policy_revision_data = http_client.get("/policies/#{policy_name}")
133
+ @policy_exists = true
134
+ rescue Net::HTTPServerException => e
135
+ raise unless e.response.code == "404"
136
+ @policy_exists = false
137
+ end
138
+
139
+ end
140
+ end
141
+ end
142
+