chef-dk 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +190 -190
  3. data/Gemfile +26 -26
  4. data/LICENSE +201 -201
  5. data/README.md +292 -276
  6. data/Rakefile +18 -18
  7. data/bin/chef +25 -25
  8. data/chef-dk.gemspec +62 -0
  9. data/lib/chef-dk.rb +19 -19
  10. data/lib/chef-dk/authenticated_http.rb +40 -40
  11. data/lib/chef-dk/builtin_commands.rb +60 -60
  12. data/lib/chef-dk/chef_runner.rb +98 -98
  13. data/lib/chef-dk/cli.rb +200 -200
  14. data/lib/chef-dk/command/base.rb +79 -79
  15. data/lib/chef-dk/command/clean_policy_cookbooks.rb +116 -116
  16. data/lib/chef-dk/command/clean_policy_revisions.rb +113 -113
  17. data/lib/chef-dk/command/delete_policy.rb +122 -122
  18. data/lib/chef-dk/command/delete_policy_group.rb +122 -122
  19. data/lib/chef-dk/command/diff.rb +316 -316
  20. data/lib/chef-dk/command/env.rb +90 -90
  21. data/lib/chef-dk/command/exec.rb +45 -45
  22. data/lib/chef-dk/command/export.rb +151 -151
  23. data/lib/chef-dk/command/gem.rb +47 -47
  24. data/lib/chef-dk/command/generate.rb +120 -120
  25. data/lib/chef-dk/command/generator_commands.rb +80 -80
  26. data/lib/chef-dk/command/generator_commands/app.rb +107 -107
  27. data/lib/chef-dk/command/generator_commands/attribute.rb +37 -37
  28. data/lib/chef-dk/command/generator_commands/base.rb +121 -121
  29. data/lib/chef-dk/command/generator_commands/cookbook.rb +153 -119
  30. data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +100 -100
  31. data/lib/chef-dk/command/generator_commands/cookbook_file.rb +45 -45
  32. data/lib/chef-dk/command/generator_commands/generator_generator.rb +177 -177
  33. data/lib/chef-dk/command/generator_commands/lwrp.rb +36 -36
  34. data/lib/chef-dk/command/generator_commands/policyfile.rb +127 -86
  35. data/lib/chef-dk/command/generator_commands/recipe.rb +36 -36
  36. data/lib/chef-dk/command/generator_commands/repo.rb +125 -96
  37. data/lib/chef-dk/command/generator_commands/template.rb +46 -46
  38. data/lib/chef-dk/command/install.rb +121 -121
  39. data/lib/chef-dk/command/provision.rb +438 -438
  40. data/lib/chef-dk/command/push.rb +118 -118
  41. data/lib/chef-dk/command/push_archive.rb +126 -126
  42. data/lib/chef-dk/command/shell_init.rb +180 -180
  43. data/lib/chef-dk/command/show_policy.rb +165 -165
  44. data/lib/chef-dk/command/undelete.rb +155 -155
  45. data/lib/chef-dk/command/update.rb +129 -129
  46. data/lib/chef-dk/command/verify.rb +534 -490
  47. data/lib/chef-dk/commands_map.rb +115 -115
  48. data/lib/chef-dk/completions/bash.sh.erb +5 -5
  49. data/lib/chef-dk/completions/chef.fish.erb +10 -10
  50. data/lib/chef-dk/completions/zsh.zsh.erb +21 -21
  51. data/lib/chef-dk/component_test.rb +173 -171
  52. data/lib/chef-dk/configurable.rb +57 -57
  53. data/lib/chef-dk/cookbook_metadata.rb +45 -45
  54. data/lib/chef-dk/cookbook_omnifetch.rb +32 -32
  55. data/lib/chef-dk/cookbook_profiler/git.rb +151 -151
  56. data/lib/chef-dk/cookbook_profiler/identifiers.rb +72 -72
  57. data/lib/chef-dk/cookbook_profiler/null_scm.rb +32 -32
  58. data/lib/chef-dk/exceptions.rb +126 -113
  59. data/lib/chef-dk/generator.rb +163 -163
  60. data/lib/chef-dk/helpers.rb +159 -159
  61. data/lib/chef-dk/pager.rb +106 -106
  62. data/lib/chef-dk/policyfile/chef_repo_cookbook_source.rb +138 -122
  63. data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +54 -54
  64. data/lib/chef-dk/policyfile/community_cookbook_source.rb +97 -82
  65. data/lib/chef-dk/policyfile/comparison_base.rb +124 -124
  66. data/lib/chef-dk/policyfile/cookbook_location_specification.rb +141 -133
  67. data/lib/chef-dk/policyfile/cookbook_locks.rb +466 -466
  68. data/lib/chef-dk/policyfile/cookbook_sources.rb +22 -21
  69. data/lib/chef-dk/policyfile/delivery_supermarket_source.rb +90 -0
  70. data/lib/chef-dk/policyfile/differ.rb +266 -266
  71. data/lib/chef-dk/policyfile/dsl.rb +223 -197
  72. data/lib/chef-dk/policyfile/lister.rb +232 -232
  73. data/lib/chef-dk/policyfile/null_cookbook_source.rb +45 -45
  74. data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -124
  75. data/lib/chef-dk/policyfile/reports/install.rb +70 -70
  76. data/lib/chef-dk/policyfile/reports/table_printer.rb +58 -58
  77. data/lib/chef-dk/policyfile/reports/upload.rb +70 -70
  78. data/lib/chef-dk/policyfile/solution_dependencies.rb +298 -298
  79. data/lib/chef-dk/policyfile/storage_config.rb +100 -100
  80. data/lib/chef-dk/policyfile/undo_record.rb +142 -142
  81. data/lib/chef-dk/policyfile/undo_stack.rb +130 -130
  82. data/lib/chef-dk/policyfile/uploader.rb +213 -213
  83. data/lib/chef-dk/policyfile_compiler.rb +380 -322
  84. data/lib/chef-dk/policyfile_lock.rb +552 -552
  85. data/lib/chef-dk/policyfile_services/clean_policies.rb +95 -95
  86. data/lib/chef-dk/policyfile_services/clean_policy_cookbooks.rb +125 -125
  87. data/lib/chef-dk/policyfile_services/export_repo.rb +309 -309
  88. data/lib/chef-dk/policyfile_services/install.rb +125 -125
  89. data/lib/chef-dk/policyfile_services/push.rb +114 -114
  90. data/lib/chef-dk/policyfile_services/push_archive.rb +173 -173
  91. data/lib/chef-dk/policyfile_services/rm_policy.rb +142 -142
  92. data/lib/chef-dk/policyfile_services/rm_policy_group.rb +86 -86
  93. data/lib/chef-dk/policyfile_services/show_policy.rb +237 -237
  94. data/lib/chef-dk/policyfile_services/undelete.rb +108 -108
  95. data/lib/chef-dk/policyfile_services/update_attributes.rb +104 -104
  96. data/lib/chef-dk/service_exception_inspectors.rb +25 -25
  97. data/lib/chef-dk/service_exception_inspectors/base.rb +40 -40
  98. data/lib/chef-dk/service_exception_inspectors/http.rb +121 -121
  99. data/lib/chef-dk/service_exceptions.rb +143 -143
  100. data/lib/chef-dk/shell_out.rb +36 -36
  101. data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +3 -3
  102. data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +100 -100
  103. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -9
  104. data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README.md +54 -54
  105. data/lib/chef-dk/skeletons/code_generator/files/default/gitignore +16 -16
  106. data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +28 -28
  107. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -27
  108. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -7
  109. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +3 -3
  110. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -8
  111. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +58 -58
  112. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +3 -3
  113. data/lib/chef-dk/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -0
  114. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +9 -9
  115. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/example.json +12 -12
  116. data/lib/chef-dk/skeletons/code_generator/files/default/repo/policies/README.md +24 -0
  117. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +9 -9
  118. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/example.json +12 -12
  119. data/lib/chef-dk/skeletons/code_generator/files/default/serverspec_spec_helper.rb +8 -8
  120. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +2 -2
  121. data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper_policyfile.rb +2 -0
  122. data/lib/chef-dk/skeletons/code_generator/metadata.rb +8 -8
  123. data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +97 -97
  124. data/lib/chef-dk/skeletons/code_generator/recipes/attribute.rb +12 -12
  125. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +117 -104
  126. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook_file.rb +24 -24
  127. data/lib/chef-dk/skeletons/code_generator/recipes/lwrp.rb +23 -23
  128. data/lib/chef-dk/skeletons/code_generator/recipes/policyfile.rb +8 -8
  129. data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +27 -27
  130. data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +67 -48
  131. data/lib/chef-dk/skeletons/code_generator/recipes/template.rb +32 -32
  132. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -3
  133. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.apache2.erb +201 -201
  134. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -339
  135. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -674
  136. data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -21
  137. data/lib/chef-dk/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -20
  138. data/lib/chef-dk/skeletons/code_generator/templates/default/README.md.erb +4 -4
  139. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen.yml.erb +21 -16
  140. data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +32 -27
  141. data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +7 -7
  142. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +5 -5
  143. data/lib/chef-dk/skeletons/code_generator/templates/default/recipe_spec.rb.erb +20 -20
  144. data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +11 -11
  145. data/lib/chef-dk/skeletons/code_generator/templates/default/serverspec_default_spec.rb.erb +9 -9
  146. data/lib/chef-dk/ui.rb +58 -58
  147. data/lib/chef-dk/version.rb +20 -20
  148. data/lib/kitchen/provisioner/policyfile_zero.rb +189 -193
  149. data/spec/shared/a_file_generator.rb +125 -125
  150. data/spec/shared/a_generated_file.rb +12 -12
  151. data/spec/shared/command_with_ui_object.rb +11 -11
  152. data/spec/shared/custom_generator_cookbook.rb +117 -117
  153. data/spec/shared/fixture_cookbook_checksums.rb +47 -47
  154. data/spec/shared/setup_git_cookbooks.rb +53 -53
  155. data/spec/spec_helper.rb +50 -49
  156. data/spec/test_helpers.rb +84 -84
  157. data/spec/unit/chef_runner_spec.rb +111 -111
  158. data/spec/unit/cli_spec.rb +357 -357
  159. data/spec/unit/command/base_spec.rb +169 -169
  160. data/spec/unit/command/clean_policy_cookbooks_spec.rb +181 -181
  161. data/spec/unit/command/clean_policy_revisions_spec.rb +181 -181
  162. data/spec/unit/command/delete_policy_group_spec.rb +207 -207
  163. data/spec/unit/command/delete_policy_spec.rb +207 -207
  164. data/spec/unit/command/diff_spec.rb +312 -312
  165. data/spec/unit/command/env_spec.rb +52 -52
  166. data/spec/unit/command/exec_spec.rb +179 -179
  167. data/spec/unit/command/export_spec.rb +189 -189
  168. data/spec/unit/command/generate_spec.rb +142 -142
  169. data/spec/unit/command/generator_commands/app_spec.rb +169 -169
  170. data/spec/unit/command/generator_commands/attribute_spec.rb +32 -32
  171. data/spec/unit/command/generator_commands/cookbook_file_spec.rb +32 -32
  172. data/spec/unit/command/generator_commands/cookbook_spec.rb +450 -320
  173. data/spec/unit/command/generator_commands/generator_generator_spec.rb +229 -229
  174. data/spec/unit/command/generator_commands/lwrp_spec.rb +32 -32
  175. data/spec/unit/command/generator_commands/policyfile_spec.rb +225 -125
  176. data/spec/unit/command/generator_commands/recipe_spec.rb +34 -34
  177. data/spec/unit/command/generator_commands/repo_spec.rb +367 -283
  178. data/spec/unit/command/generator_commands/template_spec.rb +32 -32
  179. data/spec/unit/command/install_spec.rb +179 -179
  180. data/spec/unit/command/provision_spec.rb +592 -592
  181. data/spec/unit/command/push_archive_spec.rb +153 -153
  182. data/spec/unit/command/push_spec.rb +199 -199
  183. data/spec/unit/command/shell_init_spec.rb +329 -329
  184. data/spec/unit/command/show_policy_spec.rb +235 -235
  185. data/spec/unit/command/undelete_spec.rb +246 -246
  186. data/spec/unit/command/update_spec.rb +251 -251
  187. data/spec/unit/command/verify_spec.rb +325 -323
  188. data/spec/unit/commands_map_spec.rb +57 -57
  189. data/spec/unit/component_test_spec.rb +126 -126
  190. data/spec/unit/cookbook_metadata_spec.rb +98 -98
  191. data/spec/unit/cookbook_profiler/git_spec.rb +176 -176
  192. data/spec/unit/cookbook_profiler/identifiers_spec.rb +83 -83
  193. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -9
  194. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -9
  195. data/spec/unit/fixtures/command/cli_test_command.rb +26 -26
  196. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -7
  197. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  198. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -3
  199. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  200. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -96
  201. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  202. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  203. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -16
  204. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -3
  205. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -4
  206. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -96
  207. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -8
  208. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -8
  209. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/.kitchen.yml +16 -16
  210. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -3
  211. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -4
  212. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -96
  213. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -8
  214. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -8
  215. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1321 -1321
  216. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -2987
  217. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -1
  218. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +36 -36
  219. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -16
  220. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -2
  221. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -5
  222. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -3
  223. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -2
  224. data/spec/unit/fixtures/example_cookbook/.gitignore +17 -17
  225. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -16
  226. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -3
  227. data/spec/unit/fixtures/example_cookbook/README.md +4 -4
  228. data/spec/unit/fixtures/example_cookbook/chefignore +96 -96
  229. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -8
  230. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -8
  231. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -17
  232. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -16
  233. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -3
  234. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -4
  235. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -96
  236. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -5
  237. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -8
  238. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -17
  239. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -16
  240. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -3
  241. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -4
  242. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -96
  243. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -8
  244. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -4
  245. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -96
  246. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -8
  247. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -8
  248. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -3
  249. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -4
  250. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -96
  251. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -9
  252. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -8
  253. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -16
  254. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -3
  255. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -4
  256. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -96
  257. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -8
  258. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -8
  259. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -2
  260. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
  261. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
  262. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
  263. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
  264. data/spec/unit/generator_spec.rb +120 -120
  265. data/spec/unit/helpers_spec.rb +92 -92
  266. data/spec/unit/pager_spec.rb +119 -119
  267. data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -66
  268. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +34 -34
  269. data/spec/unit/policyfile/community_cookbook_source_spec.rb +84 -51
  270. data/spec/unit/policyfile/comparison_base_spec.rb +343 -343
  271. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +257 -252
  272. data/spec/unit/policyfile/cookbook_locks_spec.rb +529 -529
  273. data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +130 -0
  274. data/spec/unit/policyfile/differ_spec.rb +687 -687
  275. data/spec/unit/policyfile/lister_spec.rb +272 -272
  276. data/spec/unit/policyfile/null_cookbook_source_spec.rb +35 -35
  277. data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -92
  278. data/spec/unit/policyfile/reports/install_spec.rb +115 -115
  279. data/spec/unit/policyfile/reports/upload_spec.rb +96 -96
  280. data/spec/unit/policyfile/solution_dependencies_spec.rb +145 -145
  281. data/spec/unit/policyfile/storage_config_spec.rb +172 -172
  282. data/spec/unit/policyfile/undo_record_spec.rb +260 -260
  283. data/spec/unit/policyfile/undo_stack_spec.rb +266 -266
  284. data/spec/unit/policyfile/uploader_spec.rb +410 -410
  285. data/spec/unit/policyfile_demands_spec.rb +997 -876
  286. data/spec/unit/policyfile_evaluation_spec.rb +557 -441
  287. data/spec/unit/policyfile_lock_build_spec.rb +1056 -1056
  288. data/spec/unit/policyfile_lock_install_spec.rb +138 -138
  289. data/spec/unit/policyfile_lock_serialization_spec.rb +425 -425
  290. data/spec/unit/policyfile_lock_validation_spec.rb +611 -611
  291. data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -236
  292. data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +275 -275
  293. data/spec/unit/policyfile_services/export_repo_spec.rb +439 -439
  294. data/spec/unit/policyfile_services/install_spec.rb +191 -191
  295. data/spec/unit/policyfile_services/push_archive_spec.rb +345 -345
  296. data/spec/unit/policyfile_services/push_spec.rb +233 -233
  297. data/spec/unit/policyfile_services/rm_policy_group_spec.rb +241 -241
  298. data/spec/unit/policyfile_services/rm_policy_spec.rb +266 -266
  299. data/spec/unit/policyfile_services/show_policy_spec.rb +889 -889
  300. data/spec/unit/policyfile_services/undelete_spec.rb +304 -304
  301. data/spec/unit/policyfile_services/update_attributes_spec.rb +217 -217
  302. data/spec/unit/service_exception_inspectors/base_spec.rb +43 -43
  303. data/spec/unit/service_exception_inspectors/http_spec.rb +140 -140
  304. data/spec/unit/shell_out_spec.rb +34 -34
  305. data/warning.txt +9 -0
  306. metadata +18 -5
@@ -1,490 +1,534 @@
1
- #
2
- # Copyright:: Copyright (c) 2014 Chef Software Inc.
3
- # License:: Apache License, Version 2.0
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
- #
17
-
18
- require 'chef-dk/command/base'
19
- require 'chef-dk/exceptions'
20
- require 'chef-dk/component_test'
21
-
22
- module ChefDK
23
- module Command
24
- class Verify < ChefDK::Command::Base
25
-
26
- include ChefDK::Helpers
27
-
28
- banner "Usage: chef verify [component, ...] [options]"
29
-
30
- option :omnibus_dir,
31
- :long => "--omnibus-dir OMNIBUS_DIR",
32
- :description => "Alternate path to omnibus install (used for testing)"
33
-
34
- option :unit,
35
- :long => "--unit",
36
- :description => "Run bundled app unit tests (only smoke tests run by default)"
37
-
38
- option :integration,
39
- :long => "--integration",
40
- :description => "Run integration tests. Possibly dangerous, for development systems only"
41
-
42
- option :verbose,
43
- :long => "--verbose",
44
- :description => "Display all test output, not just failing tests"
45
-
46
- class << self
47
- def add_component(name, _delete_me=nil)
48
- component = ComponentTest.new(name)
49
- yield component if block_given? #delete this conditional
50
- component_map[name] = component
51
- end
52
-
53
- def component(name)
54
- component_map[name]
55
- end
56
-
57
- def components
58
- component_map.values
59
- end
60
-
61
- def component_map
62
- @component_map ||= {}
63
- end
64
- end
65
-
66
- def components
67
- self.class.components
68
- end
69
-
70
- #
71
- # Components included in Chef Development kit:
72
- # :base_dir => Relative path of the component w.r.t. omnibus_apps_dir
73
- # :test_cmd => Test command to be launched for the component
74
- #
75
- add_component "berkshelf" do |c|
76
- c.base_dir = "berkshelf"
77
- # For berks the real command to run is "bundle exec thor spec:ci"
78
- # We can't run it right now since graphviz specs are included in the
79
- # test suite by default. We will be able to switch to that command when/if
80
- # Graphviz is added to omnibus.
81
- c.unit_test { sh("bundle exec rspec --color --format progress spec/unit --tag ~graphviz") }
82
- c.integration_test { sh("bundle exec cucumber --color --format progress --tags ~@no_run --tags ~@spawn --tags ~@graphviz --strict") }
83
-
84
- c.smoke_test do
85
- tmpdir do |cwd|
86
- FileUtils.touch(File.join(cwd,"Berksfile"))
87
- sh("berks install", cwd: cwd)
88
- end
89
- end
90
- end
91
-
92
- add_component "test-kitchen" do |c|
93
- c.base_dir = "test-kitchen"
94
- c.unit_test { sh("bundle exec rake unit") }
95
- c.integration_test { sh("bundle exec rake features") }
96
-
97
- # NOTE: By default, kitchen tries to be helpful and install a driver
98
- # gem for you. This causes a race condition when running the tests
99
- # concurrently, because rubygems breaks when there are partially
100
- # installed gems in the gem repository. Instructing kitchen to create a
101
- # gemfile instead avoids the gem installation.
102
- c.smoke_test { run_in_tmpdir("kitchen init --create-gemfile") }
103
- end
104
-
105
- add_component "tk-policyfile-provisioner" do |c|
106
-
107
- c.base_dir = "chef-dk"
108
-
109
- c.smoke_test do
110
- tmpdir do |cwd|
111
- File.open(File.join(cwd, ".kitchen.yml"), "w+") do |f|
112
- f.print(<<-KITCHEN_YML)
113
- ---
114
- driver:
115
- name: dummy
116
- network:
117
- - ["forwarded_port", {guest: 80, host: 8080}]
118
-
119
- provisioner:
120
- name: policyfile_zero
121
- require_chef_omnibus: 12.3.0
122
-
123
- platforms:
124
- - name: ubuntu-14.04
125
-
126
- suites:
127
- - name: default
128
- run_list:
129
- - recipe[aar::default]
130
- attributes:
131
-
132
- KITCHEN_YML
133
- end
134
-
135
- sh("kitchen list", cwd: cwd)
136
-
137
- end
138
- end
139
-
140
- end
141
-
142
- add_component "chef-client" do |c|
143
- c.base_dir = "chef"
144
- c.unit_test { sh("bundle exec rspec -fp -t '~volatile_from_verify' spec/unit") }
145
- c.integration_test { sh("bundle exec rspec -fp spec/integration spec/functional") }
146
-
147
- c.smoke_test do
148
- tmpdir do |cwd|
149
- FileUtils.touch(File.join(cwd, "apply.rb"))
150
- sh("chef-apply apply.rb", cwd: cwd)
151
- end
152
- end
153
- end
154
-
155
- add_component "chef-dk" do |c|
156
- c.base_dir = "chef-dk"
157
- c.unit_test { sh("bundle exec rspec") }
158
- c.smoke_test { run_in_tmpdir("chef generate cookbook example") }
159
- end
160
-
161
- # entirely possible this needs to be driven by a utility method in chef-provisioning.
162
- add_component "chef-provisioning" do |c|
163
- c.base_dir = "chef-dk"
164
-
165
- c.smoke_test do
166
- # ------------
167
- # we want to avoid hard-coding driver names, but calling Gem::Specification produces a warning;
168
- # changing $VERBOSE seems to be the best way to silence it.
169
- verbose = $VERBOSE
170
- $VERBOSE = nil
171
-
172
- # construct a hash of { driver_name => [version1, version2, ...]}
173
- driver_versions = {}
174
- Gem::Specification.all.map { |gs| [gs.name, gs.version] }.
175
- select { |n| n[0] =~ /^chef-provisioning-/ }.
176
- each { |gem, version| (driver_versions[gem] ||= []) << version }
177
-
178
- drivers = Gem::Specification.all.map { |gs| gs.name }.
179
- select { |n| n =~ /^chef-provisioning-/ }.
180
- uniq
181
-
182
- versions = Gem::Specification.find_all_by_name("chef-provisioning").map { |s| s.version }
183
- $VERBOSE = verbose
184
- # ------------
185
- failures = []
186
-
187
- # ------------
188
- # fail the verify if we have more than one version of chef-provisioning or any of its drivers.
189
- def format_gem_failure(name, versions)
190
- <<-EOS
191
- #{name} has multiple versions installed:
192
- #{versions.sort.map { |gv| " #{gv.to_s}" }.join("\n")}
193
- EOS
194
- end
195
-
196
- failures << format_gem_failure("chef-provisioning", versions) if versions.size > 1
197
-
198
- driver_versions.keys.sort.each do |driver_name|
199
- v = driver_versions[driver_name]
200
- failures << format_gem_failure(driver_name, v) if v.size > 1
201
- end
202
-
203
- if failures.size > 0
204
- failures << <<-EOS
205
-
206
- Some applications may need or prefer different versions of the chef-provisioning gem or its drivers, so
207
- this multiple-version check can fail if a user has installed new versions of those libraries.
208
- EOS
209
- end
210
-
211
- # ------------
212
- # load the core gem and all of the drivers (ignoring versions).
213
- require "chef/provisioning"
214
- drivers.map { |d| "#{d.gsub('-', '/')}_driver" }.each do |driver_gem|
215
- begin
216
- begin
217
- require driver_gem
218
- rescue LoadError
219
- # anomalously, chef-provisioning-fog does not have a fog_driver.rb. (9/2015)
220
- require "#{driver_gem}/driver.rb"
221
- end
222
- rescue LoadError => ex
223
- puts ex
224
- end
225
- end
226
-
227
- # ------------
228
- # look for version dependency conflicts.
229
- tmpdir do |cwd|
230
- versions.each do |provisioning_version|
231
- gemfile = "chef-provisioning-#{provisioning_version}-chefdk-test.gemfile"
232
-
233
- # write out the gemfile for this chef-provisioning version, and see if Bundler can make it go.
234
- with_file(File.join(cwd, gemfile)) do |f|
235
- f.puts %Q(gem "chef-provisioning", "= #{provisioning_version}")
236
- drivers.each { |d| f.puts %Q(gem "#{d}") }
237
- end
238
-
239
- result = sh("bundle install --local --quiet", cwd: cwd, env: {"BUNDLE_GEMFILE" => gemfile })
240
-
241
- if result.exitstatus != 0
242
- failures << result.stdout
243
- end
244
- end # end provisioning versions.
245
-
246
- failures.each { |fail| puts fail }
247
-
248
- # dubious on Windows.
249
- # this is weird, but we seem to require a Mixlib::ShellOut as the return value. suggestions
250
- # welcome.
251
- sh(failures.size > 0 ? "false" : "true")
252
- end
253
- end
254
- end
255
-
256
- add_component "chefspec" do |c|
257
- c.gem_base_dir = "chefspec"
258
- c.unit_test { sh("rake unit") }
259
- c.smoke_test do
260
- tmpdir do |cwd|
261
- FileUtils.mkdir(File.join(cwd, "spec"))
262
- with_file(File.join(cwd, "spec", "spec_helper.rb")) do |f|
263
- f.write <<-EOF
264
- require 'chefspec'
265
- require 'chefspec/berkshelf'
266
- require 'chefspec/cacher'
267
-
268
- RSpec.configure do |config|
269
- config.expect_with(:rspec) { |c| c.syntax = :expect }
270
- end
271
- EOF
272
- end
273
- FileUtils.touch(File.join(cwd, "Berksfile"))
274
- with_file(File.join(cwd, "spec", "foo_spec.rb")) do |f|
275
- f.write <<-EOF
276
- require 'spec_helper'
277
- EOF
278
- end
279
- sh("rspec", cwd: cwd)
280
- end
281
- end
282
- end
283
-
284
- add_component "rubocop" do |c|
285
- c.gem_base_dir = "rubocop"
286
- c.smoke_test do
287
- tmpdir do |cwd|
288
- with_file(File.join(cwd, 'foo.rb')) do |f|
289
- f.write <<-EOF
290
- def foo
291
- puts 'foo'
292
- end
293
- EOF
294
- end
295
- sh("rubocop foo.rb -l", cwd: cwd)
296
- end
297
- end
298
- end
299
-
300
- add_component "fauxhai" do |c|
301
- c.gem_base_dir = "fauxhai"
302
- c.smoke_test { sh("gem list fauxhai") }
303
- end
304
-
305
- add_component "knife-spork" do |c|
306
- c.gem_base_dir = "knife-spork"
307
- c.smoke_test { sh('knife spork info')}
308
- end
309
-
310
- add_component "kitchen-vagrant" do |c|
311
- c.gem_base_dir = "kitchen-vagrant"
312
- # The build is not passing in travis, so no tests
313
- c.smoke_test { sh("gem list kitchen-vagrant") }
314
- end
315
-
316
- add_component "package installation" do |c|
317
-
318
- c.base_dir = "chef-dk"
319
-
320
- c.smoke_test do
321
-
322
- if File.directory?(usr_bin_prefix)
323
- sh!("#{usr_bin_path("berks")} -v")
324
-
325
- sh!("#{usr_bin_path("chef")} -v")
326
-
327
- sh!("#{usr_bin_path("chef-client")} -v")
328
- sh!("#{usr_bin_path("chef-solo")} -v")
329
-
330
- # In `knife`, `knife -v` follows a different code path that skips
331
- # command/plugin loading; `knife -h` loads commands and plugins, but
332
- # it exits with code 1, which is the same as a load error. Running
333
- # `knife exec` forces command loading to happen and this command
334
- # exits 0, which runs most of the code.
335
- #
336
- # See also: https://github.com/opscode/chef-dk/issues/227
337
- sh!("#{usr_bin_path("knife")} exec -E true")
338
-
339
- tmpdir do |dir|
340
- # Kitchen tries to create a .kitchen dir even when just running
341
- # `kitchen -v`:
342
- sh!("#{usr_bin_path("kitchen")} -v", cwd: dir)
343
- end
344
-
345
- sh!("#{usr_bin_path("ohai")} -v")
346
-
347
- sh!("#{usr_bin_path("foodcritic")} -V")
348
- end
349
-
350
- # Test blocks are expected to return a Mixlib::ShellOut compatible
351
- # object:
352
- ComponentTest::NullTestResult.new
353
- end
354
- end
355
-
356
- add_component "openssl" do |c|
357
- # https://github.com/chef/chef-dk/issues/420
358
- c.base_dir = "chef"
359
-
360
- test = <<-EOF.gsub(/^\s+/, "")
361
- require "net/http"
362
-
363
- uris = %w{https://www.google.com https://chef.io/ https://ec2.amazonaws.com}
364
- uris.each do |uri|
365
- uri = URI(uri)
366
- puts "Fetching \#{uri} for SSL check"
367
- Net::HTTP.get uri
368
- end
369
- EOF
370
-
371
- c.unit_test do
372
- tmpdir do |cwd|
373
- with_file(File.join(cwd, "openssl.rb")) do |f|
374
- f.write test
375
- end
376
- sh!("#{Gem.ruby} openssl.rb", cwd: cwd)
377
- end
378
- end
379
- end
380
-
381
- attr_reader :verification_threads
382
- attr_reader :verification_results
383
- attr_reader :verification_status
384
-
385
- def initialize
386
- super
387
- @verification_threads = [ ]
388
- @verification_results = [ ]
389
- @verification_status = 0
390
- end
391
-
392
- def run(params = [ ])
393
- @components_filter = parse_options(params)
394
-
395
- validate_components!
396
- invoke_tests
397
- wait_for_tests
398
- report_results
399
-
400
- verification_status
401
- end
402
-
403
- def omnibus_root
404
- config[:omnibus_dir] || super
405
- end
406
-
407
- def validate_components!
408
- components.each do |component|
409
- component.omnibus_root = omnibus_root
410
- component.assert_present!
411
- end
412
- end
413
-
414
- def components_to_test
415
- if @components_filter.empty?
416
- components
417
- else
418
- components.select do |component|
419
- @components_filter.include?(component.name.to_s)
420
- end
421
- end
422
- end
423
-
424
- def invoke_tests
425
- components_to_test.each do |component|
426
- # Run the component specs in parallel
427
- verification_threads << Thread.new do
428
-
429
- results = []
430
-
431
- results << component.run_smoke_test
432
-
433
- if config[:unit]
434
- results << component.run_unit_test
435
- end
436
-
437
- if config[:integration]
438
- results << component.run_integration_test
439
- end
440
-
441
- if results.any? {|r| r.exitstatus != 0 }
442
- component_status = 1
443
- @verification_status = 1
444
- else
445
- component_status = 0
446
- end
447
-
448
- {
449
- :component => component,
450
- :results => results,
451
- :component_status => component_status
452
- }
453
- end
454
-
455
- msg("Running verification for component '#{component.name}'")
456
- end
457
- end
458
-
459
- def wait_for_tests
460
- while !verification_threads.empty?
461
- verification_threads.each do |t|
462
- if t.join(1)
463
- verification_threads.delete t
464
- verification_results << t.value
465
- t.value[:results].each do |result|
466
- if config[:verbose] || t.value[:component_status] != 0
467
- msg("")
468
- msg(result.stdout)
469
- msg(result.stderr) if result.stderr
470
- end
471
- end
472
- else
473
- $stdout.write "."
474
- end
475
- end
476
- end
477
- end
478
-
479
- def report_results
480
- msg("")
481
- msg("---------------------------------------------")
482
- verification_results.each do |result|
483
- message = result[:component_status] == 0 ? "succeeded" : "failed"
484
- msg("Verification of component '#{result[:component].name}' #{message}.")
485
- end
486
- end
487
-
488
- end
489
- end
490
- end
1
+ #
2
+ # Copyright:: Copyright (c) 2014 Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require 'chef-dk/command/base'
19
+ require 'chef-dk/exceptions'
20
+ require 'chef-dk/component_test'
21
+
22
+ module ChefDK
23
+ module Command
24
+ class Verify < ChefDK::Command::Base
25
+
26
+ include ChefDK::Helpers
27
+
28
+ banner "Usage: chef verify [component, ...] [options]"
29
+
30
+ option :omnibus_dir,
31
+ :long => "--omnibus-dir OMNIBUS_DIR",
32
+ :description => "Alternate path to omnibus install (used for testing)"
33
+
34
+ option :unit,
35
+ :long => "--unit",
36
+ :description => "Run bundled app unit tests (only smoke tests run by default)"
37
+
38
+ option :integration,
39
+ :long => "--integration",
40
+ :description => "Run integration tests. Possibly dangerous, for development systems only"
41
+
42
+ option :verbose,
43
+ :long => "--verbose",
44
+ :description => "Display all test output, not just failing tests"
45
+
46
+ class << self
47
+ def add_component(name, _delete_me=nil)
48
+ component = ComponentTest.new(name)
49
+ yield component if block_given? #delete this conditional
50
+ component_map[name] = component
51
+ end
52
+
53
+ def component(name)
54
+ component_map[name]
55
+ end
56
+
57
+ def components
58
+ component_map.values
59
+ end
60
+
61
+ def component_map
62
+ @component_map ||= {}
63
+ end
64
+ end
65
+
66
+ def components
67
+ self.class.components
68
+ end
69
+
70
+ #
71
+ # Components included in Chef Development kit:
72
+ # :base_dir => Relative path of the component w.r.t. omnibus_apps_dir
73
+ # :gem_base_dir => Takes a gem name instead and uses first gem found
74
+ # :test_cmd => Test command to be launched for the component
75
+ #
76
+ add_component "berkshelf" do |c|
77
+ c.gem_base_dir = "berkshelf"
78
+ # For berks the real command to run is "bundle exec thor spec:ci"
79
+ # We can't run it right now since graphviz specs are included in the
80
+ # test suite by default. We will be able to switch to that command when/if
81
+ # Graphviz is added to omnibus.
82
+ c.unit_test { sh("bundle exec rspec --color --format progress spec/unit --tag ~graphviz") }
83
+ c.integration_test { sh("bundle exec cucumber --color --format progress --tags ~@no_run --tags ~@spawn --tags ~@graphviz --strict") }
84
+
85
+ c.smoke_test do
86
+ tmpdir do |cwd|
87
+ FileUtils.touch(File.join(cwd,"Berksfile"))
88
+ sh("berks install", cwd: cwd)
89
+ end
90
+ end
91
+ end
92
+
93
+ add_component "test-kitchen" do |c|
94
+ c.gem_base_dir = "test-kitchen"
95
+ c.unit_test { sh("bundle exec rake unit") }
96
+ c.integration_test { sh("bundle exec rake features") }
97
+
98
+ # NOTE: By default, kitchen tries to be helpful and install a driver
99
+ # gem for you. This causes a race condition when running the tests
100
+ # concurrently, because rubygems breaks when there are partially
101
+ # installed gems in the gem repository. Instructing kitchen to create a
102
+ # gemfile instead avoids the gem installation.
103
+ c.smoke_test { run_in_tmpdir("kitchen init --create-gemfile") }
104
+ end
105
+
106
+ add_component "tk-policyfile-provisioner" do |c|
107
+
108
+ c.gem_base_dir = "chef-dk"
109
+
110
+ c.smoke_test do
111
+ tmpdir do |cwd|
112
+ File.open(File.join(cwd, ".kitchen.yml"), "w+") do |f|
113
+ f.print(<<-KITCHEN_YML)
114
+ ---
115
+ driver:
116
+ name: dummy
117
+ network:
118
+ - ["forwarded_port", {guest: 80, host: 8080}]
119
+
120
+ provisioner:
121
+ name: policyfile_zero
122
+ require_chef_omnibus: 12.3.0
123
+
124
+ platforms:
125
+ - name: ubuntu-14.04
126
+
127
+ suites:
128
+ - name: default
129
+ run_list:
130
+ - recipe[aar::default]
131
+ attributes:
132
+
133
+ KITCHEN_YML
134
+ end
135
+
136
+ sh("kitchen list", cwd: cwd)
137
+
138
+ end
139
+ end
140
+
141
+ end
142
+
143
+ add_component "chef-client" do |c|
144
+ c.gem_base_dir = "chef"
145
+ c.unit_test { sh("bundle exec rspec -fp -t '~volatile_from_verify' spec/unit") }
146
+ c.integration_test { sh("bundle exec rspec -fp spec/integration spec/functional") }
147
+
148
+ c.smoke_test do
149
+ tmpdir do |cwd|
150
+ FileUtils.touch(File.join(cwd, "apply.rb"))
151
+ sh("chef-apply apply.rb", cwd: cwd)
152
+ end
153
+ end
154
+ end
155
+
156
+ add_component "chef-dk" do |c|
157
+ c.gem_base_dir = "chef-dk"
158
+ c.unit_test { sh("bundle exec rspec") }
159
+ c.smoke_test { run_in_tmpdir("chef generate cookbook example") }
160
+ end
161
+
162
+ # entirely possible this needs to be driven by a utility method in chef-provisioning.
163
+ add_component "chef-provisioning" do |c|
164
+ c.gem_base_dir = "chef-dk"
165
+
166
+ c.smoke_test do
167
+ # ------------
168
+ # we want to avoid hard-coding driver names, but calling Gem::Specification produces a warning;
169
+ # changing $VERBOSE seems to be the best way to silence it.
170
+ verbose = $VERBOSE
171
+ $VERBOSE = nil
172
+
173
+ # construct a hash of { driver_name => [version1, version2, ...]}
174
+ driver_versions = {}
175
+ Gem::Specification.all.map { |gs| [gs.name, gs.version] }.
176
+ select { |n| n[0] =~ /^chef-provisioning-/ }.
177
+ each { |gem, version| (driver_versions[gem] ||= []) << version }
178
+
179
+ drivers = Gem::Specification.all.map { |gs| gs.name }.
180
+ select { |n| n =~ /^chef-provisioning-/ }.
181
+ uniq
182
+
183
+ versions = Gem::Specification.find_all_by_name("chef-provisioning").map { |s| s.version }
184
+ $VERBOSE = verbose
185
+ # ------------
186
+ failures = []
187
+
188
+ # ------------
189
+ # fail the verify if we have more than one version of chef-provisioning or any of its drivers.
190
+ def format_gem_failure(name, versions)
191
+ <<-EOS
192
+ #{name} has multiple versions installed:
193
+ #{versions.sort.map { |gv| " #{gv.to_s}" }.join("\n")}
194
+ EOS
195
+ end
196
+
197
+ failures << format_gem_failure("chef-provisioning", versions) if versions.size > 1
198
+
199
+ driver_versions.keys.sort.each do |driver_name|
200
+ v = driver_versions[driver_name]
201
+ failures << format_gem_failure(driver_name, v) if v.size > 1
202
+ end
203
+
204
+ if failures.size > 0
205
+ failures << <<-EOS
206
+
207
+ Some applications may need or prefer different versions of the chef-provisioning gem or its drivers, so
208
+ this multiple-version check can fail if a user has installed new versions of those libraries.
209
+ EOS
210
+ end
211
+
212
+ # ------------
213
+ # load the core gem and all of the drivers (ignoring versions).
214
+ require "chef/provisioning"
215
+ drivers.map { |d| "#{d.gsub('-', '/')}_driver" }.each do |driver_gem|
216
+ begin
217
+ begin
218
+ require driver_gem
219
+ rescue LoadError
220
+ # anomalously, chef-provisioning-fog does not have a fog_driver.rb. (9/2015)
221
+ require "#{driver_gem}/driver.rb"
222
+ end
223
+ rescue LoadError => ex
224
+ puts ex
225
+ end
226
+ end
227
+
228
+ # ------------
229
+ # look for version dependency conflicts.
230
+ tmpdir do |cwd|
231
+ versions.each do |provisioning_version|
232
+ gemfile = "chef-provisioning-#{provisioning_version}-chefdk-test.gemfile"
233
+
234
+ # write out the gemfile for this chef-provisioning version, and see if Bundler can make it go.
235
+ with_file(File.join(cwd, gemfile)) do |f|
236
+ f.puts %Q(gem "chef-provisioning", "= #{provisioning_version}")
237
+ drivers.each { |d| f.puts %Q(gem "#{d}") }
238
+ end
239
+
240
+ result = sh("bundle install --local --quiet", cwd: cwd, env: {"BUNDLE_GEMFILE" => gemfile })
241
+
242
+ if result.exitstatus != 0
243
+ failures << result.stdout
244
+ end
245
+ end # end provisioning versions.
246
+
247
+ failures.each { |fail| puts fail }
248
+
249
+ # dubious on Windows.
250
+ # this is weird, but we seem to require a Mixlib::ShellOut as the return value. suggestions
251
+ # welcome.
252
+ sh(failures.size > 0 ? "false" : "true")
253
+ end
254
+ end
255
+ end
256
+
257
+ add_component "chefspec" do |c|
258
+ c.gem_base_dir = "chefspec"
259
+ c.unit_test { sh("rake unit") }
260
+ c.smoke_test do
261
+ tmpdir do |cwd|
262
+ FileUtils.mkdir(File.join(cwd, "spec"))
263
+ with_file(File.join(cwd, "spec", "spec_helper.rb")) do |f|
264
+ f.write <<-EOF
265
+ require 'chefspec'
266
+ require 'chefspec/berkshelf'
267
+ require 'chefspec/cacher'
268
+
269
+ RSpec.configure do |config|
270
+ config.expect_with(:rspec) { |c| c.syntax = :expect }
271
+ end
272
+ EOF
273
+ end
274
+ FileUtils.touch(File.join(cwd, "Berksfile"))
275
+ with_file(File.join(cwd, "spec", "foo_spec.rb")) do |f|
276
+ f.write <<-EOF
277
+ require 'spec_helper'
278
+ EOF
279
+ end
280
+ sh("rspec", cwd: cwd)
281
+ end
282
+ end
283
+ end
284
+
285
+ add_component "generated-cookbooks-pass-chefspec" do |c|
286
+
287
+ c.gem_base_dir = "chef-dk"
288
+ c.smoke_test do
289
+ tmpdir do |cwd|
290
+ sh("chef generate cookbook example", cwd: cwd)
291
+ cb_cwd = File.join(cwd, "example")
292
+ sh("rspec", cwd: cb_cwd)
293
+ end
294
+ end
295
+ end
296
+
297
+ add_component "rubocop" do |c|
298
+ c.gem_base_dir = "rubocop"
299
+ c.smoke_test do
300
+ tmpdir do |cwd|
301
+ with_file(File.join(cwd, 'foo.rb')) do |f|
302
+ f.write <<-EOF
303
+ def foo
304
+ puts 'foo'
305
+ end
306
+ EOF
307
+ end
308
+ sh("rubocop foo.rb -l", cwd: cwd)
309
+ end
310
+ end
311
+ end
312
+
313
+ add_component "fauxhai" do |c|
314
+ c.gem_base_dir = "fauxhai"
315
+ c.smoke_test { sh("gem list fauxhai") }
316
+ end
317
+
318
+ add_component "knife-spork" do |c|
319
+ c.gem_base_dir = "knife-spork"
320
+ c.smoke_test { sh('knife spork info')}
321
+ end
322
+
323
+ add_component "kitchen-vagrant" do |c|
324
+ c.gem_base_dir = "kitchen-vagrant"
325
+ # The build is not passing in travis, so no tests
326
+ c.smoke_test { sh("gem list kitchen-vagrant") }
327
+ end
328
+
329
+ add_component "package installation" do |c|
330
+
331
+ c.gem_base_dir = "chef-dk"
332
+
333
+ c.smoke_test do
334
+
335
+ if File.directory?(usr_bin_prefix)
336
+ sh!("#{usr_bin_path("berks")} -v")
337
+
338
+ sh!("#{usr_bin_path("chef")} -v")
339
+
340
+ sh!("#{usr_bin_path("chef-client")} -v")
341
+ sh!("#{usr_bin_path("chef-solo")} -v")
342
+
343
+ # In `knife`, `knife -v` follows a different code path that skips
344
+ # command/plugin loading; `knife -h` loads commands and plugins, but
345
+ # it exits with code 1, which is the same as a load error. Running
346
+ # `knife exec` forces command loading to happen and this command
347
+ # exits 0, which runs most of the code.
348
+ #
349
+ # See also: https://github.com/opscode/chef-dk/issues/227
350
+ sh!("#{usr_bin_path("knife")} exec -E true")
351
+
352
+ tmpdir do |dir|
353
+ # Kitchen tries to create a .kitchen dir even when just running
354
+ # `kitchen -v`:
355
+ sh!("#{usr_bin_path("kitchen")} -v", cwd: dir)
356
+ end
357
+
358
+ sh!("#{usr_bin_path("ohai")} -v")
359
+
360
+ sh!("#{usr_bin_path("foodcritic")} -V")
361
+ end
362
+
363
+ # Test blocks are expected to return a Mixlib::ShellOut compatible
364
+ # object:
365
+ ComponentTest::NullTestResult.new
366
+ end
367
+ end
368
+
369
+ add_component "openssl" do |c|
370
+ # https://github.com/chef/chef-dk/issues/420
371
+ c.gem_base_dir = "chef"
372
+
373
+ test = <<-EOF.gsub(/^\s+/, "")
374
+ require "net/http"
375
+
376
+ uris = %w{https://www.google.com https://chef.io/ https://ec2.amazonaws.com}
377
+ uris.each do |uri|
378
+ uri = URI(uri)
379
+ puts "Fetching \#{uri} for SSL check"
380
+ Net::HTTP.get uri
381
+ end
382
+ EOF
383
+
384
+ c.unit_test do
385
+ tmpdir do |cwd|
386
+ with_file(File.join(cwd, "openssl.rb")) do |f|
387
+ f.write test
388
+ end
389
+ sh!("#{Gem.ruby} openssl.rb", cwd: cwd)
390
+ end
391
+ end
392
+ end
393
+
394
+ add_component "inspec" do |c|
395
+ c.gem_base_dir = "inspec"
396
+
397
+ # Commenting out the unit and integration tests for now until we figure
398
+ # out the bundler error
399
+ #c.unit_test { sh("bundle exec rake test:isolated") }
400
+ # This runs Test Kitchen (using kitchen-inspec) with some inspec tests
401
+ #c.integration_test { sh("bundle exec rake test:vm") }
402
+
403
+ # It would be nice to use a chef generator to create these specs, but
404
+ # we dont have that yet. So we do it manually.
405
+ c.smoke_test do
406
+ tmpdir do |cwd|
407
+ File.open(File.join(cwd, "some_spec.rb"), "w+") do |f|
408
+ f.print <<-INSPEC_TEST
409
+ rule '01' do
410
+ impact 0.7
411
+ title 'Some Test'
412
+ desc 'Make sure inspec is installed and loading correct'
413
+ describe 1 do
414
+ it { should eq(1) }
415
+ end
416
+ end
417
+ INSPEC_TEST
418
+ end
419
+ # TODO when we appbundle inspec, no longer `chef exec`
420
+ sh("chef exec inspec exec .", cwd: cwd)
421
+ end
422
+ end
423
+ end
424
+
425
+ attr_reader :verification_threads
426
+ attr_reader :verification_results
427
+ attr_reader :verification_status
428
+
429
+ def initialize
430
+ super
431
+ @verification_threads = [ ]
432
+ @verification_results = [ ]
433
+ @verification_status = 0
434
+ end
435
+
436
+ def run(params = [ ])
437
+ @components_filter = parse_options(params)
438
+
439
+ validate_components!
440
+ invoke_tests
441
+ wait_for_tests
442
+ report_results
443
+
444
+ verification_status
445
+ end
446
+
447
+ def omnibus_root
448
+ config[:omnibus_dir] || super
449
+ end
450
+
451
+ def validate_components!
452
+ components.each do |component|
453
+ component.omnibus_root = omnibus_root
454
+ component.assert_present!
455
+ end
456
+ end
457
+
458
+ def components_to_test
459
+ if @components_filter.empty?
460
+ components
461
+ else
462
+ components.select do |component|
463
+ @components_filter.include?(component.name.to_s)
464
+ end
465
+ end
466
+ end
467
+
468
+ def invoke_tests
469
+ components_to_test.each do |component|
470
+ # Run the component specs in parallel
471
+ verification_threads << Thread.new do
472
+
473
+ results = []
474
+
475
+ results << component.run_smoke_test
476
+
477
+ if config[:unit]
478
+ results << component.run_unit_test
479
+ end
480
+
481
+ if config[:integration]
482
+ results << component.run_integration_test
483
+ end
484
+
485
+ if results.any? {|r| r.exitstatus != 0 }
486
+ component_status = 1
487
+ @verification_status = 1
488
+ else
489
+ component_status = 0
490
+ end
491
+
492
+ {
493
+ :component => component,
494
+ :results => results,
495
+ :component_status => component_status
496
+ }
497
+ end
498
+
499
+ msg("Running verification for component '#{component.name}'")
500
+ end
501
+ end
502
+
503
+ def wait_for_tests
504
+ while !verification_threads.empty?
505
+ verification_threads.each do |t|
506
+ if t.join(1)
507
+ verification_threads.delete t
508
+ verification_results << t.value
509
+ t.value[:results].each do |result|
510
+ if config[:verbose] || t.value[:component_status] != 0
511
+ msg("")
512
+ msg(result.stdout)
513
+ msg(result.stderr) if result.stderr
514
+ end
515
+ end
516
+ else
517
+ $stdout.write "."
518
+ end
519
+ end
520
+ end
521
+ end
522
+
523
+ def report_results
524
+ msg("")
525
+ msg("---------------------------------------------")
526
+ verification_results.each do |result|
527
+ message = result[:component_status] == 0 ? "succeeded" : "failed"
528
+ msg("Verification of component '#{result[:component].name}' #{message}.")
529
+ end
530
+ end
531
+
532
+ end
533
+ end
534
+ end