engineyard-serverside 2.8.0.pre4 → 2.8.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 (261) hide show
  1. checksums.yaml +4 -4
  2. data/features/enable_maintenance/step_definitions/enable_maintenance_steps.rb +43 -0
  3. data/features/hook/running-a-deploy-hook.feature +277 -0
  4. data/features/hook/step_definitions/running-a-deploy-hook-steps.rb +200 -0
  5. data/features/step_definitions/app_steps.rb +10 -0
  6. data/features/step_definitions/command_steps.rb +8 -0
  7. data/features/step_definitions/server_steps.rb +14 -0
  8. data/features/step_definitions/version_steps.rb +5 -0
  9. data/features/support/env.rb +63 -0
  10. data/features/support/error_codes.rb +17 -0
  11. data/features/support/fs_helpers.rb +82 -0
  12. data/features/support/output_helpers.rb +7 -0
  13. data/features/support/runner.rb +41 -0
  14. data/features/version.feature +7 -0
  15. data/lib/engineyard-serverside/cli/app.rb +6 -0
  16. data/lib/engineyard-serverside/shell.rb +38 -10
  17. data/lib/engineyard-serverside/version.rb +1 -1
  18. data/spec/engineyard-serverside/callbacks/collection/combined_spec.rb +232 -0
  19. data/spec/engineyard-serverside/callbacks/collection/deploy_hooks_spec.rb +170 -0
  20. data/spec/engineyard-serverside/callbacks/collection/service_hooks/collection_spec.rb +171 -0
  21. data/spec/engineyard-serverside/callbacks/collection/service_hooks/combined_spec.rb +174 -0
  22. data/spec/engineyard-serverside/callbacks/collection/service_hooks_spec.rb +31 -0
  23. data/spec/engineyard-serverside/callbacks/collection_spec.rb +49 -0
  24. data/spec/engineyard-serverside/callbacks/distributor/remote_spec.rb +135 -0
  25. data/spec/engineyard-serverside/callbacks/distributor/viability_filter_spec.rb +208 -0
  26. data/spec/engineyard-serverside/callbacks/distributor_spec.rb +43 -0
  27. data/spec/engineyard-serverside/callbacks/executor/executable_spec.rb +386 -0
  28. data/spec/engineyard-serverside/callbacks/executor/ruby/context_spec.rb +538 -0
  29. data/spec/engineyard-serverside/callbacks/executor/ruby/executor_spec.rb +313 -0
  30. data/spec/engineyard-serverside/callbacks/executor/ruby_spec.rb +35 -0
  31. data/spec/engineyard-serverside/callbacks/executor_spec.rb +45 -0
  32. data/spec/engineyard-serverside/callbacks_spec.rb +31 -0
  33. data/spec/engineyard-serverside/cli/workflows/base_spec.rb +237 -0
  34. data/spec/engineyard-serverside/cli/workflows/calling_deploy_hooks_spec.rb +65 -0
  35. data/spec/engineyard-serverside/cli/workflows/deploying_applications_spec.rb +61 -0
  36. data/spec/engineyard-serverside/cli/workflows/disabling_maintenance_spec.rb +61 -0
  37. data/spec/engineyard-serverside/cli/workflows/enabling_maintenance_spec.rb +61 -0
  38. data/spec/engineyard-serverside/cli/workflows/helpers_spec.rb +64 -0
  39. data/spec/engineyard-serverside/cli/workflows/rolling_back_applications_spec.rb +61 -0
  40. data/spec/engineyard-serverside/cli/workflows/showing_maintenance_status_spec.rb +60 -0
  41. data/spec/engineyard-serverside/cli/workflows_spec.rb +87 -0
  42. data/spec/engineyard-serverside/dependency_manager/base_spec.rb +139 -0
  43. data/spec/engineyard-serverside/paths_spec.rb +820 -0
  44. data/spec/engineyard-serverside/propagator_spec.rb +56 -0
  45. data/spec/engineyard-serverside/server_spec.rb +390 -0
  46. data/spec/engineyard-serverside/shell/helpers_spec.rb +98 -0
  47. data/spec/engineyard-serverside/shell/yieldio_spec.rb +33 -0
  48. data/spec/engineyard-serverside/shell_spec.rb +543 -0
  49. data/spec/engineyard-serverside/slug/distributor_spec.rb +199 -0
  50. data/spec/engineyard-serverside/slug/enabler_spec.rb +191 -0
  51. data/spec/engineyard-serverside/slug/failure_handler_spec.rb +114 -0
  52. data/spec/engineyard-serverside/slug/finalizer_spec.rb +191 -0
  53. data/spec/engineyard-serverside/slug/generator_spec.rb +82 -0
  54. data/spec/engineyard-serverside/slug/migrator_spec.rb +137 -0
  55. data/spec/engineyard-serverside/slug/restarter_spec.rb +226 -0
  56. data/spec/engineyard-serverside/slug/source/updater_spec.rb +710 -0
  57. data/spec/engineyard-serverside/slug/source_spec.rb +40 -0
  58. data/spec/engineyard-serverside/source_spec.rb +171 -0
  59. data/spec/railway_spec.rb +130 -0
  60. data/spec/result/failure_spec.rb +113 -0
  61. data/spec/result/success_spec.rb +109 -0
  62. data/spec/result_spec.rb +23 -0
  63. data/spec/spec_helper.rb +3 -349
  64. metadata +182 -404
  65. data/spec/archive_deploy_spec.rb +0 -53
  66. data/spec/basic_deploy_spec.rb +0 -26
  67. data/spec/bundler_deploy_spec.rb +0 -160
  68. data/spec/configuration_spec.rb +0 -206
  69. data/spec/custom_deploy_spec.rb +0 -128
  70. data/spec/deploy_hook_spec.rb +0 -378
  71. data/spec/deprecation_spec.rb +0 -23
  72. data/spec/ey_yml_customized_deploy_spec.rb +0 -99
  73. data/spec/fixtures/gitrepo.tar.gz +0 -0
  74. data/spec/fixtures/invalid_hook.rb +0 -1
  75. data/spec/fixtures/lockfiles/0.9-no-bundler +0 -111
  76. data/spec/fixtures/lockfiles/0.9-with-bundler +0 -117
  77. data/spec/fixtures/lockfiles/1.0-no-bundler +0 -54
  78. data/spec/fixtures/lockfiles/1.0.0.rc.1-with-bundler +0 -162
  79. data/spec/fixtures/lockfiles/1.0.18-do_mysql +0 -88
  80. data/spec/fixtures/lockfiles/1.0.18-do_postgres +0 -79
  81. data/spec/fixtures/lockfiles/1.0.18-mysql +0 -43
  82. data/spec/fixtures/lockfiles/1.0.18-mysql2 +0 -43
  83. data/spec/fixtures/lockfiles/1.0.18-pg +0 -43
  84. data/spec/fixtures/lockfiles/1.0.6-no-bundler +0 -51
  85. data/spec/fixtures/lockfiles/1.0.6-with-any-bundler +0 -52
  86. data/spec/fixtures/lockfiles/1.0.6-with-bundler +0 -52
  87. data/spec/fixtures/lockfiles/1.15.1-no-bundler +0 -51
  88. data/spec/fixtures/lockfiles/1.3.1-rails-3.2.13 +0 -112
  89. data/spec/fixtures/lockfiles/not-a-lockfile +0 -1
  90. data/spec/fixtures/repos/assets_detected/Gemfile +0 -5
  91. data/spec/fixtures/repos/assets_detected/Gemfile.lock +0 -88
  92. data/spec/fixtures/repos/assets_detected/README +0 -1
  93. data/spec/fixtures/repos/assets_detected/Rakefile +0 -5
  94. data/spec/fixtures/repos/assets_detected/app/assets/empty +0 -0
  95. data/spec/fixtures/repos/assets_detected/config/application.rb +0 -5
  96. data/spec/fixtures/repos/assets_detected/config/ey.yml +0 -3
  97. data/spec/fixtures/repos/assets_disabled/Gemfile +0 -5
  98. data/spec/fixtures/repos/assets_disabled/Gemfile.lock +0 -88
  99. data/spec/fixtures/repos/assets_disabled/README +0 -1
  100. data/spec/fixtures/repos/assets_disabled/Rakefile +0 -6
  101. data/spec/fixtures/repos/assets_disabled/app/assets/empty +0 -0
  102. data/spec/fixtures/repos/assets_disabled/config/application.rb +0 -5
  103. data/spec/fixtures/repos/assets_disabled/config/ey.yml +0 -3
  104. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile +0 -5
  105. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile.lock +0 -88
  106. data/spec/fixtures/repos/assets_disabled_in_ey_yml/README +0 -1
  107. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Rakefile +0 -6
  108. data/spec/fixtures/repos/assets_disabled_in_ey_yml/app/assets/empty +0 -0
  109. data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/application.rb +0 -5
  110. data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/ey.yml +0 -5
  111. data/spec/fixtures/repos/assets_disabled_utf8/Gemfile +0 -5
  112. data/spec/fixtures/repos/assets_disabled_utf8/Gemfile.lock +0 -88
  113. data/spec/fixtures/repos/assets_disabled_utf8/README +0 -3
  114. data/spec/fixtures/repos/assets_disabled_utf8/Rakefile +0 -5
  115. data/spec/fixtures/repos/assets_disabled_utf8/app/assets/empty +0 -0
  116. data/spec/fixtures/repos/assets_disabled_utf8/config/application.rb +0 -7
  117. data/spec/fixtures/repos/assets_disabled_utf8/config/ey.yml +0 -3
  118. data/spec/fixtures/repos/assets_enabled_all/Gemfile +0 -5
  119. data/spec/fixtures/repos/assets_enabled_all/Gemfile.lock +0 -88
  120. data/spec/fixtures/repos/assets_enabled_all/README +0 -1
  121. data/spec/fixtures/repos/assets_enabled_all/app/assets/empty +0 -0
  122. data/spec/fixtures/repos/assets_enabled_all/config/application.rb +0 -5
  123. data/spec/fixtures/repos/assets_enabled_all/config/ey.yml +0 -6
  124. data/spec/fixtures/repos/assets_enabled_all/script/assets +0 -5
  125. data/spec/fixtures/repos/assets_enabled_all/tmp/obstruction +0 -1
  126. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile +0 -3
  127. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile.lock +0 -10
  128. data/spec/fixtures/repos/assets_enabled_in_ey_yml/README +0 -1
  129. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Rakefile +0 -8
  130. data/spec/fixtures/repos/assets_enabled_in_ey_yml/config/ey.yml +0 -4
  131. data/spec/fixtures/repos/assets_enabled_util_only/Gemfile +0 -5
  132. data/spec/fixtures/repos/assets_enabled_util_only/Gemfile.lock +0 -88
  133. data/spec/fixtures/repos/assets_enabled_util_only/README +0 -1
  134. data/spec/fixtures/repos/assets_enabled_util_only/Rakefile +0 -6
  135. data/spec/fixtures/repos/assets_enabled_util_only/app/assets/empty +0 -0
  136. data/spec/fixtures/repos/assets_enabled_util_only/config/application.rb +0 -5
  137. data/spec/fixtures/repos/assets_enabled_util_only/config/ey.yml +0 -6
  138. data/spec/fixtures/repos/assets_error/Gemfile +0 -5
  139. data/spec/fixtures/repos/assets_error/Gemfile.lock +0 -88
  140. data/spec/fixtures/repos/assets_error/README +0 -1
  141. data/spec/fixtures/repos/assets_error/Rakefile +0 -4
  142. data/spec/fixtures/repos/assets_error/app/assets/empty +0 -0
  143. data/spec/fixtures/repos/assets_error/config/application.rb +0 -5
  144. data/spec/fixtures/repos/assets_error/config/ey.yml +0 -4
  145. data/spec/fixtures/repos/assets_in_hook/Gemfile +0 -5
  146. data/spec/fixtures/repos/assets_in_hook/Gemfile.lock +0 -88
  147. data/spec/fixtures/repos/assets_in_hook/README +0 -2
  148. data/spec/fixtures/repos/assets_in_hook/Rakefile +0 -5
  149. data/spec/fixtures/repos/assets_in_hook/app/assets/empty +0 -0
  150. data/spec/fixtures/repos/assets_in_hook/config/application.rb +0 -5
  151. data/spec/fixtures/repos/assets_in_hook/config/ey.yml +0 -3
  152. data/spec/fixtures/repos/assets_in_hook/deploy/before_compile_assets.rb +0 -2
  153. data/spec/fixtures/repos/bundle_fails/Gemfile +0 -1
  154. data/spec/fixtures/repos/bundle_fails/README +0 -1
  155. data/spec/fixtures/repos/bundle_fails/deploy/after_bundle.rb +0 -1
  156. data/spec/fixtures/repos/bundler_disabled/Gemfile +0 -4
  157. data/spec/fixtures/repos/bundler_disabled/Gemfile.lock +0 -12
  158. data/spec/fixtures/repos/bundler_disabled/README +0 -1
  159. data/spec/fixtures/repos/bundler_disabled/config/ey.yml +0 -2
  160. data/spec/fixtures/repos/bundler_disabled/deploy/after_bundle.rb +0 -1
  161. data/spec/fixtures/repos/bundler_disabled/deploy/before_bundle.rb +0 -1
  162. data/spec/fixtures/repos/bundler_old/Gemfile +0 -5
  163. data/spec/fixtures/repos/bundler_old/Gemfile.lock +0 -15
  164. data/spec/fixtures/repos/bundler_old/README +0 -1
  165. data/spec/fixtures/repos/default/Gemfile +0 -4
  166. data/spec/fixtures/repos/default/Gemfile.lock +0 -12
  167. data/spec/fixtures/repos/default/README +0 -5
  168. data/spec/fixtures/repos/default/ey.yml +0 -3
  169. data/spec/fixtures/repos/executable_hooks/README +0 -1
  170. data/spec/fixtures/repos/executable_hooks/deploy/before_restart +0 -72
  171. data/spec/fixtures/repos/executable_hooks_not_executable/README +0 -3
  172. data/spec/fixtures/repos/executable_hooks_not_executable/deploy/before_restart +0 -3
  173. data/spec/fixtures/repos/ey_yml/Gemfile +0 -4
  174. data/spec/fixtures/repos/ey_yml/Gemfile.lock +0 -12
  175. data/spec/fixtures/repos/ey_yml/README +0 -1
  176. data/spec/fixtures/repos/ey_yml/config/ey.yml +0 -18
  177. data/spec/fixtures/repos/ey_yml/deploy/before_migrate.rb +0 -6
  178. data/spec/fixtures/repos/ey_yml_alt/Gemfile +0 -4
  179. data/spec/fixtures/repos/ey_yml_alt/Gemfile.lock +0 -12
  180. data/spec/fixtures/repos/ey_yml_alt/README +0 -1
  181. data/spec/fixtures/repos/ey_yml_alt/deploy/before_migrate.rb +0 -6
  182. data/spec/fixtures/repos/ey_yml_alt/ey.yml +0 -12
  183. data/spec/fixtures/repos/hook_fails/README +0 -1
  184. data/spec/fixtures/repos/hook_fails/deploy/before_deploy.rb +0 -1
  185. data/spec/fixtures/repos/hooks/README +0 -1
  186. data/spec/fixtures/repos/hooks/deploy/after_bundle.rb +0 -1
  187. data/spec/fixtures/repos/hooks/deploy/after_compile_assets.rb +0 -1
  188. data/spec/fixtures/repos/hooks/deploy/after_deploy.rb +0 -1
  189. data/spec/fixtures/repos/hooks/deploy/after_migrate.rb +0 -1
  190. data/spec/fixtures/repos/hooks/deploy/after_restart.rb +0 -1
  191. data/spec/fixtures/repos/hooks/deploy/after_symlink.rb +0 -1
  192. data/spec/fixtures/repos/hooks/deploy/before_bundle.rb +0 -1
  193. data/spec/fixtures/repos/hooks/deploy/before_compile_assets.rb +0 -1
  194. data/spec/fixtures/repos/hooks/deploy/before_deploy.rb +0 -1
  195. data/spec/fixtures/repos/hooks/deploy/before_migrate.rb +0 -1
  196. data/spec/fixtures/repos/hooks/deploy/before_restart.rb +0 -1
  197. data/spec/fixtures/repos/hooks/deploy/before_symlink.rb +0 -1
  198. data/spec/fixtures/repos/multi_dep_manager/README +0 -1
  199. data/spec/fixtures/repos/multi_dep_manager/composer.json +0 -5
  200. data/spec/fixtures/repos/multi_dep_manager/composer.lock +0 -462
  201. data/spec/fixtures/repos/multi_dep_manager/package.json +0 -7
  202. data/spec/fixtures/repos/multi_dep_manager/public/index.php +0 -4
  203. data/spec/fixtures/repos/no_ey_config/Gemfile +0 -3
  204. data/spec/fixtures/repos/no_ey_config/Gemfile.lock +0 -10
  205. data/spec/fixtures/repos/no_ey_config/README +0 -1
  206. data/spec/fixtures/repos/no_ey_config/ey.yml +0 -3
  207. data/spec/fixtures/repos/no_ey_config_no_warning/Gemfile +0 -3
  208. data/spec/fixtures/repos/no_ey_config_no_warning/Gemfile.lock +0 -10
  209. data/spec/fixtures/repos/no_ey_config_no_warning/README +0 -1
  210. data/spec/fixtures/repos/no_ey_config_no_warning/ey.yml +0 -5
  211. data/spec/fixtures/repos/no_gemfile_lock/Gemfile +0 -4
  212. data/spec/fixtures/repos/no_gemfile_lock/README +0 -1
  213. data/spec/fixtures/repos/no_gemfile_lock/ey.yml +0 -3
  214. data/spec/fixtures/repos/nodejs/README +0 -1
  215. data/spec/fixtures/repos/nodejs/package.json +0 -7
  216. data/spec/fixtures/repos/not_bundled/README +0 -1
  217. data/spec/fixtures/repos/npm_disabled/README +0 -1
  218. data/spec/fixtures/repos/npm_disabled/config/ey.yml +0 -2
  219. data/spec/fixtures/repos/npm_disabled/package.json +0 -7
  220. data/spec/fixtures/repos/php_composer_disabled/README +0 -1
  221. data/spec/fixtures/repos/php_composer_disabled/composer.json +0 -5
  222. data/spec/fixtures/repos/php_composer_disabled/composer.lock +0 -462
  223. data/spec/fixtures/repos/php_composer_disabled/config/ey.yml +0 -2
  224. data/spec/fixtures/repos/php_composer_disabled/public/index.php +0 -4
  225. data/spec/fixtures/repos/php_composer_lock/README +0 -1
  226. data/spec/fixtures/repos/php_composer_lock/composer.json +0 -5
  227. data/spec/fixtures/repos/php_composer_lock/composer.lock +0 -462
  228. data/spec/fixtures/repos/php_composer_lock/public/index.php +0 -4
  229. data/spec/fixtures/repos/php_no_composer_lock/README +0 -1
  230. data/spec/fixtures/repos/php_no_composer_lock/composer.json +0 -21
  231. data/spec/fixtures/repos/php_no_composer_lock/public/index.php +0 -4
  232. data/spec/fixtures/repos/public_system/Gemfile +0 -4
  233. data/spec/fixtures/repos/public_system/Gemfile.lock +0 -12
  234. data/spec/fixtures/repos/public_system/README +0 -5
  235. data/spec/fixtures/repos/public_system/ey.yml +0 -3
  236. data/spec/fixtures/repos/public_system/public/system/cant_touch_this.txt +0 -3
  237. data/spec/fixtures/repos/sqlite3/Gemfile +0 -4
  238. data/spec/fixtures/repos/sqlite3/Gemfile.lock +0 -89
  239. data/spec/fixtures/repos/sqlite3/README +0 -1
  240. data/spec/fixtures/retwisj.war +0 -0
  241. data/spec/fixtures/valid_hook.rb +0 -1
  242. data/spec/git_strategy_spec.rb +0 -34
  243. data/spec/lockfile_parser_spec.rb +0 -126
  244. data/spec/maintenance_spec.rb +0 -44
  245. data/spec/multi_dependency_manager_spec.rb +0 -25
  246. data/spec/nodejs_deploy_spec.rb +0 -30
  247. data/spec/php_deploy_spec.rb +0 -81
  248. data/spec/platform_configure_spec.rb +0 -61
  249. data/spec/rails31_deploy_spec.rb +0 -172
  250. data/spec/restart_spec.rb +0 -43
  251. data/spec/rollback_spec.rb +0 -87
  252. data/spec/server_spec.rb +0 -70
  253. data/spec/services_deploy_spec.rb +0 -165
  254. data/spec/shell_spec.rb +0 -57
  255. data/spec/source/archive_spec.rb +0 -33
  256. data/spec/source/git_spec.rb +0 -44
  257. data/spec/sqlite3_deploy_spec.rb +0 -38
  258. data/spec/support/integration.rb +0 -103
  259. data/spec/support/source_doubles.rb +0 -28
  260. data/spec/support/timecop.rb +0 -5
  261. data/spec/symlink_spec.rb +0 -15
@@ -0,0 +1,10 @@
1
+ def setup_release
2
+ setup_public_path
3
+ setup_system_link
4
+ setup_shared_system_path
5
+ setup_shared_app_path
6
+ end
7
+
8
+ Given %(I've previously deployed my app) do
9
+ setup_release
10
+ end
@@ -0,0 +1,8 @@
1
+ Then %(the command has an unsuccessful exit status) do
2
+ step %{the exit status should not be 0}
3
+ step %{the exit status should not be 255}
4
+ end
5
+
6
+ Then %(the command suffers a critical failure) do
7
+ step %{the exit status should be 255}
8
+ end
@@ -0,0 +1,14 @@
1
+ Given %{my environment has the following servers:} do |dataset|
2
+ servers = []
3
+ dataset.hashes.each do |row|
4
+ servers.push(
5
+ {
6
+ :hostname => row['Hostname'],
7
+ :name => row['Name'].strip,
8
+ :roles => row['Roles'].split(',').map{|s| s.strip},
9
+ }
10
+ )
11
+ end
12
+
13
+ memorize_fact(:servers, servers)
14
+ end
@@ -0,0 +1,5 @@
1
+ require 'engineyard-serverside/version'
2
+
3
+ Then %{the current version is displayed} do
4
+ expect(output_text).to include(EY::Serverside::VERSION)
5
+ end
@@ -0,0 +1,63 @@
1
+ unless RUBY_VERSION =~ /^1\.8\./
2
+ require 'simplecov'
3
+ SimpleCov.coverage_dir 'coverage/outside'
4
+ SimpleCov.start do
5
+ add_filter '/spec/'
6
+ add_filter '/features/'
7
+ add_filter '/mock/'
8
+ add_filter '/lib/vendor/'
9
+ add_group 'CLI Workflows', 'lib/engineyard-serverside/cli/workflows/'
10
+ add_group 'Callbacks', 'lib/engineyard-serverside/callbacks/'
11
+ end
12
+ end
13
+
14
+ require 'cucumber/rspec/doubles'
15
+ require 'aruba/cucumber'
16
+ require 'factis/cucumber'
17
+ require 'devnull'
18
+ require 'engineyard-serverside'
19
+
20
+ # This is a fun bit of glue to allow us to use Aruba's in-process runner
21
+ class Runatron
22
+ include RSpec::Mocks::ExampleMethods
23
+
24
+ def initialize(argv, stdin = STDIN, stdout = STDOUT, stderr = STDERR, kernel = Kernel)
25
+ @argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
26
+ end
27
+
28
+ def execute!
29
+ exit_code = begin
30
+ $stderr = @stderr
31
+ $stdin = @stdin
32
+ $stdout = @stdout
33
+ $logger = Logger.new(DevNull.new)
34
+ allow(Logger).to receive(:new).and_return($logger)
35
+
36
+ EY::Serverside::CLI::App.start(@argv)
37
+ 0
38
+ rescue StandardError => e
39
+ b = e.backtrace
40
+ @stderr.puts("#{b.shift}: #{e.message} (#{e.class})")
41
+ @stderr.puts(b.map {|s| "\tfrom #{s}"}.join("\n"))
42
+ 255
43
+ rescue SystemExit => e
44
+ e.status
45
+ ensure
46
+ $stderr = STDERR
47
+ $stdin = STDIN
48
+ $stdout = STDOUT
49
+ end
50
+
51
+ @kernel.exit(exit_code)
52
+ end
53
+ end
54
+
55
+ Aruba.configure do |config|
56
+ config.command_launcher = :in_process
57
+ config.main_class = Runatron
58
+ end
59
+
60
+ After do
61
+ ExecutedCommands.reset
62
+ cleanup_fs
63
+ end
@@ -0,0 +1,17 @@
1
+ Before('@error') do
2
+ memorize_fact(:exit_status, 1)
3
+ end
4
+
5
+ Before('@failure') do
6
+ memorize_fact(:exit_status, 255)
7
+ end
8
+
9
+ After do
10
+ exit_status = begin
11
+ recall_fact(:exit_status)
12
+ rescue
13
+ 0
14
+ end
15
+
16
+ step %{the exit status should be #{exit_status}}
17
+ end
@@ -0,0 +1,82 @@
1
+ require 'pathname'
2
+ module FsHelpers
3
+ def project_root
4
+ Pathname.new(File.expand_path(File.join(__FILE__, '..', '..', '..')))
5
+ end
6
+
7
+ def data_path
8
+ project_root.join('tmp', 'data')
9
+ end
10
+
11
+ def setup_data_path
12
+ data_path.mkpath
13
+ end
14
+
15
+ def cleanup_data_path
16
+ data_path.rmtree if data_path.exist?
17
+ end
18
+
19
+ def app_path
20
+ data_path.join(app_name)
21
+ end
22
+
23
+ def setup_app_path
24
+ app_path.mkpath
25
+ end
26
+
27
+ def release_path
28
+ app_path.join('20200212024800')
29
+ end
30
+
31
+ def setup_release_path
32
+ release_path.mkpath
33
+ end
34
+
35
+ def deploy_hooks_path
36
+ release_path.join('deploy')
37
+ end
38
+
39
+ def setup_deploy_hooks_path
40
+ deploy_hooks_path.mkpath
41
+ end
42
+
43
+ def cleanup_deploy_hooks_path
44
+ deploy_hooks_path.rmtree if deploy_hooks_path.exist?
45
+ end
46
+
47
+ def shared_app_path
48
+ app_path.join('shared')
49
+ end
50
+
51
+ def shared_hooks_path
52
+ shared_app_path.join('hooks')
53
+ end
54
+
55
+ def setup_shared_hooks_path
56
+ shared_hooks_path.mkpath
57
+ end
58
+
59
+ def cleanup_shared_hooks_path
60
+ shared_hooks_path.rmtree if shared_hooks_path.exist?
61
+ end
62
+
63
+ def service_path(service)
64
+ shared_hooks_path.join(service)
65
+ end
66
+
67
+ def setup_service_path(service)
68
+ service_path(service).mkpath
69
+ end
70
+
71
+ def setup_fs
72
+ setup_deploy_hooks_path
73
+ setup_shared_hooks_path
74
+ end
75
+
76
+ def cleanup_fs
77
+ cleanup_data_path
78
+ end
79
+
80
+ end
81
+
82
+ World(FsHelpers)
@@ -0,0 +1,7 @@
1
+ module OutputHelpers
2
+ def output_text
3
+ last_command_started.output
4
+ end
5
+ end
6
+
7
+ World(OutputHelpers)
@@ -0,0 +1,41 @@
1
+ require 'runner'
2
+ require 'engineyard-serverside/spawner'
3
+
4
+ module ExecutedCommands
5
+ def self.record(cmd)
6
+ executed.push(cmd)
7
+
8
+ EY::Serverside::Spawner::Result.new(cmd, true, nil, nil)
9
+ end
10
+
11
+ def self.executed
12
+ @executed ||= []
13
+ end
14
+
15
+ def self.reset
16
+ @executed = nil
17
+ end
18
+
19
+ def self.deploy_hook_executed?(callback_name)
20
+ executed.
21
+ select {|x|
22
+ x.match(%r{engineyard-serverside-execute-hook #{callback_name}})
23
+ }.length > 0
24
+ end
25
+
26
+ def self.service_hook_executed?(service_name, callback_name)
27
+ executed.
28
+ select {|x|
29
+ x.match(
30
+ %r{engineyard-serverside-execute-service-hook #{service_name}/#{callback_name}}
31
+ )
32
+ }.length > 0
33
+ end
34
+
35
+ end
36
+
37
+ module Runner
38
+ def run(cmd)
39
+ ExecutedCommands.record(cmd)
40
+ end
41
+ end
@@ -0,0 +1,7 @@
1
+ Feature: Showing the version
2
+ In order to know what iteration of engineyard-serverside I'm using, I want to
3
+ be able to have it print out the version.
4
+
5
+ Scenario: User issues the vesion command
6
+ When I run `engineyard-serverside version`
7
+ Then the current version is displayed
@@ -8,6 +8,7 @@ require 'engineyard-serverside/cli/server_hash_extractor'
8
8
  require 'engineyard-serverside/servers'
9
9
  require 'engineyard-serverside/cli/helpers'
10
10
  require 'engineyard-serverside/cli/workflows'
11
+ require 'engineyard-serverside/version'
11
12
 
12
13
  module EY
13
14
  module Serverside
@@ -130,6 +131,11 @@ module EY
130
131
  def restart
131
132
  Workflows.perform(:restart, options)
132
133
  end
134
+
135
+ desc "version", "Show the engineyard-serverside version"
136
+ def version
137
+ puts EY::Serverside::VERSION
138
+ end
133
139
  end
134
140
  end
135
141
  end
@@ -48,23 +48,51 @@ module EY
48
48
  debug msg.gsub(BOL, SUBSTATUS_PREFIX)
49
49
  end
50
50
 
51
- def fatal(msg) logger.fatal "FATAL: #{msg}" end
52
- def error(msg) logger.error "ERROR: #{msg}" end
53
- def warning(msg) logger.warn "WARNING: #{msg}" end
51
+ def fatal(msg)
52
+ logger.fatal("FATAL: #{msg}")
53
+ end
54
+
55
+ def error(msg)
56
+ logger.error("ERROR: #{msg}")
57
+ end
58
+
59
+ def warning(msg)
60
+ logger.warn("WARNING: #{msg}")
61
+ end
54
62
  alias warn warning
55
- def notice(msg) logger.warn msg end
56
- def info(msg) logger.info msg end
57
- def debug(msg) logger.debug msg end
58
- def unknown(msg) logger.unknown msg end
63
+
64
+ def notice(msg)
65
+ logger.warn(msg)
66
+ end
67
+
68
+ def info(msg)
69
+ logger.info(msg)
70
+ end
71
+
72
+ def debug(msg)
73
+ logger.debug(msg)
74
+ end
75
+
76
+ def unknown(msg)
77
+ logger.unknown(msg)
78
+ end
59
79
 
60
80
  # a debug outputter that displays a command being run
61
81
  # Formatis like this:
62
82
  # $ cmd blah do \
63
83
  # > something more
64
84
  # > end
65
- def command_show(cmd) debug cmd.gsub(BOL,CMD_CONTINUE).sub(CMD_CONTINUE, CMD_PREFIX) end
66
- def command_out(msg) debug msg.gsub(BOL,CMD_INDENT) end
67
- def command_err(msg) unknown msg.gsub(BOL,CMD_INDENT) end
85
+ def command_show(cmd)
86
+ debug(cmd.gsub(BOL,CMD_CONTINUE).sub(CMD_CONTINUE, CMD_PREFIX))
87
+ end
88
+
89
+ def command_out(msg)
90
+ debug(msg.gsub(BOL,CMD_INDENT))
91
+ end
92
+
93
+ def command_err(msg)
94
+ unknown(msg.gsub(BOL,CMD_INDENT))
95
+ end
68
96
 
69
97
  def logged_system(cmd, server = nil)
70
98
  EY::Serverside::Spawner.run(cmd, self, server)
@@ -1,5 +1,5 @@
1
1
  module EY
2
2
  module Serverside
3
- VERSION = '2.8.0.pre4'
3
+ VERSION = '2.8.0'
4
4
  end
5
5
  end
@@ -0,0 +1,232 @@
1
+ require 'spec_helper'
2
+
3
+ require 'pathname'
4
+
5
+ require 'engineyard-serverside/callbacks/collection/combined'
6
+
7
+ module EY
8
+ module Serverside
9
+ module Callbacks
10
+ module Collection
11
+
12
+ describe Combined do
13
+ let(:paths) {Object.new}
14
+ let(:deploy_hook_1) {Object.new}
15
+ let(:deploy_hook_2) {Object.new}
16
+ let(:service_hook_1) {Object.new}
17
+ let(:service_hook_2) {Object.new}
18
+ let(:deploy_hooks) {Object.new}
19
+ let(:service_hooks) {Object.new}
20
+
21
+ let(:collection) {described_class.load(paths)}
22
+
23
+ before(:each) do
24
+ # Stub out the DeployHooks collection upon which we depend
25
+ allow(DeployHooks).
26
+ to receive(:load).
27
+ with(paths).
28
+ and_return(deploy_hooks)
29
+
30
+ allow(deploy_hooks).
31
+ to receive(:all).
32
+ and_return([deploy_hook_1, deploy_hook_2])
33
+
34
+ allow(deploy_hooks).
35
+ to receive(:matching).
36
+ and_return([deploy_hook_1])
37
+
38
+ # Stub out the ServiceHooks collection upon which we depend
39
+ allow(ServiceHooks).
40
+ to receive(:load).
41
+ with(paths).
42
+ and_return(service_hooks)
43
+
44
+ allow(service_hooks).
45
+ to receive(:all).
46
+ and_return([service_hook_1, service_hook_2])
47
+
48
+ allow(service_hooks).
49
+ to receive(:matching).
50
+ and_return([service_hook_2])
51
+
52
+ # Make all of our "hooks" of the executable flavor by default
53
+ [
54
+ deploy_hook_1, deploy_hook_2, service_hook_1, service_hook_2
55
+ ].each do |hook|
56
+ allow(hook).to receive(:flavor).and_return(:executable)
57
+ end
58
+
59
+ end
60
+
61
+ describe '.load' do
62
+ let(:deploy_hooks) {Object.new}
63
+ let(:service_hooks) {Object.new}
64
+ let(:result) {described_class.load(paths)}
65
+
66
+
67
+ it 'loads deploy hooks' do
68
+ expect(DeployHooks).to receive(:load).with(paths)
69
+
70
+ result
71
+ end
72
+
73
+ it 'loads service hooks' do
74
+ expect(ServiceHooks).to receive(:load).with(paths)
75
+
76
+ result
77
+ end
78
+
79
+ it 'is a callbacks collection' do
80
+ expect(result).to be_a(Collection::Base)
81
+ end
82
+ end
83
+
84
+ describe '#all' do
85
+ let(:result) {collection.all}
86
+
87
+ it 'is an Array' do
88
+ expect(result).to be_a(Array)
89
+ end
90
+
91
+ it 'contains the deploy hooks' do
92
+ [deploy_hook_1, deploy_hook_2].each do |hook|
93
+ expect(result).to include(hook)
94
+ end
95
+ end
96
+
97
+ it 'contains the service hooks' do
98
+ [service_hook_1, service_hook_2].each do |hook|
99
+ expect(result).to include(hook)
100
+ end
101
+ end
102
+
103
+ it 'gives more priority to service hooks' do
104
+ expect(result).to eql(
105
+ [service_hook_1, service_hook_2, deploy_hook_1, deploy_hook_2]
106
+ )
107
+ end
108
+ end
109
+
110
+ describe '#matching' do
111
+ let(:name) {:hook_2}
112
+ let(:result) {collection.matching(name)}
113
+
114
+ it 'is an Array' do
115
+ expect(result).to be_a(Array)
116
+ end
117
+
118
+ it 'contains hooks with the desired name' do
119
+ [service_hook_2, deploy_hook_1].each do |hook|
120
+ expect(result).to include(hook)
121
+ end
122
+ end
123
+
124
+ it 'omits hooks without the desired name' do
125
+ [service_hook_1, deploy_hook_2].each do |hook|
126
+ expect(result).not_to include(hook)
127
+ end
128
+ end
129
+ end
130
+
131
+ describe '#execute' do
132
+ let(:config) {Object.new}
133
+ let(:shell) {Object.new}
134
+ let(:callback) {Object.new}
135
+ let(:matches) {[]}
136
+
137
+ let(:result) {collection.execute(config, shell, callback)}
138
+
139
+ before(:each) do
140
+ allow(Executor).to receive(:execute)
141
+ allow(shell).to receive(:info)
142
+ allow(collection).
143
+ to receive(:matching).
144
+ with(callback).
145
+ and_return(matches)
146
+ end
147
+
148
+ context 'when there are matching hooks' do
149
+ let(:matches) {[Object.new]}
150
+
151
+ it 'executes those matching hooks' do
152
+ expect(Executor).to receive(:execute).with(config, shell, matches)
153
+
154
+ result
155
+ end
156
+ end
157
+
158
+ context 'when there are not matching hooks' do
159
+ let(:matches) {[]}
160
+
161
+ it 'logs a message about the lack of matching hooks' do
162
+ expect(shell).
163
+ to receive(:info).
164
+ with("No hooks detected for #{callback}. Skipping.")
165
+
166
+ result
167
+ end
168
+
169
+ it 'does not execute any hooks' do
170
+ expect(Executor).not_to receive(:execute)
171
+
172
+ result
173
+ end
174
+ end
175
+ end
176
+
177
+ describe '#distribute' do
178
+ let(:runner) {Object.new}
179
+ let(:name) {:hook_2}
180
+ let(:distributor) {Callbacks::Distributor}
181
+ let(:distribution_result) {Object.new}
182
+ let(:matched) {[service_hook_2, deploy_hook_1]}
183
+ let(:result) {collection.distribute(runner, name)}
184
+
185
+ before(:each) do
186
+ allow(distributor).to receive(:distribute)
187
+ end
188
+
189
+ it 'distributes matching hooks via an distributor' do
190
+ expect(distributor).
191
+ to receive(:distribute).
192
+ with(runner, matched).
193
+ and_return(distribution_result)
194
+
195
+ expect(result).to eql(distribution_result)
196
+ end
197
+
198
+ it 'skips non-matching hooks' do
199
+ expect(distributor).not_to receive(:distribute).with(runner, :hook_1)
200
+
201
+ result
202
+ end
203
+
204
+ context 'when there are multiple matching ruby hooks' do
205
+ before(:each) do
206
+ allow(service_hook_2).to receive(:flavor).and_return(:ruby)
207
+ allow(deploy_hook_1).to receive(:flavor).and_return(:ruby)
208
+ end
209
+
210
+ it 'distributes the first ruby hook' do
211
+ expect(distributor).
212
+ to receive(:distribute).
213
+ with(runner, [service_hook_2])
214
+
215
+ result
216
+ end
217
+
218
+ it 'does not distribute any other ruby hook' do
219
+ expect(distributor).
220
+ not_to receive(:distribute).
221
+ with(runner, [service_hook_2, deploy_hook_1])
222
+
223
+ result
224
+ end
225
+ end
226
+ end
227
+ end
228
+
229
+ end
230
+ end
231
+ end
232
+ end