cuken 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (396) hide show
  1. data/Gemfile +5 -3
  2. data/Gemfile.lock +61 -18
  3. data/LICENSE +13 -0
  4. data/NOTICE +3 -0
  5. data/Rakefile +3 -3
  6. data/VERSION +1 -1
  7. data/cucumber.yml +8 -0
  8. data/cuken.gemspec +397 -13
  9. data/examples/chef/features/support/env.rb +16 -0
  10. data/features/chef/cookbooks/cookbook.feature +14 -0
  11. data/features/chef/cookbooks/metadata.feature +40 -0
  12. data/features/chef/cookbooks/repo.feature +13 -0
  13. data/features/chef/knife.feature +140 -0
  14. data/features/chef/knife_steps.feature +19 -0
  15. data/features/command_steps.feature +68 -0
  16. data/features/commands.feature +5 -5
  17. data/features/common_steps.feature +13 -0
  18. data/features/data/Rakefile +38 -0
  19. data/features/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
  20. data/features/data/apt/chef-integration-test-1.0/debian/compat +1 -0
  21. data/features/data/apt/chef-integration-test-1.0/debian/control +13 -0
  22. data/features/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
  23. data/features/data/apt/chef-integration-test-1.0/debian/files +1 -0
  24. data/features/data/apt/chef-integration-test-1.0/debian/rules +13 -0
  25. data/features/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
  26. data/features/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
  27. data/features/data/apt/chef-integration-test-1.1/debian/compat +1 -0
  28. data/features/data/apt/chef-integration-test-1.1/debian/control +13 -0
  29. data/features/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
  30. data/features/data/apt/chef-integration-test-1.1/debian/files +1 -0
  31. data/features/data/apt/chef-integration-test-1.1/debian/rules +13 -0
  32. data/features/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
  33. data/features/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
  34. data/features/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
  35. data/features/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
  36. data/features/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
  37. data/features/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
  38. data/features/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
  39. data/features/data/apt/var/www/apt/conf/distributions +7 -0
  40. data/features/data/apt/var/www/apt/conf/incoming +4 -0
  41. data/features/data/apt/var/www/apt/conf/pulls +3 -0
  42. data/features/data/apt/var/www/apt/db/checksums.db +0 -0
  43. data/features/data/apt/var/www/apt/db/contents.cache.db +0 -0
  44. data/features/data/apt/var/www/apt/db/packages.db +0 -0
  45. data/features/data/apt/var/www/apt/db/references.db +0 -0
  46. data/features/data/apt/var/www/apt/db/release.caches.db +0 -0
  47. data/features/data/apt/var/www/apt/db/version +4 -0
  48. data/features/data/apt/var/www/apt/dists/sid/Release +19 -0
  49. data/features/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
  50. data/features/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
  51. data/features/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
  52. data/features/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
  53. data/features/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
  54. data/features/data/config/client.rb +23 -0
  55. data/features/data/config/client_with_checksum_caching.rb +23 -0
  56. data/features/data/config/knife-stephen.rb +12 -0
  57. data/features/data/config/knife.rb +11 -0
  58. data/features/data/config/rake.rb +57 -0
  59. data/features/data/config/server.rb +52 -0
  60. data/features/data/cookbook_tarballs/empty_tarball.tar.gz +0 -0
  61. data/features/data/cookbook_tarballs/new.tar.gz +0 -0
  62. data/features/data/cookbook_tarballs/not_a_tarball.txt +1 -0
  63. data/features/data/cookbook_tarballs/original.tar.gz +0 -0
  64. data/features/data/cookbooks/attribute_include/README.rdoc +8 -0
  65. data/features/data/cookbooks/attribute_include/attributes/a.rb +4 -0
  66. data/features/data/cookbooks/attribute_include/attributes/b.rb +2 -0
  67. data/features/data/cookbooks/attribute_include/metadata.rb +6 -0
  68. data/features/data/cookbooks/attribute_include/recipes/default.rb +23 -0
  69. data/features/data/cookbooks/attribute_include_default/README.rdoc +8 -0
  70. data/features/data/cookbooks/attribute_include_default/attributes/a.rb +5 -0
  71. data/features/data/cookbooks/attribute_include_default/attributes/default.rb +2 -0
  72. data/features/data/cookbooks/attribute_include_default/metadata.rb +6 -0
  73. data/features/data/cookbooks/attribute_include_default/recipes/default.rb +23 -0
  74. data/features/data/cookbooks/attribute_settings/README.rdoc +8 -0
  75. data/features/data/cookbooks/attribute_settings/attributes/default.rb +3 -0
  76. data/features/data/cookbooks/attribute_settings/default.rb +1 -0
  77. data/features/data/cookbooks/attribute_settings/metadata.rb +6 -0
  78. data/features/data/cookbooks/attribute_settings/recipes/default.rb +21 -0
  79. data/features/data/cookbooks/attribute_settings/recipes/default_in_recipe.rb +25 -0
  80. data/features/data/cookbooks/attribute_settings_normal/README.rdoc +8 -0
  81. data/features/data/cookbooks/attribute_settings_normal/attributes/.default.rb.swo +0 -0
  82. data/features/data/cookbooks/attribute_settings_normal/attributes/default.rb +2 -0
  83. data/features/data/cookbooks/attribute_settings_normal/default.rb +1 -0
  84. data/features/data/cookbooks/attribute_settings_normal/metadata.rb +6 -0
  85. data/features/data/cookbooks/attribute_settings_normal/recipes/.default.rb.swo +0 -0
  86. data/features/data/cookbooks/attribute_settings_normal/recipes/.default_in_recipe.rb.swo +0 -0
  87. data/features/data/cookbooks/attribute_settings_normal/recipes/default.rb +21 -0
  88. data/features/data/cookbooks/attribute_settings_normal/recipes/normal_in_recipe.rb +25 -0
  89. data/features/data/cookbooks/attribute_settings_override/README.rdoc +8 -0
  90. data/features/data/cookbooks/attribute_settings_override/attributes/default.rb +2 -0
  91. data/features/data/cookbooks/attribute_settings_override/default.rb +1 -0
  92. data/features/data/cookbooks/attribute_settings_override/metadata.rb +6 -0
  93. data/features/data/cookbooks/attribute_settings_override/recipes/default.rb +21 -0
  94. data/features/data/cookbooks/attribute_settings_override/recipes/normal_in_recipe.rb +25 -0
  95. data/features/data/cookbooks/attribute_settings_override/recipes/override_in_recipe.rb +21 -0
  96. data/features/data/cookbooks/delayed_notifications/recipes/bad_syntax_notifies.rb +14 -0
  97. data/features/data/cookbooks/delayed_notifications/recipes/default.rb +18 -0
  98. data/features/data/cookbooks/delayed_notifications/recipes/forward_references.rb +10 -0
  99. data/features/data/cookbooks/delayed_notifications/recipes/invalid_forward_reference.rb +16 -0
  100. data/features/data/cookbooks/delayed_notifications/recipes/notify_a_resource_from_a_single_source.rb +26 -0
  101. data/features/data/cookbooks/delayed_notifications/recipes/notify_a_resource_from_multiple_sources.rb +31 -0
  102. data/features/data/cookbooks/delayed_notifications/recipes/notify_different_resources_for_different_actions.rb +31 -0
  103. data/features/data/cookbooks/deploy/recipes/callbacks.rb +78 -0
  104. data/features/data/cookbooks/deploy/recipes/default.rb +51 -0
  105. data/features/data/cookbooks/deploy/recipes/deploy_commit1.rb +25 -0
  106. data/features/data/cookbooks/deploy/recipes/deploy_commit2.rb +25 -0
  107. data/features/data/cookbooks/deploy/recipes/embedded_recipe_callbacks.rb +70 -0
  108. data/features/data/cookbooks/deploy/recipes/revision_deploy.rb +51 -0
  109. data/features/data/cookbooks/deploy/recipes/rollback_commit2.rb +24 -0
  110. data/features/data/cookbooks/deploy/templates/default/app_config.yml.erb +23 -0
  111. data/features/data/cookbooks/deploy/templates/default/database.yml.erb +18 -0
  112. data/features/data/cookbooks/deploy/templates/default/embedded_recipe_before_symlink.rb.erb +4 -0
  113. data/features/data/cookbooks/deploy/templates/default/sneaky_after_restart_hook.rb.erb +4 -0
  114. data/features/data/cookbooks/deploy/templates/default/sneaky_before_migrate_hook.rb.erb +2 -0
  115. data/features/data/cookbooks/deploy/templates/default/sneaky_before_restart_hook.rb.erb +4 -0
  116. data/features/data/cookbooks/deploy/templates/default/sneaky_before_symlink_hook.rb.erb +2 -0
  117. data/features/data/cookbooks/directory_provider/recipes/create.rb +25 -0
  118. data/features/data/cookbooks/directory_provider/recipes/default.rb +18 -0
  119. data/features/data/cookbooks/directory_provider/recipes/delete.rb +29 -0
  120. data/features/data/cookbooks/directory_provider/recipes/delete_nonexistent.rb +23 -0
  121. data/features/data/cookbooks/directory_provider/recipes/owner_update.rb +31 -0
  122. data/features/data/cookbooks/directory_provider/recipes/set_the_accessibility_of_a_created_directory.rb +55 -0
  123. data/features/data/cookbooks/execute_commands/metadata.rb +5 -0
  124. data/features/data/cookbooks/execute_commands/recipes/4k.rb +25 -0
  125. data/features/data/cookbooks/execute_commands/recipes/debug.rb +22 -0
  126. data/features/data/cookbooks/execute_commands/recipes/default.rb +22 -0
  127. data/features/data/cookbooks/execute_commands/recipes/umask.rb +23 -0
  128. data/features/data/cookbooks/integration_setup/attributes/integration.rb +25 -0
  129. data/features/data/cookbooks/integration_setup/recipes/default.rb +24 -0
  130. data/features/data/cookbooks/lwrp/providers/default.rb +9 -0
  131. data/features/data/cookbooks/lwrp/providers/lwp_non_default.rb +3 -0
  132. data/features/data/cookbooks/lwrp/providers/lwp_overridden_load_current_resource.rb +8 -0
  133. data/features/data/cookbooks/lwrp/providers/provider_is_omitted.rb +3 -0
  134. data/features/data/cookbooks/lwrp/recipes/default_everything.rb +4 -0
  135. data/features/data/cookbooks/lwrp/recipes/non_default_provider.rb +6 -0
  136. data/features/data/cookbooks/lwrp/recipes/non_default_resource.rb +6 -0
  137. data/features/data/cookbooks/lwrp/recipes/overridden_provider_load_current_resource.rb +6 -0
  138. data/features/data/cookbooks/lwrp/recipes/overridden_resource_initialize.rb +6 -0
  139. data/features/data/cookbooks/lwrp/recipes/provider_invokes_resource.rb +6 -0
  140. data/features/data/cookbooks/lwrp/recipes/provider_is_a_class.rb +6 -0
  141. data/features/data/cookbooks/lwrp/recipes/provider_is_a_string.rb +6 -0
  142. data/features/data/cookbooks/lwrp/recipes/provider_is_a_symbol.rb +6 -0
  143. data/features/data/cookbooks/lwrp/recipes/provider_is_omitted.rb +3 -0
  144. data/features/data/cookbooks/lwrp/resources/default.rb +4 -0
  145. data/features/data/cookbooks/lwrp/resources/lwr_non_default.rb +3 -0
  146. data/features/data/cookbooks/lwrp/resources/lwr_overridden_initialize.rb +8 -0
  147. data/features/data/cookbooks/lwrp/resources/provider_is_omitted.rb +1 -0
  148. data/features/data/cookbooks/manage_files/recipes/create_a_file.rb +22 -0
  149. data/features/data/cookbooks/manage_files/recipes/default.rb +19 -0
  150. data/features/data/cookbooks/manage_files/recipes/delete_a_file.rb +24 -0
  151. data/features/data/cookbooks/manage_files/recipes/delete_a_file_that_does_not_already_exist.rb +22 -0
  152. data/features/data/cookbooks/manage_files/recipes/manage_file_contents.rb +23 -0
  153. data/features/data/cookbooks/manage_files/recipes/set_the_accessibility_of_a_created_file.rb +79 -0
  154. data/features/data/cookbooks/manage_files/recipes/set_the_owner_of_a_created_file.rb +23 -0
  155. data/features/data/cookbooks/manage_files/recipes/touch_a_file.rb +22 -0
  156. data/features/data/cookbooks/metadata/metadata.rb +17 -0
  157. data/features/data/cookbooks/metadata/recipes/default.rb +18 -0
  158. data/features/data/cookbooks/no_attributes/README.rdoc +8 -0
  159. data/features/data/cookbooks/no_attributes/metadata.rb +6 -0
  160. data/features/data/cookbooks/no_attributes/recipes/default.rb +21 -0
  161. data/features/data/cookbooks/node_cookbook_sync/README.rdoc +8 -0
  162. data/features/data/cookbooks/node_cookbook_sync/attributes/attr_file.rb +0 -0
  163. data/features/data/cookbooks/node_cookbook_sync/definitions/def_file.rb +0 -0
  164. data/features/data/cookbooks/node_cookbook_sync/libraries/lib_file.rb +0 -0
  165. data/features/data/cookbooks/node_cookbook_sync/metadata.rb +6 -0
  166. data/features/data/cookbooks/node_cookbook_sync/recipes/default.rb +18 -0
  167. data/features/data/cookbooks/packages/recipes/default.rb +0 -0
  168. data/features/data/cookbooks/packages/recipes/gem_package.rb +26 -0
  169. data/features/data/cookbooks/packages/recipes/install_apt_package.rb +3 -0
  170. data/features/data/cookbooks/packages/recipes/install_dpkg_package.rb +4 -0
  171. data/features/data/cookbooks/packages/recipes/install_gem_noshell.rb +26 -0
  172. data/features/data/cookbooks/packages/recipes/install_gem_package_twice.rb +26 -0
  173. data/features/data/cookbooks/packages/recipes/macports_install_bad_package.rb +3 -0
  174. data/features/data/cookbooks/packages/recipes/macports_install_yydecode.rb +3 -0
  175. data/features/data/cookbooks/packages/recipes/macports_purge_yydecode.rb +3 -0
  176. data/features/data/cookbooks/packages/recipes/macports_remove_yydecode.rb +3 -0
  177. data/features/data/cookbooks/packages/recipes/macports_upgrade_yydecode.rb +7 -0
  178. data/features/data/cookbooks/packages/recipes/manually_upgrade_gem_package.rb +32 -0
  179. data/features/data/cookbooks/packages/recipes/upgrade_gem_noshell.rb +33 -0
  180. data/features/data/cookbooks/packages/recipes/upgrade_gem_package.rb +33 -0
  181. data/features/data/cookbooks/recipe_include/README.rdoc +8 -0
  182. data/features/data/cookbooks/recipe_include/metadata.rb +6 -0
  183. data/features/data/cookbooks/recipe_include/recipes/default.rb +21 -0
  184. data/features/data/cookbooks/recipe_include/recipes/second.rb +23 -0
  185. data/features/data/cookbooks/roles/recipes/default.rb +26 -0
  186. data/features/data/cookbooks/roles/recipes/env_test.rb +25 -0
  187. data/features/data/cookbooks/run_interval/recipes/default.rb +27 -0
  188. data/features/data/cookbooks/scm/metadata.rb +8 -0
  189. data/features/data/cookbooks/scm/recipes/git.rb +25 -0
  190. data/features/data/cookbooks/search/attributes/search_attrs.rb +1 -0
  191. data/features/data/cookbooks/search/recipes/default.rb +18 -0
  192. data/features/data/cookbooks/search/recipes/search_data.rb +28 -0
  193. data/features/data/cookbooks/search/recipes/search_data_manual.rb +33 -0
  194. data/features/data/cookbooks/search/recipes/search_data_noblock.rb +32 -0
  195. data/features/data/cookbooks/show_cookbook/README.rdoc +8 -0
  196. data/features/data/cookbooks/show_cookbook/attributes/attr_file.rb +0 -0
  197. data/features/data/cookbooks/show_cookbook/definitions/def_file.rb +0 -0
  198. data/features/data/cookbooks/show_cookbook/files/default/prime_time.txt +0 -0
  199. data/features/data/cookbooks/show_cookbook/files/host-latte/prime_time.txt +0 -0
  200. data/features/data/cookbooks/show_cookbook/files/mac_os_x-10.5/prime_time.txt +0 -0
  201. data/features/data/cookbooks/show_cookbook/files/mac_os_x/prime_time.txt +0 -0
  202. data/features/data/cookbooks/show_cookbook/libraries/lib_file.rb +0 -0
  203. data/features/data/cookbooks/show_cookbook/metadata.rb +6 -0
  204. data/features/data/cookbooks/show_cookbook/recipes/default.rb +18 -0
  205. data/features/data/cookbooks/show_cookbook/templates/default/prime_time.txt.erb +0 -0
  206. data/features/data/cookbooks/show_cookbook/templates/host-latte/prime_time.txt.erb +0 -0
  207. data/features/data/cookbooks/show_cookbook/templates/mac_os_x-10.5/prime_time.txt.erb +0 -0
  208. data/features/data/cookbooks/show_cookbook/templates/mac_os_x/prime_time.txt.erb +0 -0
  209. data/features/data/cookbooks/synchronize/recipes/default.rb +18 -0
  210. data/features/data/cookbooks/synchronize_deps/metadata.json +30 -0
  211. data/features/data/cookbooks/synchronize_deps/metadata.rb +1 -0
  212. data/features/data/cookbooks/synchronize_deps/recipes/default.rb +18 -0
  213. data/features/data/cookbooks/template/README.rdoc +8 -0
  214. data/features/data/cookbooks/template/metadata.rb +6 -0
  215. data/features/data/cookbooks/template/recipes/default.rb +26 -0
  216. data/features/data/cookbooks/template/recipes/interval.rb +37 -0
  217. data/features/data/cookbooks/template/recipes/render_node_attrs.rb +26 -0
  218. data/features/data/cookbooks/template/templates/default/node.txt.erb +3 -0
  219. data/features/data/cookbooks/template/templates/default/template.txt.erb +1 -0
  220. data/features/data/cookbooks/transfer_remote_directories/files/default/transfer_directory_feature/bar.txt +1 -0
  221. data/features/data/cookbooks/transfer_remote_directories/files/default/transfer_directory_feature/baz.txt +1 -0
  222. data/features/data/cookbooks/transfer_remote_directories/files/default/transfer_directory_feature/foo.txt +1 -0
  223. data/features/data/cookbooks/transfer_remote_directories/recipes/transfer_directory.rb +29 -0
  224. data/features/data/cookbooks/transfer_remote_files/files/default/transfer_a_file_from_a_cookbook.txt +1 -0
  225. data/features/data/cookbooks/transfer_remote_files/metadata.json +30 -0
  226. data/features/data/cookbooks/transfer_remote_files/metadata.rb +1 -0
  227. data/features/data/cookbooks/transfer_remote_files/recipes/change_remote_file_perms_trickery.rb +33 -0
  228. data/features/data/cookbooks/transfer_remote_files/recipes/default.rb +18 -0
  229. data/features/data/cookbooks/transfer_remote_files/recipes/should_prefer_the_file_for_this_specific_host.rb +22 -0
  230. data/features/data/cookbooks/transfer_remote_files/recipes/transfer_a_file_from_a_cookbook.rb +22 -0
  231. data/features/data/cookbooks/transfer_remote_files/recipes/transfer_a_file_from_a_specific_cookbook.rb +20 -0
  232. data/features/data/cookbooks/transfer_remote_files/recipes/transfer_a_non-existent_file_from_a_cookbook.rb +22 -0
  233. data/features/data/cookbooks/transfer_remote_files_definition/definitions/transfer.rb +6 -0
  234. data/features/data/cookbooks/transfer_remote_files_definition/files/default/easy.txt +1 -0
  235. data/features/data/cookbooks/transfer_some_cookbook_files/files/default/should_be_transferred.txt +3 -0
  236. data/features/data/cookbooks/transfer_some_cookbook_files/files/default/should_not_be_transferred.txt +2 -0
  237. data/features/data/cookbooks/transfer_some_cookbook_files/recipes/default.rb +26 -0
  238. data/features/data/cookbooks/transfer_some_cookbook_files/templates/default/should_be_transferred.erb +2 -0
  239. data/features/data/cookbooks/transfer_some_cookbook_files/templates/default/should_not_be_transferred.erb +3 -0
  240. data/features/data/cookbooks/version_deps/metadata.rb +1 -0
  241. data/features/data/cookbooks/version_deps/recipes/default.rb +1 -0
  242. data/features/data/cookbooks/versions/metadata.rb +5 -0
  243. data/features/data/cookbooks/versions/recipes/default.rb +5 -0
  244. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_1.0.0/metadata.json +31 -0
  245. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_1.0.0/metadata.rb +8 -0
  246. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_1.0.0/recipes/default.rb +18 -0
  247. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_2.0.0/metadata.json +29 -0
  248. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_2.0.0/metadata.rb +6 -0
  249. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_2.0.0/recipes/default.rb +18 -0
  250. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_3.0.0/metadata.json +30 -0
  251. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_3.0.0/metadata.rb +7 -0
  252. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_a_3.0.0/recipes/default.rb +18 -0
  253. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_1.0.0/metadata.json +31 -0
  254. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_1.0.0/metadata.rb +8 -0
  255. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_1.0.0/recipes/default.rb +18 -0
  256. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_2.0.0/metadata.json +31 -0
  257. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_2.0.0/metadata.rb +8 -0
  258. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_2.0.0/recipes/default.rb +18 -0
  259. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_3.0.0/metadata.json +30 -0
  260. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_3.0.0/metadata.rb +7 -0
  261. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_b_3.0.0/recipes/default.rb +18 -0
  262. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_1.0.0/metadata.json +31 -0
  263. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_1.0.0/metadata.rb +8 -0
  264. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_1.0.0/recipes/default.rb +18 -0
  265. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_2.0.0/metadata.json +29 -0
  266. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_2.0.0/metadata.rb +6 -0
  267. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_2.0.0/recipes/default.rb +18 -0
  268. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_3.0.0/metadata.json +29 -0
  269. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_3.0.0/metadata.rb +6 -0
  270. data/features/data/cookbooks_not_uploaded_at_feature_start/dep_test_c_3.0.0/recipes/default.rb +18 -0
  271. data/features/data/cookbooks_not_uploaded_at_feature_start/test_cookbook/attributes/attr1.rb +1 -0
  272. data/features/data/cookbooks_not_uploaded_at_feature_start/test_cookbook/attributes/attr2.rb +1 -0
  273. data/features/data/cookbooks_not_uploaded_at_feature_start/test_cookbook/recipes/default.rb +2 -0
  274. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_invalid_empty_except_metadata/metadata.json +38 -0
  275. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_invalid_empty_except_metadata/metadata.rb +6 -0
  276. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_invalid_nometadata/attributes/attributes.rb +1 -0
  277. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_invalid_nometadata/recipes/default.rb +2 -0
  278. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid/attributes/attributes.rb +1 -0
  279. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid/metadata.json +38 -0
  280. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid/metadata.rb +6 -0
  281. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid/recipes/default.rb +2 -0
  282. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.1.0_with_different_dependencies/attributes/attributes.rb +1 -0
  283. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.1.0_with_different_dependencies/metadata.json +40 -0
  284. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.1.0_with_different_dependencies/metadata.rb +7 -0
  285. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.1.0_with_different_dependencies/recipes/default.rb +2 -0
  286. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.2.0/attributes/attributes.rb +1 -0
  287. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.2.0/metadata.json +38 -0
  288. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.2.0/metadata.rb +6 -0
  289. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_valid_v0.2.0/recipes/default.rb +2 -0
  290. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_wrong_metadata/metadata.json +40 -0
  291. data/features/data/cookbooks_not_uploaded_at_feature_start/testcookbook_wrong_metadata/recipes/default.rb +1 -0
  292. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.1.0/metadata.json +39 -0
  293. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.1.0/metadata.rb +6 -0
  294. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.1.0/recipes/default.rb +18 -0
  295. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.1.1/metadata.json +39 -0
  296. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.1.1/metadata.rb +6 -0
  297. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.1.1/recipes/default.rb +18 -0
  298. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.10.0/metadata.json +39 -0
  299. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.10.0/metadata.rb +6 -0
  300. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.10.0/recipes/default.rb +18 -0
  301. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.2.0/metadata.json +39 -0
  302. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.2.0/metadata.rb +6 -0
  303. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.2.0/recipes/default.rb +18 -0
  304. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.9.0/metadata.json +39 -0
  305. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.9.0/metadata.rb +6 -0
  306. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.9.0/recipes/default.rb +18 -0
  307. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.9.7/metadata.json +39 -0
  308. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.9.7/metadata.rb +6 -0
  309. data/features/data/cookbooks_not_uploaded_at_feature_start/version_test_0.9.7/recipes/default.rb +18 -0
  310. data/features/data/cookbooks_not_uploaded_at_feature_start/version_updated/attributes/attributes.rb +1 -0
  311. data/features/data/cookbooks_not_uploaded_at_feature_start/version_updated/metadata.json +29 -0
  312. data/features/data/cookbooks_not_uploaded_at_feature_start/version_updated/metadata.rb +6 -0
  313. data/features/data/cookbooks_not_uploaded_at_feature_start/version_updated/recipes/default.rb +2 -0
  314. data/features/data/cookbooks_not_uploaded_at_feature_start/versions/metadata.json +38 -0
  315. data/features/data/cookbooks_not_uploaded_at_feature_start/versions/metadata.rb +5 -0
  316. data/features/data/cookbooks_not_uploaded_at_feature_start/versions/recipes/default.rb +5 -0
  317. data/features/data/gems/Marshal.4.8 +0 -0
  318. data/features/data/gems/Marshal.4.8.Z +0 -0
  319. data/features/data/gems/latest_specs.4.8 +0 -0
  320. data/features/data/gems/latest_specs.4.8.gz +0 -0
  321. data/features/data/gems/prerelease_specs.4.8 +0 -0
  322. data/features/data/gems/prerelease_specs.4.8.gz +0 -0
  323. data/features/data/gems/quick/Marshal.4.8/chef-integration-test-0.1.0.gemspec.rz +0 -0
  324. data/features/data/gems/quick/Marshal.4.8/chef-integration-test-0.1.1.gemspec.rz +0 -0
  325. data/features/data/gems/quick/chef-integration-test-0.1.0.gemspec.rz +0 -0
  326. data/features/data/gems/quick/chef-integration-test-0.1.1.gemspec.rz +0 -0
  327. data/features/data/gems/quick/index +2 -0
  328. data/features/data/gems/quick/index.rz +0 -0
  329. data/features/data/gems/quick/latest_index +1 -0
  330. data/features/data/gems/quick/latest_index.rz +0 -0
  331. data/features/data/gems/specs.4.8 +0 -0
  332. data/features/data/gems/specs.4.8.gz +0 -0
  333. data/features/data/gems/yaml +122 -0
  334. data/features/data/gems/yaml.Z +0 -0
  335. data/features/data/json_attribs/attribute_settings.json +3 -0
  336. data/features/data/json_attribs/json_runlist_and_attrs.json +4 -0
  337. data/features/data/myapp.bundle +0 -0
  338. data/features/data/node-load-test.rb +84 -0
  339. data/features/data/node-simple.rb +18 -0
  340. data/features/data/repositories/chef-repo/.gitignore +2 -0
  341. data/features/data/repositories/chef-repo/README.md +66 -0
  342. data/features/data/repositories/chef-repo/Rakefile +65 -0
  343. data/features/data/repositories/chef-repo/certificates/README.md +19 -0
  344. data/features/data/repositories/chef-repo/config/rake.rb +38 -0
  345. data/features/data/repositories/chef-repo/cookbooks/README.md +53 -0
  346. data/features/data/repositories/chef-repo/data_bags/README.md +23 -0
  347. data/features/data/repositories/chef-repo/roles/README.md +16 -0
  348. data/features/data/repositories/cookbooks/hosts/attributes/hosts.rb +1 -0
  349. data/features/data/repositories/cookbooks/hosts/cc.gemspec +36 -0
  350. data/features/data/repositories/cookbooks/hosts/metadata.json +41 -0
  351. data/features/data/repositories/cookbooks/hosts/metadata.rb +4 -0
  352. data/features/data/repositories/cookbooks/hosts/recipes/default.rb +6 -0
  353. data/features/data/repositories/cookbooks/hosts/templates/default/hosts.erb +27 -0
  354. data/features/data/search-tests/do_knife_search_test.rb +175 -0
  355. data/features/data/search-tests/search-test-nodes.rb +174 -0
  356. data/features/data/test_git_repo.tar.gz +0 -0
  357. data/features/file_steps.feature +70 -0
  358. data/features/files.feature +30 -16
  359. data/features/ssh.feature +2 -1
  360. data/features/ssh_steps.feature +20 -0
  361. data/features/step_definitions/cuken_steps.rb +10 -0
  362. data/features/support/env.rb +1 -0
  363. data/lib/cuken/api/chef.rb +115 -0
  364. data/lib/cuken/api/chef/common.rb +80 -0
  365. data/lib/cuken/api/file.rb +23 -3
  366. data/lib/cuken/chef.rb +3 -0
  367. data/lib/cuken/common.rb +0 -1
  368. data/lib/cuken/cucumber/chef.rb +16 -0
  369. data/lib/cuken/cucumber/chef/common.rb +68 -0
  370. data/lib/cuken/cucumber/chef/cookbook.rb +75 -0
  371. data/lib/cuken/cucumber/chef/cookbook_steps.rb +406 -0
  372. data/lib/cuken/cucumber/chef/deploy_steps.rb +84 -0
  373. data/lib/cuken/cucumber/chef/done_directory_steps.rb +41 -0
  374. data/lib/cuken/cucumber/chef/done_file_steps.rb +107 -0
  375. data/lib/cuken/cucumber/chef/done_knife_steps.rb +34 -0
  376. data/lib/cuken/cucumber/chef/fixture_steps.rb +413 -0
  377. data/lib/cuken/cucumber/chef/knife.rb +34 -0
  378. data/lib/cuken/cucumber/chef/node.rb +27 -0
  379. data/lib/cuken/cucumber/chef/node_steps.rb +88 -0
  380. data/lib/cuken/cucumber/chef/packages.rb +144 -0
  381. data/lib/cuken/cucumber/chef/pending_steps.rb +21 -0
  382. data/lib/cuken/cucumber/chef/recipe_steps.rb +23 -0
  383. data/lib/cuken/cucumber/chef/request_steps.rb +98 -0
  384. data/lib/cuken/cucumber/chef/response_steps.rb +233 -0
  385. data/lib/cuken/cucumber/chef/result_steps.rb +15 -0
  386. data/lib/cuken/cucumber/chef/run_client_steps.rb +260 -0
  387. data/lib/cuken/cucumber/chef/run_solo.rb +78 -0
  388. data/lib/cuken/cucumber/chef/sandbox_steps.rb +137 -0
  389. data/lib/cuken/cucumber/chef/search_steps.rb +70 -0
  390. data/lib/cuken/cucumber/chef/webrat_steps.rb +39 -0
  391. data/lib/cuken/cucumber/cmd.rb +18 -1
  392. data/lib/cuken/cucumber/common.rb +4 -0
  393. data/lib/cuken/cucumber/file.rb +25 -27
  394. data/lib/cuken/cucumber/ssh.rb +6 -6
  395. metadata +427 -27
  396. data/LICENSE.txt +0 -20
@@ -0,0 +1,84 @@
1
+ require 'chef/shell_out'
2
+
3
+
4
+ # Given /^I have a clone of typo in the data\/tmp dir$/ do
5
+ # cmd = "git clone #{datadir}/typo.bundle #{tmpdir}/gitrepo/typo"
6
+ # `#{cmd}`
7
+ # end
8
+ def gem_installed?(gem_name, version)
9
+ cmd = "gem list -i #{gem_name} -v #{version}"
10
+ `#{cmd}`=~ /true/ ? true : false
11
+ end
12
+
13
+
14
+ Given /^I have a clone of the rails app in the data\/tmp dir$/ do
15
+ cmd = "git clone #{datadir}/myapp.bundle #{tmpdir}/gitrepo/myapp"
16
+ `#{cmd}`
17
+ end
18
+
19
+ Given /^that I have '(.*)' '(.*)' installed$/ do |gem_name, version|
20
+ unless gem_installed?(gem_name, version)
21
+ pending "This Cucumber feature will not execute, as #{gem_name} #{version} is not installed."
22
+ end
23
+ end
24
+
25
+ Given /^a test git repo in the temp directory$/ do
26
+ test_git_repo_tarball_filename = "#{datadir}/test_git_repo.tar.gz"
27
+ cmd = Chef::ShellOut.new("tar xzvf #{test_git_repo_tarball_filename} -C #{tmpdir}")
28
+ cmd.run_command.exitstatus.should == 0
29
+ end
30
+
31
+ Then /^I should hear about it$/ do
32
+ puts "==deploy:"
33
+ puts `ls #{tmpdir}/deploy/`
34
+ puts "==Releases:"
35
+ puts `ls #{tmpdir}/deploy/releases/`
36
+ puts "==Releases/*/"
37
+ puts `ls #{tmpdir}/deploy/releases/*/`
38
+ puts "==Releases/*/db"
39
+ puts `ls #{tmpdir}/deploy/releases/*/db/`
40
+ puts "==Releases/*/config/"
41
+ puts `ls #{tmpdir}/deploy/releases/*/config/`
42
+ puts "==current:"
43
+ puts `ls #{tmpdir}/deploy/current/`
44
+ puts "==current/db:"
45
+ puts `ls #{tmpdir}/deploy/current/db/`
46
+ puts "==current/deploy:"
47
+ puts `ls #{tmpdir}/deploy/current/deploy/`
48
+ puts "==current/app:"
49
+ puts `ls #{tmpdir}/deploy/current/app/`
50
+ puts "==current/config:"
51
+ puts `ls #{tmpdir}/deploy/current/config/`
52
+ puts "==shared/config/app_config.yml"
53
+ puts `ls #{tmpdir}/deploy/shared/config/`
54
+ end
55
+
56
+ Then /^there should be '(.*)' releases?$/ do |n|
57
+ numnums = {"one" => 1, "two" => 2, "three" => 3}
58
+ n = numnums.has_key?(n) ? numnums[n] : n.to_i
59
+ @releases = Dir.glob(tmpdir + "/deploy/releases/*")
60
+ @releases.size.should eql(n)
61
+ end
62
+
63
+ Then /^a callback named <callback_file> should exist$/ do |callback_files|
64
+ callback_files.raw.each do |file|
65
+ want_file = "deploy/current/deploy/#{file.first}"
66
+ Then "a file named '#{want_file}' should exist"
67
+ end
68
+ end
69
+
70
+ Then /^the callback named <callback> should have run$/ do |callback_files|
71
+ callback_files.raw.each do |file|
72
+ hook_name = file.first.gsub(/\.rb$/, "")
73
+ evidence_file = "deploy/current/app/" + hook_name
74
+ expected_contents = {"hook_name" => hook_name, "env" => "production"}
75
+ actual_contents = Chef::JSONCompat.from_json(IO.read(File.join(tmpdir, evidence_file)))
76
+ expected_contents.should == actual_contents
77
+ end
78
+ end
79
+
80
+ Then /^the second chef run should have skipped deployment$/ do
81
+ expected_deploy = "#{tmpdir}/deploy/releases/62c9979f6694612d9659259f8a68d71048ae9a5b"
82
+ Then "'stdout' should not have 'INFO: Already deployed app at #{expected_deploy}. Rolling back to it - use action :force_deploy to re-checkout this revision.'"
83
+ end
84
+
@@ -0,0 +1,41 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ #Then /^a directory named '(.+)' should exist$/ do |dir|
20
+ # File.directory?(File.join(tmpdir, dir)).should be(true)
21
+ #end
22
+ #
23
+ #Then /^a directory named '(.+)' should not exist$/ do |dir|
24
+ # File.directory?(File.join(tmpdir, dir)).should be(false)
25
+ #end
26
+
27
+ #Then /^the directory named '(.+)' should be owned by '(.+)'$/ do |dirname, owner|
28
+ # uid = Etc.getpwnam(owner).uid
29
+ # cstats = File.stat(File.join(tmpdir, dirname))
30
+ # cstats.uid.should == uid
31
+ #end
32
+
33
+ #Then /^the directory named '(.+)' should have octal mode '(.+)'$/ do |dirname, expected_mode|
34
+ # cstats = File.stat(File.join(tmpdir, dirname))
35
+ # (cstats.mode & 007777).should == expected_mode.oct
36
+ #end
37
+
38
+ #Then /^the directory named '(.+)' should have decimal mode '(.+)'$/ do |dirname, expected_mode|
39
+ # cstats = File.stat(File.join(tmpdir, dirname))
40
+ # (cstats.mode & 007777).should == expected_mode.to_i
41
+ #end
@@ -0,0 +1,107 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'etc'
20
+
21
+ ###
22
+ # Given
23
+ ###
24
+
25
+ #Given /^we have an empty file named '(.+)'$/ do |filename|
26
+ # filename = File.new(File.join(tmpdir, filename), 'w')
27
+ # filename.close
28
+ #end
29
+
30
+ #Given /^we have an empty file named '(.+)' in the client cache$/ do |filename|
31
+ # cache_dir = File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "tmp", "cache"))
32
+ # filename = File.new(File.join(cache_dir, filename), 'w')
33
+ # filename.close
34
+ #end
35
+
36
+ #Given /^we have the atime\/mtime of '(.+)'$/ do |filename|
37
+ # @mtime = File.mtime(File.join(tmpdir, filename))
38
+ # @atime = File.atime(File.join(tmpdir, filename))
39
+ #end
40
+
41
+ ####
42
+ # Then
43
+ ####
44
+
45
+ #Then /^a file named '(.+)' should exist$/ do |filename|
46
+ # File.exists?(File.join(tmpdir, filename)).should be(true)
47
+ #end
48
+
49
+ #Then /^a file named '(.+)' should not exist$/ do |filename|
50
+ # File.exists?(File.join(tmpdir, filename)).should be(false)
51
+ #end
52
+
53
+ #currently using absolute path (specified in recipe execute_commands/recipes/umask.rb)
54
+ #Then /^'(.+)' should exist and raise error when copying$/ do |filename|
55
+ # File.exists?(filename).should be(true)
56
+ # lambda{copy(filename, filename + "_copy", false)}.should raise_error()
57
+ # File.delete(filename)
58
+ #end
59
+
60
+
61
+ #Then /^the (.)time of '(.+)' should be different$/ do |time_type, filename|
62
+ # case time_type
63
+ # when "m"
64
+ # current_mtime = File.mtime(File.join(tmpdir, filename))
65
+ # current_mtime.should_not == @mtime
66
+ # when "a"
67
+ # current_atime = File.atime(File.join(tmpdir, filename))
68
+ # current_atime.should_not == @atime
69
+ # end
70
+ #end
71
+
72
+ #Then /^a file named '(.+)' should contain '(.+)'$/ do |filename, contents|
73
+ # file = IO.read(File.join(tmpdir, filename))
74
+ # file.should =~ /#{contents}/m
75
+ #end
76
+
77
+ #Then /^a file named '(.+)' should be from the '(.+)' specific directory$/ do |filename, specificity|
78
+ # file = IO.read(File.join(tmpdir, filename))
79
+ # file.should == "#{specificity}\n"
80
+ #end
81
+
82
+ #Then /^a file named '(.+)' should contain '(.+)' only '(.+)' time$/ do |filename, string, count|
83
+ # seen_count = 0
84
+ # IO.foreach(File.join(tmpdir, filename)) do |line|
85
+ # if line =~ /#{string}/
86
+ # seen_count += 1
87
+ # end
88
+ # end
89
+ # seen_count.should == count.to_i
90
+ #end
91
+ #
92
+ #Then /^the file named '(.+)' should be owned by '(.+)'$/ do |filename, owner|
93
+ # uid = Etc.getpwnam(owner).uid
94
+ # cstats = File.stat(File.join(tmpdir, filename))
95
+ # cstats.uid.should == uid
96
+ #end
97
+ #
98
+ #Then /^the file named '(.+)' should have octal mode '(.+)'$/ do |filename, expected_mode|
99
+ # cstats = File.stat(File.join(tmpdir, filename))
100
+ # (cstats.mode & 007777).should == expected_mode.oct
101
+ #end
102
+ #
103
+ #Then /^the file named '(.+)' should have decimal mode '(.+)'$/ do |filename, expected_mode|
104
+ # cstats = File.stat(File.join(tmpdir, filename))
105
+ # (cstats.mode & 007777).should == expected_mode.to_i
106
+ #end
107
+ #
@@ -0,0 +1,34 @@
1
+ #When "I upload the '$cookbook_name' cookbook with knife" do |cookbook_name|
2
+ # cookbook_fixture = File.join(FEATURES_DATA, "cookbooks_not_uploaded_at_feature_start", cookbook_name)
3
+ # cookbook_dir = ::Tempfile.open("knife-cuke-cookbook-dir").path
4
+ # FileUtils.rm(cookbook_dir)
5
+ # FileUtils.mkdir_p(cookbook_dir)
6
+ # FileUtils.cp_r(cookbook_fixture, cookbook_dir)
7
+ # shell_out!("#{KNIFE_CMD} cookbook upload #{cookbook_name} -o #{cookbook_dir} -c #{KNIFE_CONFIG}")
8
+ #end
9
+ #
10
+ #When "I run knife '$knife_subcommand'" do |knife_subcommand|
11
+ # @knife_command_result = shell_out("#{KNIFE_CMD} #{knife_subcommand} -c #{KNIFE_CONFIG}")
12
+ #end
13
+ #
14
+ #RSpec::Matchers.define :be_successful do
15
+ # match do |shell_out_result|
16
+ # shell_out_result.status.success?
17
+ # end
18
+ # failure_message_for_should do |shell_out_result|
19
+ # "Expected command #{shell_out_result.command} to exit successfully, but it exited with status #{shell_out_result.exitstatus}.\n"\
20
+ # "STDOUT OUTPUT:\n#{shell_out_result.stdout}\nSTDERR OUTPUT:\n#{shell_out_result.stderr}\n"
21
+ # end
22
+ # failure_message_for_should_not do |shell_out_result|
23
+ # "Expected command #{shell_out_result.command} to fail, but it exited with status #{shell_out_result.exitstatus}.\n"\
24
+ # "STDOUT OUTPUT:\n#{shell_out_result.stdout}\nSTDERR OUTPUT:\n#{shell_out_result.stderr}\n"
25
+ # end
26
+ # description do
27
+ # "The shell out command should exit 0"
28
+ # end
29
+ #end
30
+ #
31
+ #Then /^knife should succeed$/ do
32
+ # @knife_command_result.should be_successful
33
+ #end
34
+ #
@@ -0,0 +1,413 @@
1
+
2
+ require 'ostruct'
3
+
4
+ Before do
5
+ @fixtures = {
6
+ 'client' => {
7
+ 'isis' => Proc.new do
8
+ c = Chef::ApiClient.new
9
+ c.name "isis"
10
+ c.create_keys
11
+ c
12
+ end,
13
+ 'isis_update' => {
14
+ 'name' => 'isis',
15
+ 'private_key' => true
16
+ },
17
+ 'neurosis' => Proc.new do
18
+ c = Chef::ApiClient.new
19
+ c.name "neurosis"
20
+ c.create_keys
21
+ c
22
+ end,
23
+ 'adminmonkey' => Proc.new do
24
+ c = Chef::ApiClient.new
25
+ c.name "adminmonkey"
26
+ c.admin true
27
+ c.create_keys
28
+ c
29
+ end
30
+ },
31
+ 'sandbox' => {
32
+ # The filename part of these 'checksums' hashes isn't used by the API (the
33
+ # value side of that hash is ignored), and is here for documentation's sake.
34
+ 'sandbox1' => {
35
+ :checksums => {
36
+ Chef::CookbookVersion.checksum_cookbook_file(File.join(datadir, "cookbooks_not_uploaded_at_feature_start", "test_cookbook", "recipes", "default.rb")) => nil
37
+ },
38
+ },
39
+ 'sandbox2' => {
40
+ :checksums => {
41
+ Chef::CookbookVersion.checksum_cookbook_file(File.join(datadir, "cookbooks_not_uploaded_at_feature_start", "test_cookbook", "attributes", "attr1.rb")) => nil,
42
+ Chef::CookbookVersion.checksum_cookbook_file(File.join(datadir, "cookbooks_not_uploaded_at_feature_start", "test_cookbook", "attributes", "attr2.rb")) => nil
43
+ },
44
+ },
45
+ },
46
+ 'sandbox_file' => {
47
+ "sandbox1_file1" => File.join(datadir, "cookbooks_not_uploaded_at_feature_start", "test_cookbook", "recipes", "default.rb"),
48
+
49
+ "sandbox2_file1" => File.join(datadir, "cookbooks_not_uploaded_at_feature_start", "test_cookbook", "attributes", "attr1.rb"),
50
+ "sandbox2_file2" => File.join(datadir, "cookbooks_not_uploaded_at_feature_start", "test_cookbook", "attributes", "attr2.rb"),
51
+ },
52
+ 'signing_caller' =>{
53
+ :user_id=>'bobo', :secret_key => "/tmp/poop.pem"
54
+ },
55
+ 'registration' => {
56
+ 'bobo' => Proc.new do
57
+ OpenStruct.new({ :save => true })
58
+ end,
59
+ 'not_admin' => Proc.new do
60
+ OpenStruct.new({ :save => true })
61
+ end
62
+ },
63
+ 'data_bag' => {
64
+ 'users' => Proc.new do
65
+ b = Chef::DataBag.new
66
+ b.name "users"
67
+ b
68
+ end,
69
+ 'rubies' => Proc.new do
70
+ b = Chef::DataBag.new
71
+ b.name "rubies"
72
+ b
73
+ end
74
+ },
75
+ 'data_bag_item' => {
76
+ 'francis' => Proc.new do
77
+ i = Chef::DataBagItem.new
78
+ i.data_bag "users"
79
+ i.raw_data = { "id" => "francis" }
80
+ i
81
+ end,
82
+ 'francis_extra' => Proc.new do
83
+ i = Chef::DataBagItem.new
84
+ i.data_bag "users"
85
+ i.raw_data = { "id" => "francis", "extra" => "majority" }
86
+ i
87
+ end,
88
+ 'axl_rose' => Proc.new do
89
+ i = Chef::DataBagItem.new
90
+ i.data_bag "users"
91
+ i.raw_data = { "id" => "axl_rose" }
92
+ i
93
+ end
94
+ },
95
+ 'role' => {
96
+ 'webserver' => Proc.new do
97
+ r = Chef::Role.new
98
+ r.name "webserver"
99
+ r.description "monkey"
100
+ r.env_run_lists({"cucumber" => ["role[db]"], "_default" => []})
101
+ r.run_list("role[webserver]", "role[base]")
102
+ r.default_attributes({ 'a' => 'b' })
103
+ r.override_attributes({ 'c' => 'd' })
104
+ r
105
+ end,
106
+ 'db' => Proc.new do
107
+ r = Chef::Role.new
108
+ r.name "db"
109
+ r.description "monkey"
110
+ r.recipes("role::db", "role::base")
111
+ r.default_attributes({ 'a' => 'bake' })
112
+ r.override_attributes({ 'c' => 'down' })
113
+ r
114
+ end,
115
+ 'role_not_exist' => Proc.new do
116
+ r = Chef::Role.new
117
+ r.name 'role_not_exist'
118
+ r.description "Non-existent nested role"
119
+ r.run_list << "role[not_exist]"
120
+ r
121
+ end,
122
+ 'attribute_settings_default' => Proc.new do
123
+ r = Chef::Role.new
124
+ r.name "attribute_settings_default"
125
+ r.description "sets a default value"
126
+ r.run_list("recipe[attribute_settings]")
127
+ r.default_attributes({ 'attribute_priority_was' => "came from role[attribute_settings_default] default attributes" })
128
+ r
129
+ end,
130
+ 'attribute_settings_override' => Proc.new do
131
+ r = Chef::Role.new
132
+ r.name "attribute_settings_override"
133
+ r.description "sets a default value"
134
+ r.run_list("recipe[attribute_settings_override]")
135
+ r.override_attributes({ 'attribute_priority_was' => "came from role[attribute_settings_override] override attributes" })
136
+ r
137
+ end,
138
+ 'role1_includes_role2' => Proc.new do
139
+ r = Chef::Role.new
140
+ r.name "role1_includes_role2"
141
+ r.description "role1 includes role2"
142
+ r.run_list("role[role2_included_by_role1]")
143
+ r
144
+ end,
145
+ 'role2_included_by_role1' => Proc.new do
146
+ r = Chef::Role.new
147
+ r.name "role2_included_by_role1"
148
+ r.description "role2 is included by role1"
149
+ r.run_list("recipe[attribute_settings_override]")
150
+ r
151
+ end,
152
+ 'role_test' => Proc.new do
153
+ r = Chef::Role.new
154
+ r.name "role_test"
155
+ r.description "A simple test role"
156
+ r.run_list("recipe[roles]")
157
+ r.default_attributes({
158
+ "reason" => "unbalancing",
159
+ "ossing" => "this time around"
160
+ })
161
+ r.override_attributes({
162
+ "ossining" => "whatever",
163
+ "snakes" => "on a plane"
164
+ })
165
+ r
166
+ end,
167
+ 'role_env_test' => Proc.new do
168
+ r = Chef::Role.new
169
+ r.name "role_env_test"
170
+ r.description "A simple test role with environment specific run list"
171
+ r.env_run_lists({
172
+ "_default" => [],
173
+ "cucumber" => ['recipe[roles::env_test]']
174
+ })
175
+ r.default_attributes({
176
+ "reason" => "unbalancing",
177
+ "ossining" => "this time around"
178
+ })
179
+ r.override_attributes({
180
+ "ossining" => "whatever",
181
+ "snakes" => "on a plane"
182
+ })
183
+ r
184
+ end
185
+ },
186
+ 'node' => {
187
+ 'opsmaster' => Proc.new do
188
+ n = Chef::Node.new
189
+ n.name 'opsmaster'
190
+ n.chef_environment 'production'
191
+ n.snakes "on a plane"
192
+ n.zombie "we're not unreasonable, I mean no-ones gonna eat your eyes"
193
+ n
194
+ end,
195
+ 'webserver' => Proc.new do
196
+ n = Chef::Node.new
197
+ n.name 'webserver'
198
+ n.run_list << "tacos"
199
+ n.snakes "on a plane"
200
+ n.zombie "we're not unreasonable, I mean no-ones gonna eat your eyes"
201
+ n
202
+ end,
203
+ 'dbserver' => Proc.new do
204
+ n = Chef::Node.new
205
+ n.name 'dbserver'
206
+ n.run_list << "oracle"
207
+ n.just "kidding - who uses oracle?"
208
+ n
209
+ end,
210
+ 'searchman' => Proc.new do
211
+ n = Chef::Node.new
212
+ n.name 'searchman'
213
+ n.run_list << "oracle"
214
+ n.default_attrs = { "one" => "two", "three" => "four" }
215
+ n.override_attrs = { "one" => "five" }
216
+ n.set["walking"] = "tall"
217
+ n
218
+ end,
219
+ 'sync' => Proc.new do
220
+ n = Chef::Node.new
221
+ n.name 'sync'
222
+ n.run_list << "node_cookbook_sync"
223
+ n
224
+ end,
225
+ 'role_not_exist' => Proc.new do
226
+ n = Chef::Node.new
227
+ n.name 'role_not_exist'
228
+ n.run_list << "role[not_exist]"
229
+ n
230
+ end,
231
+ 'paradise' => Proc.new do
232
+ n = Chef::Node.new
233
+ n.name 'paradise'
234
+ n.run_list << "version_test"
235
+ n
236
+ end,
237
+ 'has_environment' => Proc.new do
238
+ n = Chef::Node.new
239
+ n.name 'has_environment'
240
+ n.chef_environment 'cookbooks_test'
241
+ n.run_list << "version_test"
242
+ n
243
+ end,
244
+ 'really_deep_node' => Proc.new do
245
+ array = []
246
+ hash = {}
247
+ max_levels = 50
248
+
249
+ max_levels.times do |num_level|
250
+ array = [num_level, "really_deep_string_in_array", array]
251
+ hash = {"really_deep_string_in_hash_#{num_level}" => hash}
252
+ num_level += 1
253
+ end
254
+
255
+ n = Chef::Node.new
256
+ n.name 'really_deep_node'
257
+ n.run_list << "deep_node_recipe"
258
+ n.deep_array = array
259
+ n.deep_hash = hash
260
+ n
261
+ end,
262
+ 'empty' => Proc.new do
263
+ n = Chef::Node.new
264
+ n.name 'empty'
265
+ n
266
+ end
267
+ },
268
+ 'hash' => {
269
+ 'nothing' => Hash.new,
270
+ 'name only' => { :name => 'test_cookbook' }
271
+ },
272
+ 'environment' => {
273
+ 'cucumber' => Proc.new do
274
+ e = Chef::Environment.new
275
+ e.name 'cucumber'
276
+ e.description 'I like to run tests'
277
+ e.attributes({"attribute_priority_was" => "came from environment cucumber"})
278
+ e
279
+ end,
280
+ 'production' => Proc.new do
281
+ e = Chef::Environment.new
282
+ e.name 'production'
283
+ e.description 'The real deal'
284
+ e
285
+ end,
286
+ 'skynet' => Proc.new do
287
+ e = Chef::Environment.new
288
+ e.name 'skynet'
289
+ e.description 'test cookbook version constraints'
290
+ e.cookbook 'version_test', '> 0.1.0'
291
+ e
292
+ end,
293
+ 'chef-1607' => Proc.new do
294
+ e = Chef::Environment.new
295
+ e.name 'chef-1607'
296
+ e.description 'test cookbook version constraints'
297
+ e.cookbook 'version_test', '> 0.0.0'
298
+ e
299
+ end,
300
+ 'cookbooks-0.1.0' => Proc.new do
301
+ e = Chef::Environment.new
302
+ e.name 'cookbooks_test'
303
+ e.description 'use cookbook version 0.1.0'
304
+ e.cookbook 'version_test', '= 0.1.0'
305
+ e
306
+ end,
307
+ 'cookbooks-0.1.1' => Proc.new do
308
+ e = Chef::Environment.new
309
+ e.name 'cookbooks_test'
310
+ e.description 'use cookbook version 0.1.1'
311
+ e.cookbook 'version_test', '= 0.1.1'
312
+ e
313
+ end,
314
+ 'cookbooks-0.2.0' => Proc.new do
315
+ e = Chef::Environment.new
316
+ e.name 'cookbooks_test'
317
+ e.description 'use cookbook version 0.2.0'
318
+ e.cookbook 'version_test', '= 0.2.0'
319
+ e
320
+ end
321
+ }
322
+ }
323
+ @stash = {}
324
+ end
325
+
326
+ def sign_request(http_method, path, private_key, user_id, body = "")
327
+ timestamp = Time.now.utc.iso8601
328
+ sign_obj = Mixlib::Auth::SignedHeaderAuth.signing_object(
329
+ :http_method=>http_method,
330
+ :path=>path,
331
+ :body=>body,
332
+ :user_id=>user_id,
333
+ :timestamp=>timestamp)
334
+ signed = sign_obj.sign(private_key).merge({:host => "localhost"})
335
+ signed.inject({}){|memo, kv| memo["#{kv[0].to_s.upcase}"] = kv[1];memo}
336
+ end
337
+
338
+ def get_fixture(stash_name, stash_key)
339
+ fixy = @fixtures[stash_name][stash_key]
340
+ if fixy.kind_of?(Proc)
341
+ fixy.call
342
+ else
343
+ fixy
344
+ end
345
+ end
346
+
347
+ Given "I am a non admin client" do
348
+ r = Chef::REST.new(Chef::Config[:registration_url], Chef::Config[:validation_client_name], Chef::Config[:validation_key])
349
+ r.register("not_admin", "#{tmpdir}/not_admin.pem")
350
+ c = Chef::ApiClient.cdb_load("not_admin")
351
+ c.cdb_save
352
+ @rest = Chef::REST.new(Chef::Config[:registration_url], 'not_admin', "#{tmpdir}/not_admin.pem")
353
+ end
354
+
355
+ Given /^an? '(.+)' named '(.+)'$/ do |stash_name, stash_key|
356
+ # BUGBUG: I need to reference fixtures individually, but the fixtures, as written, store under the type, not the fixture's identifier and I don't currently have time to re-write the tests
357
+
358
+ key = case stash_name
359
+ when 'file','hash'
360
+ stash_key
361
+ else
362
+ stash_name
363
+ end
364
+ @stash[key] = get_fixture(stash_name, stash_key)
365
+ end
366
+
367
+ Given "I am an administrator" do
368
+ make_admin
369
+ end
370
+
371
+ Given "I am a non-admin" do
372
+ make_non_admin
373
+ end
374
+
375
+ Given /^an? '(.+)' named '(.+)' exists$/ do |stash_name, stash_key|
376
+ call_as_admin do
377
+ @stash[stash_name] = get_fixture(stash_name, stash_key)
378
+
379
+ #if @stash[stash_name].respond_to?(:cdb_save)
380
+ # @stash[stash_name].cdb_save
381
+ if @stash[stash_name].respond_to?(:save)
382
+ @stash[stash_name].save
383
+ else
384
+ request_path = "/#{stash_name.pluralize}"
385
+ request(request_path, {
386
+ :method => "POST",
387
+ "HTTP_ACCEPT" => 'application/json',
388
+ "CONTENT_TYPE" => 'application/json',
389
+ :input => Chef::JSONCompat.to_json(@stash[stash_name])
390
+ }.merge(sign_request("POST", request_path, OpenSSL::PKey::RSA.new(IO.read("#{tmpdir}/client.pem")), "bobo")))
391
+ end
392
+ end
393
+ end
394
+
395
+ Given /^sending the method '(.+)' to the '(.+)' with '(.+)'/ do |method, stash_name, update_value|
396
+ update_value = Chef::JSONCompat.from_json(update_value) if update_value =~ /^\[|\{/
397
+ @stash[stash_name].send(method.to_sym, update_value)
398
+ end
399
+
400
+ Given /^changing the '(.+)' field '(.+)' to '(.+)'$/ do |stash_name, stash_key, stash_value|
401
+ @stash[stash_name].send(stash_key.to_sym, stash_value)
402
+ end
403
+
404
+ Given /^removing the '(.+)' field '(.+)'$/ do |stash_name, key|
405
+ @stash[stash_name].send(key.to_sym, '')
406
+ end
407
+
408
+ Given /^there are no (.+)$/ do |stash_name|
409
+ end
410
+
411
+ Given /^I wait for '(\d+)' seconds$/ do |time|
412
+ sleep time.to_i
413
+ end