chef-dk 3.9.0 → 3.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +139 -139
  3. data/Gemfile.lock +917 -919
  4. data/LICENSE +201 -201
  5. data/Rakefile +77 -77
  6. data/bin/chef +25 -25
  7. data/chef-dk.gemspec +60 -60
  8. data/lib/chef-dk.rb +19 -19
  9. data/lib/chef-dk/authenticated_http.rb +22 -22
  10. data/lib/chef-dk/builtin_commands.rb +62 -62
  11. data/lib/chef-dk/chef_runner.rb +114 -114
  12. data/lib/chef-dk/chef_server_api_multi.rb +73 -73
  13. data/lib/chef-dk/cli.rb +201 -201
  14. data/lib/chef-dk/command/base.rb +79 -79
  15. data/lib/chef-dk/command/clean_policy_cookbooks.rb +114 -114
  16. data/lib/chef-dk/command/clean_policy_revisions.rb +111 -111
  17. data/lib/chef-dk/command/delete_policy.rb +120 -120
  18. data/lib/chef-dk/command/delete_policy_group.rb +120 -120
  19. data/lib/chef-dk/command/describe_cookbook.rb +95 -95
  20. data/lib/chef-dk/command/diff.rb +315 -315
  21. data/lib/chef-dk/command/env.rb +89 -89
  22. data/lib/chef-dk/command/exec.rb +44 -44
  23. data/lib/chef-dk/command/export.rb +155 -155
  24. data/lib/chef-dk/command/gem.rb +47 -47
  25. data/lib/chef-dk/command/generate.rb +126 -126
  26. data/lib/chef-dk/command/generator_commands.rb +83 -83
  27. data/lib/chef-dk/command/generator_commands/app.rb +106 -106
  28. data/lib/chef-dk/command/generator_commands/attribute.rb +36 -36
  29. data/lib/chef-dk/command/generator_commands/base.rb +157 -157
  30. data/lib/chef-dk/command/generator_commands/build_cookbook.rb +125 -125
  31. data/lib/chef-dk/command/generator_commands/chef_exts/generator_desc_resource.rb +85 -85
  32. data/lib/chef-dk/command/generator_commands/chef_exts/quieter_doc_formatter.rb +38 -38
  33. data/lib/chef-dk/command/generator_commands/chef_exts/recipe_dsl_ext.rb +39 -39
  34. data/lib/chef-dk/command/generator_commands/cookbook.rb +251 -251
  35. data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +100 -100
  36. data/lib/chef-dk/command/generator_commands/cookbook_file.rb +45 -45
  37. data/lib/chef-dk/command/generator_commands/generator_generator.rb +174 -174
  38. data/lib/chef-dk/command/generator_commands/helpers.rb +36 -36
  39. data/lib/chef-dk/command/generator_commands/policyfile.rb +124 -124
  40. data/lib/chef-dk/command/generator_commands/recipe.rb +36 -36
  41. data/lib/chef-dk/command/generator_commands/repo.rb +123 -123
  42. data/lib/chef-dk/command/generator_commands/resource.rb +36 -36
  43. data/lib/chef-dk/command/generator_commands/template.rb +46 -46
  44. data/lib/chef-dk/command/install.rb +120 -120
  45. data/lib/chef-dk/command/provision.rb +439 -439
  46. data/lib/chef-dk/command/push.rb +117 -117
  47. data/lib/chef-dk/command/push_archive.rb +125 -125
  48. data/lib/chef-dk/command/shell_init.rb +179 -179
  49. data/lib/chef-dk/command/show_policy.rb +163 -163
  50. data/lib/chef-dk/command/undelete.rb +154 -154
  51. data/lib/chef-dk/command/update.rb +139 -139
  52. data/lib/chef-dk/command/verify.rb +638 -638
  53. data/lib/chef-dk/commands_map.rb +113 -113
  54. data/lib/chef-dk/completions/bash.sh.erb +5 -5
  55. data/lib/chef-dk/completions/chef.fish.erb +10 -10
  56. data/lib/chef-dk/completions/zsh.zsh.erb +21 -21
  57. data/lib/chef-dk/component_test.rb +227 -227
  58. data/lib/chef-dk/configurable.rb +88 -88
  59. data/lib/chef-dk/cookbook_metadata.rb +45 -45
  60. data/lib/chef-dk/cookbook_omnifetch.rb +32 -32
  61. data/lib/chef-dk/cookbook_profiler/git.rb +152 -152
  62. data/lib/chef-dk/cookbook_profiler/identifiers.rb +72 -72
  63. data/lib/chef-dk/cookbook_profiler/null_scm.rb +31 -31
  64. data/lib/chef-dk/exceptions.rb +151 -151
  65. data/lib/chef-dk/generator.rb +165 -165
  66. data/lib/chef-dk/helpers.rb +176 -176
  67. data/lib/chef-dk/pager.rb +104 -104
  68. data/lib/chef-dk/policyfile/artifactory_cookbook_source.rb +102 -102
  69. data/lib/chef-dk/policyfile/attribute_merge_checker.rb +110 -110
  70. data/lib/chef-dk/policyfile/chef_repo_cookbook_source.rb +138 -138
  71. data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +99 -99
  72. data/lib/chef-dk/policyfile/chef_server_lock_fetcher.rb +167 -167
  73. data/lib/chef-dk/policyfile/community_cookbook_source.rb +95 -95
  74. data/lib/chef-dk/policyfile/comparison_base.rb +123 -123
  75. data/lib/chef-dk/policyfile/cookbook_location_specification.rb +154 -154
  76. data/lib/chef-dk/policyfile/cookbook_locks.rb +466 -466
  77. data/lib/chef-dk/policyfile/cookbook_sources.rb +23 -23
  78. data/lib/chef-dk/policyfile/delivery_supermarket_source.rb +89 -89
  79. data/lib/chef-dk/policyfile/differ.rb +263 -263
  80. data/lib/chef-dk/policyfile/dsl.rb +288 -288
  81. data/lib/chef-dk/policyfile/git_lock_fetcher.rb +265 -265
  82. data/lib/chef-dk/policyfile/included_policies_cookbook_source.rb +156 -156
  83. data/lib/chef-dk/policyfile/lister.rb +229 -229
  84. data/lib/chef-dk/policyfile/local_lock_fetcher.rb +132 -129
  85. data/lib/chef-dk/policyfile/lock_applier.rb +80 -80
  86. data/lib/chef-dk/policyfile/lock_fetcher_mixin.rb +37 -0
  87. data/lib/chef-dk/policyfile/null_cookbook_source.rb +49 -49
  88. data/lib/chef-dk/policyfile/policyfile_location_specification.rb +128 -125
  89. data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -124
  90. data/lib/chef-dk/policyfile/remote_lock_fetcher.rb +108 -0
  91. data/lib/chef-dk/policyfile/reports/install.rb +69 -69
  92. data/lib/chef-dk/policyfile/reports/table_printer.rb +57 -57
  93. data/lib/chef-dk/policyfile/reports/upload.rb +70 -70
  94. data/lib/chef-dk/policyfile/solution_dependencies.rb +311 -311
  95. data/lib/chef-dk/policyfile/source_uri.rb +57 -57
  96. data/lib/chef-dk/policyfile/storage_config.rb +112 -112
  97. data/lib/chef-dk/policyfile/undo_record.rb +139 -139
  98. data/lib/chef-dk/policyfile/undo_stack.rb +128 -128
  99. data/lib/chef-dk/policyfile/uploader.rb +222 -222
  100. data/lib/chef-dk/policyfile_compiler.rb +528 -528
  101. data/lib/chef-dk/policyfile_lock.rb +581 -581
  102. data/lib/chef-dk/policyfile_services/clean_policies.rb +95 -95
  103. data/lib/chef-dk/policyfile_services/clean_policy_cookbooks.rb +123 -123
  104. data/lib/chef-dk/policyfile_services/export_repo.rb +419 -419
  105. data/lib/chef-dk/policyfile_services/install.rb +167 -167
  106. data/lib/chef-dk/policyfile_services/push.rb +112 -112
  107. data/lib/chef-dk/policyfile_services/push_archive.rb +164 -164
  108. data/lib/chef-dk/policyfile_services/rm_policy.rb +141 -141
  109. data/lib/chef-dk/policyfile_services/rm_policy_group.rb +85 -85
  110. data/lib/chef-dk/policyfile_services/show_policy.rb +234 -234
  111. data/lib/chef-dk/policyfile_services/undelete.rb +108 -108
  112. data/lib/chef-dk/policyfile_services/update_attributes.rb +110 -110
  113. data/lib/chef-dk/service_exception_inspectors.rb +24 -24
  114. data/lib/chef-dk/service_exception_inspectors/base.rb +39 -39
  115. data/lib/chef-dk/service_exception_inspectors/http.rb +119 -119
  116. data/lib/chef-dk/service_exceptions.rb +142 -142
  117. data/lib/chef-dk/shell_out.rb +36 -36
  118. data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +4 -4
  119. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/.kitchen.yml +21 -21
  120. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/README.md +146 -146
  121. data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +9 -9
  122. data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +104 -104
  123. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -9
  124. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README.md +66 -66
  125. data/lib/chef-dk/skeletons/code_generator/files/default/delivery-config.json +17 -17
  126. data/lib/chef-dk/skeletons/code_generator/files/default/delivery-project.toml +36 -36
  127. data/lib/chef-dk/skeletons/code_generator/files/default/gitignore +22 -22
  128. data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +24 -24
  129. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -27
  130. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +8 -8
  131. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +7 -7
  132. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +9 -9
  133. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +56 -56
  134. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +3 -3
  135. data/lib/chef-dk/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -6
  136. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +9 -9
  137. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/example.json +12 -12
  138. data/lib/chef-dk/skeletons/code_generator/files/default/repo/policyfiles/README.md +24 -24
  139. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +9 -9
  140. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/example.json +12 -12
  141. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +3 -3
  142. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper_policyfile.rb +3 -3
  143. data/lib/chef-dk/skeletons/code_generator/metadata.rb +8 -8
  144. data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +89 -89
  145. data/lib/chef-dk/skeletons/code_generator/recipes/attribute.rb +13 -13
  146. data/lib/chef-dk/skeletons/code_generator/recipes/build_cookbook.rb +177 -177
  147. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +161 -161
  148. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook_file.rb +25 -25
  149. data/lib/chef-dk/skeletons/code_generator/recipes/helpers.rb +21 -21
  150. data/lib/chef-dk/skeletons/code_generator/recipes/policyfile.rb +9 -9
  151. data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +52 -52
  152. data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +68 -68
  153. data/lib/chef-dk/skeletons/code_generator/recipes/resource.rb +13 -13
  154. data/lib/chef-dk/skeletons/code_generator/recipes/template.rb +32 -32
  155. data/lib/chef-dk/skeletons/code_generator/templates/default/CHANGELOG.md.erb +11 -11
  156. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -3
  157. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.apachev2.erb +201 -201
  158. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -339
  159. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -674
  160. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -21
  161. data/lib/chef-dk/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -25
  162. data/lib/chef-dk/skeletons/code_generator/templates/default/README.md.erb +4 -4
  163. data/lib/chef-dk/skeletons/code_generator/templates/default/attribute.rb.erb +0 -0
  164. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/Berksfile.erb +7 -7
  165. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +10 -10
  166. data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +8 -8
  167. data/lib/chef-dk/skeletons/code_generator/templates/default/cookbook_file.erb +0 -0
  168. data/lib/chef-dk/skeletons/code_generator/templates/default/helpers.rb.erb +39 -39
  169. data/lib/chef-dk/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +16 -16
  170. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen.yml.erb +26 -26
  171. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_dokken.yml.erb +31 -31
  172. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +33 -33
  173. data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +20 -20
  174. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +5 -5
  175. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe_spec.rb.erb +35 -35
  176. data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +128 -128
  177. data/lib/chef-dk/skeletons/code_generator/templates/default/resource.rb.erb +1 -1
  178. data/lib/chef-dk/skeletons/code_generator/templates/default/template.erb +0 -0
  179. data/lib/chef-dk/ui.rb +57 -57
  180. data/lib/chef-dk/version.rb +20 -20
  181. data/lib/kitchen/provisioner/policyfile_zero.rb +195 -195
  182. data/spec/shared/a_file_generator.rb +125 -125
  183. data/spec/shared/a_generated_file.rb +12 -12
  184. data/spec/shared/command_with_ui_object.rb +11 -11
  185. data/spec/shared/custom_generator_cookbook.rb +136 -136
  186. data/spec/shared/fixture_cookbook_checksums.rb +46 -46
  187. data/spec/shared/setup_git_committer_config.rb +54 -54
  188. data/spec/shared/setup_git_cookbooks.rb +53 -53
  189. data/spec/spec_helper.rb +51 -51
  190. data/spec/test_helpers.rb +84 -84
  191. data/spec/unit/chef_runner_spec.rb +139 -139
  192. data/spec/unit/chef_server_api_multi_spec.rb +120 -120
  193. data/spec/unit/cli_spec.rb +377 -377
  194. data/spec/unit/command/base_spec.rb +172 -172
  195. data/spec/unit/command/clean_policy_cookbooks_spec.rb +180 -180
  196. data/spec/unit/command/clean_policy_revisions_spec.rb +180 -180
  197. data/spec/unit/command/delete_policy_group_spec.rb +206 -206
  198. data/spec/unit/command/delete_policy_spec.rb +206 -206
  199. data/spec/unit/command/diff_spec.rb +311 -311
  200. data/spec/unit/command/env_spec.rb +52 -52
  201. data/spec/unit/command/exec_spec.rb +178 -178
  202. data/spec/unit/command/export_spec.rb +199 -199
  203. data/spec/unit/command/generate_spec.rb +142 -142
  204. data/spec/unit/command/generator_commands/app_spec.rb +166 -166
  205. data/spec/unit/command/generator_commands/attribute_spec.rb +31 -31
  206. data/spec/unit/command/generator_commands/base_spec.rb +181 -181
  207. data/spec/unit/command/generator_commands/build_cookbook_spec.rb +377 -377
  208. data/spec/unit/command/generator_commands/chef_exts/generator_desc_resource_spec.rb +97 -97
  209. data/spec/unit/command/generator_commands/chef_exts/recipe_dsl_ext_spec.rb +111 -111
  210. data/spec/unit/command/generator_commands/cookbook_file_spec.rb +31 -31
  211. data/spec/unit/command/generator_commands/cookbook_spec.rb +765 -765
  212. data/spec/unit/command/generator_commands/generator_generator_spec.rb +227 -227
  213. data/spec/unit/command/generator_commands/helpers_spec.rb +31 -31
  214. data/spec/unit/command/generator_commands/policyfile_spec.rb +223 -223
  215. data/spec/unit/command/generator_commands/recipe_spec.rb +37 -37
  216. data/spec/unit/command/generator_commands/repo_spec.rb +374 -374
  217. data/spec/unit/command/generator_commands/resource_spec.rb +31 -31
  218. data/spec/unit/command/generator_commands/template_spec.rb +31 -31
  219. data/spec/unit/command/install_spec.rb +179 -179
  220. data/spec/unit/command/provision_spec.rb +589 -589
  221. data/spec/unit/command/push_archive_spec.rb +153 -153
  222. data/spec/unit/command/push_spec.rb +198 -198
  223. data/spec/unit/command/shell_init_spec.rb +339 -339
  224. data/spec/unit/command/show_policy_spec.rb +234 -234
  225. data/spec/unit/command/undelete_spec.rb +244 -244
  226. data/spec/unit/command/update_spec.rb +283 -283
  227. data/spec/unit/command/verify_spec.rb +342 -342
  228. data/spec/unit/commands_map_spec.rb +57 -57
  229. data/spec/unit/component_test_spec.rb +128 -128
  230. data/spec/unit/configurable_spec.rb +68 -68
  231. data/spec/unit/cookbook_metadata_spec.rb +96 -96
  232. data/spec/unit/cookbook_profiler/git_spec.rb +176 -176
  233. data/spec/unit/cookbook_profiler/identifiers_spec.rb +81 -81
  234. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -9
  235. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -9
  236. data/spec/unit/fixtures/command/cli_test_command.rb +26 -26
  237. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -7
  238. data/spec/unit/fixtures/configurable/test_config_loader.rb +5 -5
  239. data/spec/unit/fixtures/configurable/test_configurable.rb +10 -10
  240. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  241. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -3
  242. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  243. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -96
  244. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  245. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  246. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -16
  247. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -3
  248. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -4
  249. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -96
  250. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -8
  251. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -8
  252. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/.kitchen.yml +16 -16
  253. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -3
  254. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -4
  255. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -96
  256. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -8
  257. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -8
  258. data/spec/unit/fixtures/cookbooks_api/chef_server_universe.json +56 -56
  259. data/spec/unit/fixtures/cookbooks_api/pruned_chef_server_universe.json +30 -30
  260. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1321 -1321
  261. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -2987
  262. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -1
  263. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +33 -33
  264. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -16
  265. data/spec/unit/fixtures/dev_cookbooks/bar-cookbook.gitbundle +0 -0
  266. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/bin/.keep +0 -0
  267. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/.keep +0 -0
  268. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/bin/.keep +0 -0
  269. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/bin/.keep +0 -0
  270. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/berkshelf/.keep +0 -0
  271. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/test-kitchen/.keep +0 -0
  272. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/bin/.keep +0 -0
  273. data/spec/unit/fixtures/eg_omnibus_dir/valid/bin/.keep +0 -0
  274. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -2
  275. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -5
  276. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef-dk/.keep +0 -0
  277. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -3
  278. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -2
  279. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/bin/.keep +0 -0
  280. data/spec/unit/fixtures/example_app/Policyfile.rb +0 -0
  281. data/spec/unit/fixtures/example_cookbook/.gitignore +17 -17
  282. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -16
  283. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -3
  284. data/spec/unit/fixtures/example_cookbook/README.md +4 -4
  285. data/spec/unit/fixtures/example_cookbook/chefignore +96 -96
  286. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -8
  287. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -8
  288. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -17
  289. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -16
  290. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -3
  291. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -4
  292. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -96
  293. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -5
  294. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -8
  295. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -17
  296. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -16
  297. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -3
  298. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -4
  299. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -96
  300. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -8
  301. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -4
  302. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -96
  303. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -8
  304. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -8
  305. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -3
  306. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -4
  307. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -96
  308. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -9
  309. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -8
  310. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -16
  311. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -3
  312. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -4
  313. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -96
  314. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/extra/extra_file.txt +0 -0
  315. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -8
  316. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -8
  317. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -2
  318. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  319. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  320. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  321. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  322. data/spec/unit/generator_spec.rb +119 -119
  323. data/spec/unit/pager_spec.rb +117 -117
  324. data/spec/unit/policyfile/artifactory_cookbook_source_spec.rb +59 -59
  325. data/spec/unit/policyfile/attribute_merge_checker_spec.rb +80 -80
  326. data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -93
  327. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +55 -55
  328. data/spec/unit/policyfile/chef_server_lock_fetcher_spec.rb +161 -161
  329. data/spec/unit/policyfile/community_cookbook_source_spec.rb +83 -83
  330. data/spec/unit/policyfile/comparison_base_spec.rb +340 -340
  331. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +347 -347
  332. data/spec/unit/policyfile/cookbook_locks_spec.rb +527 -527
  333. data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +129 -129
  334. data/spec/unit/policyfile/differ_spec.rb +686 -686
  335. data/spec/unit/policyfile/git_lock_fetcher_spec.rb +155 -155
  336. data/spec/unit/policyfile/included_policies_cookbook_source_spec.rb +242 -242
  337. data/spec/unit/policyfile/lister_spec.rb +268 -268
  338. data/spec/unit/policyfile/local_lock_fetcher_spec.rb +199 -173
  339. data/spec/unit/policyfile/lock_applier_spec.rb +100 -100
  340. data/spec/unit/policyfile/lock_fetcher_mixin_spec.rb +60 -0
  341. data/spec/unit/policyfile/null_cookbook_source_spec.rb +34 -34
  342. data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -92
  343. data/spec/unit/policyfile/remote_lock_fetcher_spec.rb +129 -0
  344. data/spec/unit/policyfile/reports/install_spec.rb +114 -114
  345. data/spec/unit/policyfile/reports/upload_spec.rb +94 -94
  346. data/spec/unit/policyfile/solution_dependencies_spec.rb +170 -170
  347. data/spec/unit/policyfile/source_uri_spec.rb +36 -36
  348. data/spec/unit/policyfile/storage_config_spec.rb +180 -180
  349. data/spec/unit/policyfile/undo_record_spec.rb +258 -258
  350. data/spec/unit/policyfile/undo_stack_spec.rb +265 -265
  351. data/spec/unit/policyfile/uploader_spec.rb +410 -410
  352. data/spec/unit/policyfile_demands_spec.rb +1197 -1197
  353. data/spec/unit/policyfile_evaluation_spec.rb +628 -628
  354. data/spec/unit/policyfile_includes_dsl_spec.rb +220 -159
  355. data/spec/unit/policyfile_includes_spec.rb +720 -720
  356. data/spec/unit/policyfile_install_with_includes_spec.rb +232 -232
  357. data/spec/unit/policyfile_lock_build_spec.rb +1065 -1065
  358. data/spec/unit/policyfile_lock_install_spec.rb +137 -137
  359. data/spec/unit/policyfile_lock_serialization_spec.rb +424 -424
  360. data/spec/unit/policyfile_lock_validation_spec.rb +608 -608
  361. data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -236
  362. data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +272 -272
  363. data/spec/unit/policyfile_services/export_repo_spec.rb +473 -473
  364. data/spec/unit/policyfile_services/install_spec.rb +209 -209
  365. data/spec/unit/policyfile_services/push_archive_spec.rb +359 -359
  366. data/spec/unit/policyfile_services/push_spec.rb +249 -249
  367. data/spec/unit/policyfile_services/rm_policy_group_spec.rb +237 -237
  368. data/spec/unit/policyfile_services/rm_policy_spec.rb +263 -263
  369. data/spec/unit/policyfile_services/show_policy_spec.rb +887 -887
  370. data/spec/unit/policyfile_services/undelete_spec.rb +302 -302
  371. data/spec/unit/policyfile_services/update_attributes_spec.rb +229 -229
  372. data/spec/unit/policyfile_services/update_spec.rb +162 -162
  373. data/spec/unit/service_exception_inspectors/base_spec.rb +41 -41
  374. data/spec/unit/service_exception_inspectors/http_spec.rb +138 -138
  375. data/spec/unit/shell_out_spec.rb +34 -34
  376. data/warning.txt +9 -9
  377. metadata +8 -2
@@ -1,36 +1,36 @@
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 "chef-dk/command/generator_commands/cookbook_code_file"
19
-
20
- module ChefDK
21
- module Command
22
- module GeneratorCommands
23
- # chef generate resource [path/to/cookbook_root] NAME
24
- class Resource < CookbookCodeFile
25
-
26
- banner "Usage: chef generate resource [path/to/cookbook] NAME [options]"
27
-
28
- options.merge!(SharedGeneratorOptions.options)
29
-
30
- def recipe
31
- "resource"
32
- end
33
- end
34
- end
35
- end
36
- 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 "chef-dk/command/generator_commands/cookbook_code_file"
19
+
20
+ module ChefDK
21
+ module Command
22
+ module GeneratorCommands
23
+ # chef generate resource [path/to/cookbook_root] NAME
24
+ class Resource < CookbookCodeFile
25
+
26
+ banner "Usage: chef generate resource [path/to/cookbook] NAME [options]"
27
+
28
+ options.merge!(SharedGeneratorOptions.options)
29
+
30
+ def recipe
31
+ "resource"
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,46 +1,46 @@
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 "chef-dk/command/generator_commands/cookbook_code_file"
19
-
20
- module ChefDK
21
- module Command
22
- module GeneratorCommands
23
- # chef generate template [path/to/cookbook_root] name --source=source_file
24
- class Template < CookbookCodeFile
25
-
26
- option :source,
27
- short: "-s SOURCE_FILE",
28
- long: "--source SOURCE_FILE",
29
- description: "Copy content from SOURCE_FILE"
30
-
31
- banner "Usage: chef generate template [path/to/cookbook] NAME [options]"
32
-
33
- options.merge!(SharedGeneratorOptions.options)
34
-
35
- def recipe
36
- "template"
37
- end
38
-
39
- def setup_context
40
- super
41
- Generator.add_attr_to_context(:content_source, config[:source])
42
- end
43
- end
44
- end
45
- end
46
- 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 "chef-dk/command/generator_commands/cookbook_code_file"
19
+
20
+ module ChefDK
21
+ module Command
22
+ module GeneratorCommands
23
+ # chef generate template [path/to/cookbook_root] name --source=source_file
24
+ class Template < CookbookCodeFile
25
+
26
+ option :source,
27
+ short: "-s SOURCE_FILE",
28
+ long: "--source SOURCE_FILE",
29
+ description: "Copy content from SOURCE_FILE"
30
+
31
+ banner "Usage: chef generate template [path/to/cookbook] NAME [options]"
32
+
33
+ options.merge!(SharedGeneratorOptions.options)
34
+
35
+ def recipe
36
+ "template"
37
+ end
38
+
39
+ def setup_context
40
+ super
41
+ Generator.add_attr_to_context(:content_source, config[:source])
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,120 +1,120 @@
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 "chef-dk/command/base"
19
- require "chef-dk/ui"
20
- require "chef-dk/policyfile_services/install"
21
- require "chef-dk/configurable"
22
-
23
- module ChefDK
24
- module Command
25
-
26
- class Install < Base
27
-
28
- include Configurable
29
-
30
- banner(<<~E)
31
- Usage: chef install [ POLICY_FILE ] [options]
32
-
33
- `chef install` evaluates a `Policyfile.rb` to find a compatible set of
34
- cookbooks for the policy's run_list and caches them locally. It emits a
35
- Policyfile.lock.json describing the locked cookbook set. You can use the
36
- lockfile to install the locked cookbooks on another machine. You can also push
37
- the lockfile to a "policy group" on a Chef Server and apply that exact set of
38
- cookbooks to nodes in your infrastructure.
39
-
40
- See our detailed README for more information:
41
-
42
- https://docs.chef.io/policyfile.html
43
-
44
- Options:
45
-
46
- E
47
-
48
- option :config_file,
49
- short: "-c CONFIG_FILE",
50
- long: "--config CONFIG_FILE",
51
- description: "Path to configuration file"
52
-
53
- option :debug,
54
- short: "-D",
55
- long: "--debug",
56
- description: "Enable stacktraces and other debug output",
57
- default: false
58
-
59
- attr_reader :policyfile_relative_path
60
-
61
- attr_accessor :ui
62
-
63
- def initialize(*args)
64
- super
65
- @ui = UI.new
66
-
67
- @policyfile_relative_path = nil
68
- @installer = nil
69
- end
70
-
71
- def run(params = [])
72
- return 1 unless apply_params!(params)
73
- # Force config file to be loaded. We don't use the configuration
74
- # directly, but the user may have SSL configuration options that they
75
- # need to talk to a private supermarket (e.g., trusted_certs or
76
- # ssl_verify_mode)
77
- chef_config
78
- installer.run
79
- 0
80
- rescue PolicyfileServiceError => e
81
- handle_error(e)
82
- 1
83
- end
84
-
85
- def installer
86
- @installer ||= PolicyfileServices::Install.new(policyfile: policyfile_relative_path, ui: ui, root_dir: Dir.pwd, config: chef_config)
87
- end
88
-
89
- def debug?
90
- !!config[:debug]
91
- end
92
-
93
- def config_path
94
- config[:config_file]
95
- end
96
-
97
- def handle_error(error)
98
- ui.err("Error: #{error.message}")
99
- if error.respond_to?(:reason)
100
- ui.err("Reason: #{error.reason}")
101
- ui.err("")
102
- ui.err(error.extended_error_info) if debug?
103
- ui.err(error.cause.backtrace.join("\n")) if debug?
104
- end
105
- end
106
-
107
- def apply_params!(params)
108
- remaining_args = parse_options(params)
109
- if remaining_args.size > 1
110
- ui.err(opt_parser)
111
- return false
112
- else
113
- @policyfile_relative_path = remaining_args.first
114
- true
115
- end
116
- end
117
-
118
- end
119
- end
120
- 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 "chef-dk/command/base"
19
+ require "chef-dk/ui"
20
+ require "chef-dk/policyfile_services/install"
21
+ require "chef-dk/configurable"
22
+
23
+ module ChefDK
24
+ module Command
25
+
26
+ class Install < Base
27
+
28
+ include Configurable
29
+
30
+ banner(<<~E)
31
+ Usage: chef install [ POLICY_FILE ] [options]
32
+
33
+ `chef install` evaluates a `Policyfile.rb` to find a compatible set of
34
+ cookbooks for the policy's run_list and caches them locally. It emits a
35
+ Policyfile.lock.json describing the locked cookbook set. You can use the
36
+ lockfile to install the locked cookbooks on another machine. You can also push
37
+ the lockfile to a "policy group" on a Chef Server and apply that exact set of
38
+ cookbooks to nodes in your infrastructure.
39
+
40
+ See our detailed README for more information:
41
+
42
+ https://docs.chef.io/policyfile.html
43
+
44
+ Options:
45
+
46
+ E
47
+
48
+ option :config_file,
49
+ short: "-c CONFIG_FILE",
50
+ long: "--config CONFIG_FILE",
51
+ description: "Path to configuration file"
52
+
53
+ option :debug,
54
+ short: "-D",
55
+ long: "--debug",
56
+ description: "Enable stacktraces and other debug output",
57
+ default: false
58
+
59
+ attr_reader :policyfile_relative_path
60
+
61
+ attr_accessor :ui
62
+
63
+ def initialize(*args)
64
+ super
65
+ @ui = UI.new
66
+
67
+ @policyfile_relative_path = nil
68
+ @installer = nil
69
+ end
70
+
71
+ def run(params = [])
72
+ return 1 unless apply_params!(params)
73
+ # Force config file to be loaded. We don't use the configuration
74
+ # directly, but the user may have SSL configuration options that they
75
+ # need to talk to a private supermarket (e.g., trusted_certs or
76
+ # ssl_verify_mode)
77
+ chef_config
78
+ installer.run
79
+ 0
80
+ rescue PolicyfileServiceError => e
81
+ handle_error(e)
82
+ 1
83
+ end
84
+
85
+ def installer
86
+ @installer ||= PolicyfileServices::Install.new(policyfile: policyfile_relative_path, ui: ui, root_dir: Dir.pwd, config: chef_config)
87
+ end
88
+
89
+ def debug?
90
+ !!config[:debug]
91
+ end
92
+
93
+ def config_path
94
+ config[:config_file]
95
+ end
96
+
97
+ def handle_error(error)
98
+ ui.err("Error: #{error.message}")
99
+ if error.respond_to?(:reason)
100
+ ui.err("Reason: #{error.reason}")
101
+ ui.err("")
102
+ ui.err(error.extended_error_info) if debug?
103
+ ui.err(error.cause.backtrace.join("\n")) if debug?
104
+ end
105
+ end
106
+
107
+ def apply_params!(params)
108
+ remaining_args = parse_options(params)
109
+ if remaining_args.size > 1
110
+ ui.err(opt_parser)
111
+ return false
112
+ else
113
+ @policyfile_relative_path = remaining_args.first
114
+ true
115
+ end
116
+ end
117
+
118
+ end
119
+ end
120
+ end
@@ -1,439 +1,439 @@
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 "ostruct"
19
-
20
- require "chef-dk/command/base"
21
- require "chef-dk/configurable"
22
- require "chef-dk/chef_runner"
23
- require "chef-dk/policyfile_services/push"
24
-
25
- require "chef/provisioning"
26
-
27
- module ChefDK
28
-
29
- module ProvisioningData
30
-
31
- def self.reset
32
- @context = nil
33
- end
34
-
35
- def self.context
36
- @context ||= Context.new
37
- end
38
-
39
- class Context
40
-
41
- attr_accessor :action
42
-
43
- attr_accessor :node_name
44
-
45
- attr_accessor :target
46
-
47
- attr_accessor :enable_policyfile
48
-
49
- attr_accessor :policy_group
50
-
51
- attr_accessor :policy_name
52
-
53
- attr_accessor :extra_chef_config
54
-
55
- attr_accessor :opts
56
-
57
- def initialize
58
- @extra_chef_config = ""
59
- @opts = nil
60
- end
61
-
62
- def set_user_opts(hash)
63
- @opts = OpenStruct.new(hash)
64
- end
65
-
66
- def convergence_options
67
- {
68
- chef_server: Chef::Config.chef_server_url,
69
- chef_config: chef_config,
70
- }
71
- end
72
-
73
- def chef_config
74
- config = <<~CONFIG
75
- # SSL Settings:
76
- ssl_verify_mode #{Chef::Config.ssl_verify_mode.inspect}
77
-
78
- CONFIG
79
- if enable_policyfile
80
- policyfile_config = <<~CONFIG
81
- # Policyfile Settings:
82
- use_policyfile true
83
- policy_document_native_api true
84
-
85
- policy_group "#{policy_group}"
86
- policy_name "#{policy_name}"
87
-
88
- CONFIG
89
- config << policyfile_config
90
- end
91
-
92
- config << extra_chef_config.to_s
93
- config
94
- end
95
-
96
- end
97
- end
98
-
99
- module Command
100
-
101
- class Provision < Base
102
-
103
- banner(<<~E)
104
- DEPRECATED: This command is deprecated and will be removed in ChefDK 4.
105
-
106
- Usage: chef provision POLICY_GROUP --policy-name POLICY_NAME [options]
107
- chef provision POLICY_GROUP --sync [POLICYFILE_PATH] [options]
108
- chef provision --no-policy [options]
109
-
110
- `chef provision` invokes an embedded chef-client run to provision machines
111
- using Chef Provisioning. If not otherwise specified, `chef provision` will
112
- expect to find a cookbook named 'provision' in the current working directory.
113
- It runs a recipe in this cookbook which should use Chef Provisioning to create
114
- one or more machines (or other infrastructure).
115
-
116
- `chef provision` provides three forms of operation:
117
-
118
- ### chef provision POLICY_GROUP --policy-name POLICY_NAME
119
-
120
- In the first form of the command, `chef provision` creates machines that will
121
- operate in policyfile mode. The chef configuration passed to the cookbook will
122
- set the policy group and policy name as given.
123
-
124
- ### chef provision POLICY_GROUP --sync [POLICYFILE_PATH] [options]
125
-
126
- In the second form of the command, `chef provision` create machines that will
127
- operate in policyfile mode and syncronizes a local policyfile to the server
128
- before converging the machine(s) defined in the provision cookbook.
129
-
130
- ### chef provision --no-policy [options]
131
-
132
- In the third form of the command, `chef provision` expects to create machines
133
- that will not operate in policyfile mode.
134
-
135
- Chef Provisioning is documented at https://docs.chef.io/provisioning.html
136
-
137
- Options:
138
-
139
- E
140
- include Configurable
141
-
142
- option :config_file,
143
- short: "-c CONFIG_FILE",
144
- long: "--config CONFIG_FILE",
145
- description: "Path to configuration file"
146
-
147
- option :policy_name,
148
- short: "-p POLICY_NAME",
149
- long: "--policy-name POLICY_NAME",
150
- description: "Set the default policy name for provisioned machines"
151
-
152
- option :sync,
153
- short: "-s [POLICYFILE_PATH]",
154
- long: "--sync [POLICYFILE_PATH]",
155
- description: "Push policyfile to the server before converging node(s)"
156
-
157
- option :enable_policyfile,
158
- long: "--[no-]policy",
159
- description: "Enable/disable policyfile integration (defaults to enabled, use --no-policy to disable)",
160
- default: true
161
-
162
- option :destroy,
163
- short: "-d",
164
- long: "--destroy",
165
- description: "Set default machine action to :destroy",
166
- default: false,
167
- boolean: true
168
-
169
- option :machine_recipe,
170
- short: "-r RECIPE",
171
- long: "--recipe RECIPE",
172
- description: "Machine recipe to use",
173
- default: "default"
174
-
175
- option :cookbook,
176
- long: "--cookbook COOKBOOK_PATH",
177
- description: "Path to your provisioning cookbook",
178
- default: "./provision"
179
-
180
- option :node_name,
181
- short: "-n NODE_NAME",
182
- long: "--node-name NODE_NAME",
183
- description: "Set default node name (may be overriden by provisioning cookbook)"
184
-
185
- option :target,
186
- short: "-t REMOTE_HOST",
187
- long: "--target REMOTE_HOST",
188
- description: "Set hostname or IP of the host to converge (may be overriden by provisioning cookbook)"
189
-
190
- OPT_SEPARATOR = /[=\s]+/
191
-
192
- def self.split_opt(key_value)
193
- key, _separator, value = key_value.partition(OPT_SEPARATOR)
194
- [key, value]
195
- end
196
-
197
- opts = {}
198
-
199
- option :opts,
200
- short: "-o OPT=VALUE",
201
- long: "--opt OPT=VALUE",
202
- description: "Set arbitrary option OPT on the provisioning context",
203
- proc: lambda { |arg| key, value = split_opt(arg); opts[key] = value; opts },
204
- default: {}
205
-
206
- option :debug,
207
- short: "-D",
208
- long: "--debug",
209
- description: "Enable stacktraces and other debug output",
210
- default: false
211
-
212
- attr_reader :params
213
- attr_reader :policyfile_relative_path
214
- attr_reader :policy_group
215
-
216
- attr_accessor :ui
217
-
218
- def initialize(*args)
219
- super
220
-
221
- @ui = UI.new
222
-
223
- @policyfile_relative_path = nil
224
- @policy_group = nil
225
-
226
- @provisioning_cookbook_path = nil
227
- @provisioning_cookbook_name = nil
228
- end
229
-
230
- def run(params = [])
231
- ui.msg("DEPRECATED: This command is deprecated and will be removed in ChefDK 4.")
232
- return 1 unless apply_params!(params)
233
- chef_config # force chef config to load
234
- return 1 unless check_cookbook_and_recipe_path
235
-
236
- push.run if sync_policy?
237
-
238
- setup_context
239
-
240
- chef_runner.converge
241
- 0
242
- rescue ChefRunnerError, PolicyfileServiceError => e
243
- handle_error(e)
244
- 1
245
- # Chef Provisioning doesn't fail gracefully when a driver is missing:
246
- # https://github.com/chef/chef-provisioning/issues/338
247
- rescue StandardError, LoadError => error
248
- ui.err("Error: #{error.message}")
249
- 1
250
- end
251
-
252
- # An instance of ChefRunner. Calling ChefRunner#converge will trigger
253
- # convergence and generate the desired code.
254
- def chef_runner
255
- @chef_runner ||= ChefRunner.new(provisioning_cookbook_path, ["recipe[#{provisioning_cookbook_name}::#{recipe}]"])
256
- end
257
-
258
- def push
259
- @push ||= PolicyfileServices::Push.new(policyfile: policyfile_relative_path,
260
- ui: ui,
261
- policy_group: policy_group,
262
- config: chef_config,
263
- root_dir: Dir.pwd)
264
- end
265
-
266
- def setup_context
267
- ProvisioningData.context.tap do |c|
268
-
269
- c.action = default_action
270
- c.node_name = node_name
271
- c.target = target
272
-
273
- c.set_user_opts(user_opts)
274
-
275
- c.enable_policyfile = enable_policyfile?
276
-
277
- if enable_policyfile?
278
- c.policy_group = policy_group
279
- c.policy_name = policy_name
280
- end
281
-
282
- end
283
- end
284
-
285
- def policy_name
286
- if sync_policy?
287
- push.policy_data["name"]
288
- else
289
- config[:policy_name]
290
- end
291
- end
292
-
293
- def default_action
294
- if config[:destroy]
295
- :destroy
296
- else
297
- :converge
298
- end
299
- end
300
-
301
- def node_name
302
- config[:node_name]
303
- end
304
-
305
- def target
306
- config[:target]
307
- end
308
-
309
- def user_opts
310
- config[:opts]
311
- end
312
-
313
- def recipe
314
- config[:machine_recipe]
315
- end
316
-
317
- # Gives the `cookbook_path` in the chef-client sense, which is the
318
- # directory that contains the provisioning cookbook.
319
- def provisioning_cookbook_path
320
- detect_provisioning_cookbook_name_and_path! unless @provisioning_cookbook_path
321
- @provisioning_cookbook_path
322
- end
323
-
324
- # The name of the provisioning cookbook
325
- def provisioning_cookbook_name
326
- detect_provisioning_cookbook_name_and_path! unless @provisioning_cookbook_name
327
- @provisioning_cookbook_name
328
- end
329
-
330
- def cookbook_path
331
- config[:cookbook]
332
- end
333
-
334
- def enable_policyfile?
335
- config[:enable_policyfile]
336
- end
337
-
338
- def apply_params!(params)
339
- remaining_args = parse_options(params)
340
- if enable_policyfile?
341
- handle_policy_argv(remaining_args)
342
- else
343
- handle_no_policy_argv(remaining_args)
344
- end
345
- end
346
-
347
- def debug?
348
- !!config[:debug]
349
- end
350
-
351
- def sync_policy?
352
- config.key?(:sync)
353
- end
354
-
355
- private
356
-
357
- def detect_provisioning_cookbook_name_and_path!
358
- given_path = File.expand_path(cookbook_path, Dir.pwd)
359
- @provisioning_cookbook_name = File.basename(given_path)
360
- @provisioning_cookbook_path = File.dirname(given_path)
361
- end
362
-
363
- def check_cookbook_and_recipe_path
364
- if !File.exist?(cookbook_expanded_path)
365
- ui.err("ERROR: Provisioning cookbook not found at path #{cookbook_expanded_path}")
366
- false
367
- elsif !File.exist?(provisioning_recipe_path)
368
- ui.err("ERROR: Provisioning recipe not found at path #{provisioning_recipe_path}")
369
- false
370
- else
371
- true
372
- end
373
- end
374
-
375
- def provisioning_recipe_path
376
- File.join(cookbook_expanded_path, "recipes", "#{recipe}.rb")
377
- end
378
-
379
- def cookbook_expanded_path
380
- File.join(chef_runner.cookbook_path, provisioning_cookbook_name)
381
- end
382
-
383
- def handle_no_policy_argv(remaining_args)
384
- if remaining_args.empty?
385
- true
386
- else
387
- ui.err("The --no-policy flag cannot be combined with policyfile arguments")
388
- ui.err("")
389
- ui.err(opt_parser)
390
- false
391
- end
392
- end
393
-
394
- def handle_policy_argv(remaining_args)
395
- if remaining_args.size > 1
396
- ui.err("Too many arguments")
397
- ui.err("")
398
- ui.err(opt_parser)
399
- false
400
- elsif remaining_args.size < 1
401
- ui.err("You must specify a POLICY_GROUP or disable policyfiles with --no-policy")
402
- ui.err("")
403
- ui.err(opt_parser)
404
- false
405
- elsif !sync_policy? && config[:policy_name].nil?
406
- ui.err("You must pass either --sync or --policy-name to provision machines in policyfile mode")
407
- ui.err("")
408
- ui.err(opt_parser)
409
- false
410
- elsif sync_policy? && config[:policy_name]
411
- ui.err("The --policy-name and --sync arguments cannot be combined")
412
- ui.err("")
413
- ui.err(opt_parser)
414
- false
415
- elsif sync_policy?
416
- @policy_group = remaining_args[0]
417
- @policyfile_relative_path = config[:sync]
418
- true
419
- elsif config[:policy_name]
420
- @policy_group = remaining_args[0]
421
- true
422
- else
423
- raise BUG, "Cannot properly parse input argv '#{ARGV.inspect}'"
424
- end
425
- end
426
-
427
- def handle_error(error)
428
- ui.err("Error: #{error.message}")
429
- if error.respond_to?(:reason)
430
- ui.err("Reason: #{error.reason}")
431
- ui.err("")
432
- ui.err(error.extended_error_info) if debug?
433
- ui.err(error.cause.backtrace.join("\n")) if debug?
434
- end
435
- end
436
-
437
- end
438
- end
439
- 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 "ostruct"
19
+
20
+ require "chef-dk/command/base"
21
+ require "chef-dk/configurable"
22
+ require "chef-dk/chef_runner"
23
+ require "chef-dk/policyfile_services/push"
24
+
25
+ require "chef/provisioning"
26
+
27
+ module ChefDK
28
+
29
+ module ProvisioningData
30
+
31
+ def self.reset
32
+ @context = nil
33
+ end
34
+
35
+ def self.context
36
+ @context ||= Context.new
37
+ end
38
+
39
+ class Context
40
+
41
+ attr_accessor :action
42
+
43
+ attr_accessor :node_name
44
+
45
+ attr_accessor :target
46
+
47
+ attr_accessor :enable_policyfile
48
+
49
+ attr_accessor :policy_group
50
+
51
+ attr_accessor :policy_name
52
+
53
+ attr_accessor :extra_chef_config
54
+
55
+ attr_accessor :opts
56
+
57
+ def initialize
58
+ @extra_chef_config = ""
59
+ @opts = nil
60
+ end
61
+
62
+ def set_user_opts(hash)
63
+ @opts = OpenStruct.new(hash)
64
+ end
65
+
66
+ def convergence_options
67
+ {
68
+ chef_server: Chef::Config.chef_server_url,
69
+ chef_config: chef_config,
70
+ }
71
+ end
72
+
73
+ def chef_config
74
+ config = <<~CONFIG
75
+ # SSL Settings:
76
+ ssl_verify_mode #{Chef::Config.ssl_verify_mode.inspect}
77
+
78
+ CONFIG
79
+ if enable_policyfile
80
+ policyfile_config = <<~CONFIG
81
+ # Policyfile Settings:
82
+ use_policyfile true
83
+ policy_document_native_api true
84
+
85
+ policy_group "#{policy_group}"
86
+ policy_name "#{policy_name}"
87
+
88
+ CONFIG
89
+ config << policyfile_config
90
+ end
91
+
92
+ config << extra_chef_config.to_s
93
+ config
94
+ end
95
+
96
+ end
97
+ end
98
+
99
+ module Command
100
+
101
+ class Provision < Base
102
+
103
+ banner(<<~E)
104
+ DEPRECATED: This command is deprecated and will be removed in ChefDK 4.
105
+
106
+ Usage: chef provision POLICY_GROUP --policy-name POLICY_NAME [options]
107
+ chef provision POLICY_GROUP --sync [POLICYFILE_PATH] [options]
108
+ chef provision --no-policy [options]
109
+
110
+ `chef provision` invokes an embedded chef-client run to provision machines
111
+ using Chef Provisioning. If not otherwise specified, `chef provision` will
112
+ expect to find a cookbook named 'provision' in the current working directory.
113
+ It runs a recipe in this cookbook which should use Chef Provisioning to create
114
+ one or more machines (or other infrastructure).
115
+
116
+ `chef provision` provides three forms of operation:
117
+
118
+ ### chef provision POLICY_GROUP --policy-name POLICY_NAME
119
+
120
+ In the first form of the command, `chef provision` creates machines that will
121
+ operate in policyfile mode. The chef configuration passed to the cookbook will
122
+ set the policy group and policy name as given.
123
+
124
+ ### chef provision POLICY_GROUP --sync [POLICYFILE_PATH] [options]
125
+
126
+ In the second form of the command, `chef provision` create machines that will
127
+ operate in policyfile mode and syncronizes a local policyfile to the server
128
+ before converging the machine(s) defined in the provision cookbook.
129
+
130
+ ### chef provision --no-policy [options]
131
+
132
+ In the third form of the command, `chef provision` expects to create machines
133
+ that will not operate in policyfile mode.
134
+
135
+ Chef Provisioning is documented at https://docs.chef.io/provisioning.html
136
+
137
+ Options:
138
+
139
+ E
140
+ include Configurable
141
+
142
+ option :config_file,
143
+ short: "-c CONFIG_FILE",
144
+ long: "--config CONFIG_FILE",
145
+ description: "Path to configuration file"
146
+
147
+ option :policy_name,
148
+ short: "-p POLICY_NAME",
149
+ long: "--policy-name POLICY_NAME",
150
+ description: "Set the default policy name for provisioned machines"
151
+
152
+ option :sync,
153
+ short: "-s [POLICYFILE_PATH]",
154
+ long: "--sync [POLICYFILE_PATH]",
155
+ description: "Push policyfile to the server before converging node(s)"
156
+
157
+ option :enable_policyfile,
158
+ long: "--[no-]policy",
159
+ description: "Enable/disable policyfile integration (defaults to enabled, use --no-policy to disable)",
160
+ default: true
161
+
162
+ option :destroy,
163
+ short: "-d",
164
+ long: "--destroy",
165
+ description: "Set default machine action to :destroy",
166
+ default: false,
167
+ boolean: true
168
+
169
+ option :machine_recipe,
170
+ short: "-r RECIPE",
171
+ long: "--recipe RECIPE",
172
+ description: "Machine recipe to use",
173
+ default: "default"
174
+
175
+ option :cookbook,
176
+ long: "--cookbook COOKBOOK_PATH",
177
+ description: "Path to your provisioning cookbook",
178
+ default: "./provision"
179
+
180
+ option :node_name,
181
+ short: "-n NODE_NAME",
182
+ long: "--node-name NODE_NAME",
183
+ description: "Set default node name (may be overriden by provisioning cookbook)"
184
+
185
+ option :target,
186
+ short: "-t REMOTE_HOST",
187
+ long: "--target REMOTE_HOST",
188
+ description: "Set hostname or IP of the host to converge (may be overriden by provisioning cookbook)"
189
+
190
+ OPT_SEPARATOR = /[=\s]+/
191
+
192
+ def self.split_opt(key_value)
193
+ key, _separator, value = key_value.partition(OPT_SEPARATOR)
194
+ [key, value]
195
+ end
196
+
197
+ opts = {}
198
+
199
+ option :opts,
200
+ short: "-o OPT=VALUE",
201
+ long: "--opt OPT=VALUE",
202
+ description: "Set arbitrary option OPT on the provisioning context",
203
+ proc: lambda { |arg| key, value = split_opt(arg); opts[key] = value; opts },
204
+ default: {}
205
+
206
+ option :debug,
207
+ short: "-D",
208
+ long: "--debug",
209
+ description: "Enable stacktraces and other debug output",
210
+ default: false
211
+
212
+ attr_reader :params
213
+ attr_reader :policyfile_relative_path
214
+ attr_reader :policy_group
215
+
216
+ attr_accessor :ui
217
+
218
+ def initialize(*args)
219
+ super
220
+
221
+ @ui = UI.new
222
+
223
+ @policyfile_relative_path = nil
224
+ @policy_group = nil
225
+
226
+ @provisioning_cookbook_path = nil
227
+ @provisioning_cookbook_name = nil
228
+ end
229
+
230
+ def run(params = [])
231
+ ui.msg("DEPRECATED: This command is deprecated and will be removed in ChefDK 4.")
232
+ return 1 unless apply_params!(params)
233
+ chef_config # force chef config to load
234
+ return 1 unless check_cookbook_and_recipe_path
235
+
236
+ push.run if sync_policy?
237
+
238
+ setup_context
239
+
240
+ chef_runner.converge
241
+ 0
242
+ rescue ChefRunnerError, PolicyfileServiceError => e
243
+ handle_error(e)
244
+ 1
245
+ # Chef Provisioning doesn't fail gracefully when a driver is missing:
246
+ # https://github.com/chef/chef-provisioning/issues/338
247
+ rescue StandardError, LoadError => error
248
+ ui.err("Error: #{error.message}")
249
+ 1
250
+ end
251
+
252
+ # An instance of ChefRunner. Calling ChefRunner#converge will trigger
253
+ # convergence and generate the desired code.
254
+ def chef_runner
255
+ @chef_runner ||= ChefRunner.new(provisioning_cookbook_path, ["recipe[#{provisioning_cookbook_name}::#{recipe}]"])
256
+ end
257
+
258
+ def push
259
+ @push ||= PolicyfileServices::Push.new(policyfile: policyfile_relative_path,
260
+ ui: ui,
261
+ policy_group: policy_group,
262
+ config: chef_config,
263
+ root_dir: Dir.pwd)
264
+ end
265
+
266
+ def setup_context
267
+ ProvisioningData.context.tap do |c|
268
+
269
+ c.action = default_action
270
+ c.node_name = node_name
271
+ c.target = target
272
+
273
+ c.set_user_opts(user_opts)
274
+
275
+ c.enable_policyfile = enable_policyfile?
276
+
277
+ if enable_policyfile?
278
+ c.policy_group = policy_group
279
+ c.policy_name = policy_name
280
+ end
281
+
282
+ end
283
+ end
284
+
285
+ def policy_name
286
+ if sync_policy?
287
+ push.policy_data["name"]
288
+ else
289
+ config[:policy_name]
290
+ end
291
+ end
292
+
293
+ def default_action
294
+ if config[:destroy]
295
+ :destroy
296
+ else
297
+ :converge
298
+ end
299
+ end
300
+
301
+ def node_name
302
+ config[:node_name]
303
+ end
304
+
305
+ def target
306
+ config[:target]
307
+ end
308
+
309
+ def user_opts
310
+ config[:opts]
311
+ end
312
+
313
+ def recipe
314
+ config[:machine_recipe]
315
+ end
316
+
317
+ # Gives the `cookbook_path` in the chef-client sense, which is the
318
+ # directory that contains the provisioning cookbook.
319
+ def provisioning_cookbook_path
320
+ detect_provisioning_cookbook_name_and_path! unless @provisioning_cookbook_path
321
+ @provisioning_cookbook_path
322
+ end
323
+
324
+ # The name of the provisioning cookbook
325
+ def provisioning_cookbook_name
326
+ detect_provisioning_cookbook_name_and_path! unless @provisioning_cookbook_name
327
+ @provisioning_cookbook_name
328
+ end
329
+
330
+ def cookbook_path
331
+ config[:cookbook]
332
+ end
333
+
334
+ def enable_policyfile?
335
+ config[:enable_policyfile]
336
+ end
337
+
338
+ def apply_params!(params)
339
+ remaining_args = parse_options(params)
340
+ if enable_policyfile?
341
+ handle_policy_argv(remaining_args)
342
+ else
343
+ handle_no_policy_argv(remaining_args)
344
+ end
345
+ end
346
+
347
+ def debug?
348
+ !!config[:debug]
349
+ end
350
+
351
+ def sync_policy?
352
+ config.key?(:sync)
353
+ end
354
+
355
+ private
356
+
357
+ def detect_provisioning_cookbook_name_and_path!
358
+ given_path = File.expand_path(cookbook_path, Dir.pwd)
359
+ @provisioning_cookbook_name = File.basename(given_path)
360
+ @provisioning_cookbook_path = File.dirname(given_path)
361
+ end
362
+
363
+ def check_cookbook_and_recipe_path
364
+ if !File.exist?(cookbook_expanded_path)
365
+ ui.err("ERROR: Provisioning cookbook not found at path #{cookbook_expanded_path}")
366
+ false
367
+ elsif !File.exist?(provisioning_recipe_path)
368
+ ui.err("ERROR: Provisioning recipe not found at path #{provisioning_recipe_path}")
369
+ false
370
+ else
371
+ true
372
+ end
373
+ end
374
+
375
+ def provisioning_recipe_path
376
+ File.join(cookbook_expanded_path, "recipes", "#{recipe}.rb")
377
+ end
378
+
379
+ def cookbook_expanded_path
380
+ File.join(chef_runner.cookbook_path, provisioning_cookbook_name)
381
+ end
382
+
383
+ def handle_no_policy_argv(remaining_args)
384
+ if remaining_args.empty?
385
+ true
386
+ else
387
+ ui.err("The --no-policy flag cannot be combined with policyfile arguments")
388
+ ui.err("")
389
+ ui.err(opt_parser)
390
+ false
391
+ end
392
+ end
393
+
394
+ def handle_policy_argv(remaining_args)
395
+ if remaining_args.size > 1
396
+ ui.err("Too many arguments")
397
+ ui.err("")
398
+ ui.err(opt_parser)
399
+ false
400
+ elsif remaining_args.size < 1
401
+ ui.err("You must specify a POLICY_GROUP or disable policyfiles with --no-policy")
402
+ ui.err("")
403
+ ui.err(opt_parser)
404
+ false
405
+ elsif !sync_policy? && config[:policy_name].nil?
406
+ ui.err("You must pass either --sync or --policy-name to provision machines in policyfile mode")
407
+ ui.err("")
408
+ ui.err(opt_parser)
409
+ false
410
+ elsif sync_policy? && config[:policy_name]
411
+ ui.err("The --policy-name and --sync arguments cannot be combined")
412
+ ui.err("")
413
+ ui.err(opt_parser)
414
+ false
415
+ elsif sync_policy?
416
+ @policy_group = remaining_args[0]
417
+ @policyfile_relative_path = config[:sync]
418
+ true
419
+ elsif config[:policy_name]
420
+ @policy_group = remaining_args[0]
421
+ true
422
+ else
423
+ raise BUG, "Cannot properly parse input argv '#{ARGV.inspect}'"
424
+ end
425
+ end
426
+
427
+ def handle_error(error)
428
+ ui.err("Error: #{error.message}")
429
+ if error.respond_to?(:reason)
430
+ ui.err("Reason: #{error.reason}")
431
+ ui.err("")
432
+ ui.err(error.extended_error_info) if debug?
433
+ ui.err(error.cause.backtrace.join("\n")) if debug?
434
+ end
435
+ end
436
+
437
+ end
438
+ end
439
+ end