engineyard-serverside 2.7.0.pre → 2.7.8pre2

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 (252) hide show
  1. data/bin/engineyard-serverside +1 -1
  2. data/lib/engineyard-serverside/about.rb +8 -7
  3. data/lib/engineyard-serverside/cli.rb +225 -4
  4. data/lib/engineyard-serverside/cli_helpers.rb +53 -0
  5. data/lib/engineyard-serverside/configuration.rb +0 -1
  6. data/lib/engineyard-serverside/dependency_manager/bundler.rb +18 -46
  7. data/lib/engineyard-serverside/dependency_manager/npm.rb +1 -12
  8. data/lib/engineyard-serverside/deploy.rb +45 -7
  9. data/lib/engineyard-serverside/deploy_hook.rb +83 -20
  10. data/lib/engineyard-serverside/maintenance.rb +9 -1
  11. data/lib/engineyard-serverside/paths.rb +0 -11
  12. data/lib/engineyard-serverside/rails_assets.rb +1 -2
  13. data/lib/engineyard-serverside/version.rb +1 -1
  14. data/spec/archive_deploy_spec.rb +53 -0
  15. data/spec/basic_deploy_spec.rb +26 -0
  16. data/spec/bundler_deploy_spec.rb +139 -0
  17. data/spec/configuration_spec.rb +205 -0
  18. data/spec/custom_deploy_spec.rb +128 -0
  19. data/spec/deploy_hook_spec.rb +362 -0
  20. data/spec/deprecation_spec.rb +23 -0
  21. data/spec/ey_yml_customized_deploy_spec.rb +99 -0
  22. data/spec/fixtures/gitrepo.tar.gz +0 -0
  23. data/{lib/engineyard-serverside/callbacks/hooks.rb → spec/fixtures/gitrepo/bar} +0 -0
  24. data/spec/fixtures/gitrepo/foo +0 -0
  25. data/spec/fixtures/invalid_hook.rb +1 -0
  26. data/spec/fixtures/lockfiles/0.9-no-bundler +111 -0
  27. data/spec/fixtures/lockfiles/0.9-with-bundler +117 -0
  28. data/spec/fixtures/lockfiles/1.0-no-bundler +54 -0
  29. data/spec/fixtures/lockfiles/1.0.0.rc.1-with-bundler +162 -0
  30. data/spec/fixtures/lockfiles/1.0.18-do_mysql +88 -0
  31. data/spec/fixtures/lockfiles/1.0.18-do_postgres +79 -0
  32. data/spec/fixtures/lockfiles/1.0.18-mysql +43 -0
  33. data/spec/fixtures/lockfiles/1.0.18-mysql2 +43 -0
  34. data/spec/fixtures/lockfiles/1.0.18-pg +43 -0
  35. data/spec/fixtures/lockfiles/1.0.6-no-bundler +51 -0
  36. data/spec/fixtures/lockfiles/1.0.6-with-any-bundler +52 -0
  37. data/spec/fixtures/lockfiles/1.0.6-with-bundler +52 -0
  38. data/spec/fixtures/lockfiles/1.3.1-rails-3.2.13 +112 -0
  39. data/spec/fixtures/lockfiles/not-a-lockfile +1 -0
  40. data/spec/fixtures/repos/assets_detected/Gemfile +5 -0
  41. data/spec/fixtures/repos/assets_detected/Gemfile.lock +88 -0
  42. data/spec/fixtures/repos/assets_detected/README +1 -0
  43. data/spec/fixtures/repos/assets_detected/Rakefile +5 -0
  44. data/spec/fixtures/repos/assets_detected/app/assets/empty +0 -0
  45. data/spec/fixtures/repos/assets_detected/config/application.rb +5 -0
  46. data/spec/fixtures/repos/assets_detected/config/ey.yml +3 -0
  47. data/spec/fixtures/repos/assets_disabled/Gemfile +5 -0
  48. data/spec/fixtures/repos/assets_disabled/Gemfile.lock +88 -0
  49. data/spec/fixtures/repos/assets_disabled/README +1 -0
  50. data/spec/fixtures/repos/assets_disabled/Rakefile +6 -0
  51. data/spec/fixtures/repos/assets_disabled/app/assets/empty +0 -0
  52. data/spec/fixtures/repos/assets_disabled/config/application.rb +5 -0
  53. data/spec/fixtures/repos/assets_disabled/config/ey.yml +3 -0
  54. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile +5 -0
  55. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile.lock +88 -0
  56. data/spec/fixtures/repos/assets_disabled_in_ey_yml/README +1 -0
  57. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Rakefile +6 -0
  58. data/spec/fixtures/repos/assets_disabled_in_ey_yml/app/assets/empty +0 -0
  59. data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/application.rb +5 -0
  60. data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/ey.yml +5 -0
  61. data/spec/fixtures/repos/assets_disabled_utf8/Gemfile +5 -0
  62. data/spec/fixtures/repos/assets_disabled_utf8/Gemfile.lock +88 -0
  63. data/spec/fixtures/repos/assets_disabled_utf8/README +3 -0
  64. data/spec/fixtures/repos/assets_disabled_utf8/Rakefile +5 -0
  65. data/spec/fixtures/repos/assets_disabled_utf8/app/assets/empty +0 -0
  66. data/spec/fixtures/repos/assets_disabled_utf8/config/application.rb +7 -0
  67. data/spec/fixtures/repos/assets_disabled_utf8/config/ey.yml +3 -0
  68. data/spec/fixtures/repos/assets_enabled_all/Gemfile +5 -0
  69. data/spec/fixtures/repos/assets_enabled_all/Gemfile.lock +88 -0
  70. data/spec/fixtures/repos/assets_enabled_all/README +1 -0
  71. data/spec/fixtures/repos/assets_enabled_all/app/assets/empty +0 -0
  72. data/spec/fixtures/repos/assets_enabled_all/config/application.rb +5 -0
  73. data/spec/fixtures/repos/assets_enabled_all/config/ey.yml +6 -0
  74. data/spec/fixtures/repos/assets_enabled_all/script/assets +5 -0
  75. data/spec/fixtures/repos/assets_enabled_all/tmp/obstruction +1 -0
  76. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile +3 -0
  77. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile.lock +10 -0
  78. data/spec/fixtures/repos/assets_enabled_in_ey_yml/README +1 -0
  79. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Rakefile +8 -0
  80. data/spec/fixtures/repos/assets_enabled_in_ey_yml/config/ey.yml +4 -0
  81. data/spec/fixtures/repos/assets_enabled_util_only/Gemfile +5 -0
  82. data/spec/fixtures/repos/assets_enabled_util_only/Gemfile.lock +88 -0
  83. data/spec/fixtures/repos/assets_enabled_util_only/README +1 -0
  84. data/spec/fixtures/repos/assets_enabled_util_only/Rakefile +6 -0
  85. data/spec/fixtures/repos/assets_enabled_util_only/app/assets/empty +0 -0
  86. data/spec/fixtures/repos/assets_enabled_util_only/config/application.rb +5 -0
  87. data/spec/fixtures/repos/assets_enabled_util_only/config/ey.yml +6 -0
  88. data/spec/fixtures/repos/assets_in_hook/Gemfile +5 -0
  89. data/spec/fixtures/repos/assets_in_hook/Gemfile.lock +88 -0
  90. data/spec/fixtures/repos/assets_in_hook/README +2 -0
  91. data/spec/fixtures/repos/assets_in_hook/Rakefile +5 -0
  92. data/spec/fixtures/repos/assets_in_hook/app/assets/empty +0 -0
  93. data/spec/fixtures/repos/assets_in_hook/config/application.rb +5 -0
  94. data/spec/fixtures/repos/assets_in_hook/config/ey.yml +3 -0
  95. data/spec/fixtures/repos/assets_in_hook/deploy/before_compile_assets.rb +2 -0
  96. data/spec/fixtures/repos/bundle_fails/Gemfile +1 -0
  97. data/spec/fixtures/repos/bundle_fails/README +1 -0
  98. data/spec/fixtures/repos/bundle_fails/deploy/after_bundle.rb +1 -0
  99. data/spec/fixtures/repos/bundler_disabled/Gemfile +4 -0
  100. data/spec/fixtures/repos/bundler_disabled/Gemfile.lock +12 -0
  101. data/spec/fixtures/repos/bundler_disabled/README +1 -0
  102. data/spec/fixtures/repos/bundler_disabled/config/ey.yml +2 -0
  103. data/spec/fixtures/repos/bundler_disabled/deploy/after_bundle.rb +1 -0
  104. data/spec/fixtures/repos/bundler_disabled/deploy/before_bundle.rb +1 -0
  105. data/spec/fixtures/repos/default/Gemfile +4 -0
  106. data/spec/fixtures/repos/default/Gemfile.lock +12 -0
  107. data/spec/fixtures/repos/default/README +5 -0
  108. data/spec/fixtures/repos/default/ey.yml +3 -0
  109. data/spec/fixtures/repos/executable_hooks/README +1 -0
  110. data/spec/fixtures/repos/executable_hooks/deploy/before_restart +72 -0
  111. data/spec/fixtures/repos/executable_hooks_not_executable/README +3 -0
  112. data/spec/fixtures/repos/executable_hooks_not_executable/deploy/before_restart +3 -0
  113. data/spec/fixtures/repos/ey_yml/Gemfile +4 -0
  114. data/spec/fixtures/repos/ey_yml/Gemfile.lock +12 -0
  115. data/spec/fixtures/repos/ey_yml/README +1 -0
  116. data/spec/fixtures/repos/ey_yml/config/ey.yml +18 -0
  117. data/spec/fixtures/repos/ey_yml/deploy/before_migrate.rb +6 -0
  118. data/spec/fixtures/repos/ey_yml_alt/Gemfile +4 -0
  119. data/spec/fixtures/repos/ey_yml_alt/Gemfile.lock +12 -0
  120. data/spec/fixtures/repos/ey_yml_alt/README +1 -0
  121. data/spec/fixtures/repos/ey_yml_alt/deploy/before_migrate.rb +6 -0
  122. data/spec/fixtures/repos/ey_yml_alt/ey.yml +12 -0
  123. data/spec/fixtures/repos/hook_fails/README +1 -0
  124. data/spec/fixtures/repos/hook_fails/deploy/before_deploy.rb +1 -0
  125. data/spec/fixtures/repos/hooks/README +1 -0
  126. data/spec/fixtures/repos/hooks/deploy/after_bundle.rb +1 -0
  127. data/spec/fixtures/repos/hooks/deploy/after_compile_assets.rb +1 -0
  128. data/spec/fixtures/repos/hooks/deploy/after_deploy.rb +1 -0
  129. data/spec/fixtures/repos/hooks/deploy/after_migrate.rb +1 -0
  130. data/spec/fixtures/repos/hooks/deploy/after_restart.rb +1 -0
  131. data/spec/fixtures/repos/hooks/deploy/after_symlink.rb +1 -0
  132. data/spec/fixtures/repos/hooks/deploy/before_bundle.rb +1 -0
  133. data/spec/fixtures/repos/hooks/deploy/before_compile_assets.rb +1 -0
  134. data/spec/fixtures/repos/hooks/deploy/before_deploy.rb +1 -0
  135. data/spec/fixtures/repos/hooks/deploy/before_migrate.rb +1 -0
  136. data/spec/fixtures/repos/hooks/deploy/before_restart.rb +1 -0
  137. data/spec/fixtures/repos/hooks/deploy/before_symlink.rb +1 -0
  138. data/spec/fixtures/repos/multi_dep_manager/README +1 -0
  139. data/spec/fixtures/repos/multi_dep_manager/composer.json +5 -0
  140. data/spec/fixtures/repos/multi_dep_manager/composer.lock +462 -0
  141. data/spec/fixtures/repos/multi_dep_manager/package.json +7 -0
  142. data/spec/fixtures/repos/multi_dep_manager/public/index.php +4 -0
  143. data/spec/fixtures/repos/no_ey_config/Gemfile +3 -0
  144. data/spec/fixtures/repos/no_ey_config/Gemfile.lock +10 -0
  145. data/spec/fixtures/repos/no_ey_config/README +1 -0
  146. data/spec/fixtures/repos/no_ey_config/ey.yml +3 -0
  147. data/spec/fixtures/repos/no_gemfile_lock/Gemfile +4 -0
  148. data/spec/fixtures/repos/no_gemfile_lock/README +1 -0
  149. data/spec/fixtures/repos/no_gemfile_lock/ey.yml +3 -0
  150. data/spec/fixtures/repos/nodejs/README +1 -0
  151. data/spec/fixtures/repos/nodejs/package.json +7 -0
  152. data/spec/fixtures/repos/not_bundled/README +1 -0
  153. data/spec/fixtures/repos/npm_disabled/README +1 -0
  154. data/spec/fixtures/repos/npm_disabled/config/ey.yml +2 -0
  155. data/spec/fixtures/repos/npm_disabled/package.json +7 -0
  156. data/spec/fixtures/repos/php_composer_disabled/README +1 -0
  157. data/spec/fixtures/repos/php_composer_disabled/composer.json +5 -0
  158. data/spec/fixtures/repos/php_composer_disabled/composer.lock +462 -0
  159. data/spec/fixtures/repos/php_composer_disabled/config/ey.yml +2 -0
  160. data/spec/fixtures/repos/php_composer_disabled/public/index.php +4 -0
  161. data/spec/fixtures/repos/php_composer_lock/README +1 -0
  162. data/spec/fixtures/repos/php_composer_lock/composer.json +5 -0
  163. data/spec/fixtures/repos/php_composer_lock/composer.lock +462 -0
  164. data/spec/fixtures/repos/php_composer_lock/public/index.php +4 -0
  165. data/spec/fixtures/repos/php_no_composer_lock/README +1 -0
  166. data/spec/fixtures/repos/php_no_composer_lock/composer.json +21 -0
  167. data/spec/fixtures/repos/php_no_composer_lock/public/index.php +4 -0
  168. data/spec/fixtures/repos/public_system/Gemfile +4 -0
  169. data/spec/fixtures/repos/public_system/Gemfile.lock +12 -0
  170. data/spec/fixtures/repos/public_system/README +5 -0
  171. data/spec/fixtures/repos/public_system/ey.yml +3 -0
  172. data/spec/fixtures/repos/public_system/public/system/cant_touch_this.txt +3 -0
  173. data/spec/fixtures/repos/sqlite3/Gemfile +4 -0
  174. data/spec/fixtures/repos/sqlite3/Gemfile.lock +89 -0
  175. data/spec/fixtures/repos/sqlite3/README +1 -0
  176. data/spec/fixtures/retwisj.war +0 -0
  177. data/spec/fixtures/valid_hook.rb +1 -0
  178. data/spec/git_strategy_spec.rb +34 -0
  179. data/spec/lockfile_parser_spec.rb +122 -0
  180. data/spec/maintenance_spec.rb +44 -0
  181. data/spec/multi_dependency_manager_spec.rb +25 -0
  182. data/spec/nodejs_deploy_spec.rb +30 -0
  183. data/spec/php_deploy_spec.rb +81 -0
  184. data/spec/platform_configure_spec.rb +61 -0
  185. data/spec/rails31_deploy_spec.rb +164 -0
  186. data/spec/restart_spec.rb +43 -0
  187. data/spec/rollback_spec.rb +87 -0
  188. data/spec/server_spec.rb +70 -0
  189. data/spec/services_deploy_spec.rb +153 -0
  190. data/spec/shell_spec.rb +57 -0
  191. data/spec/source/archive_spec.rb +33 -0
  192. data/spec/source/git_spec.rb +44 -0
  193. data/spec/spec_helper.rb +355 -0
  194. data/spec/sqlite3_deploy_spec.rb +38 -0
  195. data/spec/support/integration.rb +103 -0
  196. data/spec/support/source_doubles.rb +28 -0
  197. data/spec/support/timecop.rb +5 -0
  198. data/spec/symlink_spec.rb +15 -0
  199. metadata +522 -184
  200. data/lib/engineyard-serverside/callbacks.rb +0 -11
  201. data/lib/engineyard-serverside/callbacks/collection.rb +0 -17
  202. data/lib/engineyard-serverside/callbacks/collection/base.rb +0 -94
  203. data/lib/engineyard-serverside/callbacks/collection/combined.rb +0 -45
  204. data/lib/engineyard-serverside/callbacks/collection/deploy_hooks.rb +0 -21
  205. data/lib/engineyard-serverside/callbacks/collection/service_hooks.rb +0 -17
  206. data/lib/engineyard-serverside/callbacks/collection/service_hooks/collection.rb +0 -24
  207. data/lib/engineyard-serverside/callbacks/collection/service_hooks/combined.rb +0 -40
  208. data/lib/engineyard-serverside/callbacks/distributor.rb +0 -23
  209. data/lib/engineyard-serverside/callbacks/distributor/base.rb +0 -38
  210. data/lib/engineyard-serverside/callbacks/distributor/executable.rb +0 -19
  211. data/lib/engineyard-serverside/callbacks/distributor/executable/runnable.rb +0 -41
  212. data/lib/engineyard-serverside/callbacks/distributor/executable/unrunnable.rb +0 -19
  213. data/lib/engineyard-serverside/callbacks/distributor/ruby.rb +0 -59
  214. data/lib/engineyard-serverside/callbacks/distributor/ruby/distributor.rb +0 -57
  215. data/lib/engineyard-serverside/callbacks/hooks/app.rb +0 -17
  216. data/lib/engineyard-serverside/callbacks/hooks/base.rb +0 -39
  217. data/lib/engineyard-serverside/callbacks/hooks/service.rb +0 -24
  218. data/lib/engineyard-serverside/callbacks/service_hook.rb +0 -20
  219. data/lib/engineyard-serverside/cli/app.rb +0 -136
  220. data/lib/engineyard-serverside/cli/helpers.rb +0 -58
  221. data/lib/engineyard-serverside/cli/server_hash_extractor.rb +0 -49
  222. data/lib/engineyard-serverside/cli/workflows.rb +0 -45
  223. data/lib/engineyard-serverside/cli/workflows/base.rb +0 -78
  224. data/lib/engineyard-serverside/cli/workflows/calling_deploy_hooks.rb +0 -31
  225. data/lib/engineyard-serverside/cli/workflows/deploying_applications.rb +0 -28
  226. data/lib/engineyard-serverside/cli/workflows/disabling_maintenance.rb +0 -29
  227. data/lib/engineyard-serverside/cli/workflows/enabling_maintenance.rb +0 -29
  228. data/lib/engineyard-serverside/cli/workflows/errors.rb +0 -13
  229. data/lib/engineyard-serverside/cli/workflows/helpers.rb +0 -21
  230. data/lib/engineyard-serverside/cli/workflows/integrating_servers.rb +0 -71
  231. data/lib/engineyard-serverside/cli/workflows/restarting_applications.rb +0 -36
  232. data/lib/engineyard-serverside/cli/workflows/rolling_back_applications.rb +0 -28
  233. data/lib/engineyard-serverside/cli/workflows/showing_maintenance_status.rb +0 -28
  234. data/lib/engineyard-serverside/deploy_hook/callback_context.rb +0 -77
  235. data/lib/engineyard-serverside/propagator.rb +0 -59
  236. data/lib/engineyard-serverside/slug.rb +0 -7
  237. data/lib/engineyard-serverside/slug/distributor.rb +0 -58
  238. data/lib/engineyard-serverside/slug/enabler.rb +0 -100
  239. data/lib/engineyard-serverside/slug/failure_handler.rb +0 -24
  240. data/lib/engineyard-serverside/slug/finalizer.rb +0 -86
  241. data/lib/engineyard-serverside/slug/generator.rb +0 -29
  242. data/lib/engineyard-serverside/slug/migrator.rb +0 -41
  243. data/lib/engineyard-serverside/slug/restarter.rb +0 -103
  244. data/lib/engineyard-serverside/slug/source.rb +0 -16
  245. data/lib/engineyard-serverside/slug/source/updater.rb +0 -194
  246. data/lib/railway.rb +0 -43
  247. data/lib/result.rb +0 -7
  248. data/lib/result/base.rb +0 -41
  249. data/lib/result/dsl.rb +0 -16
  250. data/lib/result/failure.rb +0 -29
  251. data/lib/result/success.rb +0 -24
  252. data/lib/runner.rb +0 -34
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+ require 'tempfile'
3
+ require 'timecop'
4
+
5
+ describe EY::Serverside::Shell do
6
+ let(:output) { StringIO.new }
7
+
8
+ if "".respond_to?(:force_encoding)
9
+ it "status works for ut8" do
10
+ shell = EY::Serverside::Shell.new(:verbose => true, :stdout => output, :stderr => output, :log_path => tmpdir.join("engineyard-serverside-#{Time.now.to_i}-#{$$}.log"), :start_time => Time.local(2008, 9, 1, 12, 10, 25))
11
+ shell.status("\u2603".force_encoding("binary"))
12
+ end
13
+ end
14
+
15
+ it "has a timestamp before each line" do
16
+ time1 = Time.local(2008, 9, 1, 12, 0, 0)
17
+ time2 = Time.local(2008, 9, 1, 12, 3, 5)
18
+ time3 = Time.local(2008, 9, 1, 12, 10, 25)
19
+
20
+ @shell = EY::Serverside::Shell.new(:verbose => true, :stdout => output, :stderr => output, :log_path => tmpdir.join("engineyard-serverside-#{Time.now.to_i}-#{$$}.log"), :start_time => time1)
21
+
22
+ Timecop.freeze(time1) do
23
+ @shell.debug('debug')
24
+ @shell.notice('notice')
25
+ end
26
+ Timecop.freeze(time2) do
27
+ @shell.status('STATUS')
28
+ @shell.debug("multi\nline\ndebug")
29
+ @shell.warning("multi\nline\nwarning")
30
+ end
31
+ Timecop.freeze(time3) do
32
+ @shell.substatus("multi\nline\nsubstatus")
33
+ end
34
+
35
+ tstp_1 = "+ 00s "
36
+ tstp_2 = "+ 3m 05s "
37
+ tstp_3 = "+10m 25s "
38
+ output.rewind
39
+ expect(output.read).to eq <<-OUTPUT
40
+ #{tstp_1} debug
41
+
42
+ \e[1m\e[33m#{tstp_1} !> notice
43
+ \e[0m
44
+ \e[1m\e[37m#{tstp_2} ~> STATUS
45
+ \e[0m#{tstp_2} multi
46
+ #{tstp_2} line
47
+ #{tstp_2} debug
48
+
49
+ \e[1m\e[33m#{tstp_2} !> WARNING: multi
50
+ #{tstp_2} !> line
51
+ #{tstp_2} !> warning
52
+ \e[0m#{tstp_3} ~ multi
53
+ #{tstp_3} ~ line
54
+ #{tstp_3} ~ substatus
55
+ OUTPUT
56
+ end
57
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe EY::Serverside::Source::Archive do
4
+ before do
5
+ allow_any_instance_of(described_class).to receive(:runner) { RunnerDouble }
6
+ end
7
+
8
+ context "source" do
9
+ let(:shell) { ShellDouble.new }
10
+ subject {
11
+ described_class.new(shell,
12
+ :uri => "http://server.com/app.war",
13
+ :repository_cache => TMPDIR)
14
+ }
15
+
16
+ it "cleans cache" do
17
+ expect(subject).to respond_to(:gc_repository_cache)
18
+ end
19
+
20
+ it "compares revisions" do
21
+ expect(subject.same?("1", "1")).to be
22
+ end
23
+
24
+ it "understands short log message" do
25
+ expect(subject).to respond_to(:short_log_message)
26
+ end
27
+
28
+ it "updates the cache" do
29
+ subject.update_repository_cache
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe EY::Serverside::Source::Git do
4
+ before do
5
+ allow_any_instance_of(described_class).to receive(:runner) { RunnerDouble }
6
+ end
7
+
8
+ it "errors when required options are not used" do
9
+ expect { described_class.new(nil, {}) }.to raise_error(ArgumentError)
10
+ end
11
+
12
+ context "source" do
13
+ let(:shell) { ShellDouble.new }
14
+ subject {
15
+ described_class.new(shell,
16
+ :uri => "engineyard/engineyard-serverside.git",
17
+ :ref => "",
18
+ :repository_cache => "cache_dir")
19
+ }
20
+
21
+ it "creates the correct reivison file command" do
22
+ expect(subject.create_revision_file_command("directory/REVISION")).to eq(
23
+ "git --git-dir cache_dir/.git --work-tree cache_dir show --pretty=format:\"%H\" | head -1 > \"directory/REVISION\""
24
+ )
25
+ end
26
+
27
+ it "runs gc" do
28
+ expect(subject.gc_repository_cache.output).to eq("git --git-dir cache_dir/.git --work-tree cache_dir gc")
29
+ expect(shell.messages.last).to eq("Garbage collecting cached git repository to reduce disk usage.")
30
+ end
31
+
32
+ it "checks if it is the same revision" do
33
+ expect(subject.same?("", "")).to be
34
+ end
35
+
36
+ it "runs a short log message" do
37
+ expect(subject.short_log_message("rev")).to eq(
38
+ "git --git-dir cache_dir/.git --work-tree cache_dir log --pretty=oneline --abbrev-commit -n 1 'rev'"
39
+ )
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,355 @@
1
+ $LOAD_PATH.push File.expand_path("../lib", File.dirname(__FILE__))
2
+
3
+ unless defined?(Bundler)
4
+ require 'rubygems'
5
+ end
6
+
7
+ if ENV['COVERAGE']
8
+ # Ruby 1.9.x only.
9
+ require 'simplecov'
10
+ SimpleCov.start do
11
+ add_filter "lib/vendor/"
12
+ end
13
+ end
14
+
15
+ require 'pp'
16
+ require 'engineyard-serverside'
17
+ require 'engineyard-serverside-adapter'
18
+ require 'support/integration'
19
+ require 'support/source_doubles'
20
+ require 'support/timecop'
21
+
22
+ FIXTURES_DIR = Pathname.new(__FILE__).dirname.join("fixtures")
23
+ TMPDIR = Pathname.new(__FILE__).dirname.parent.join('tmp')
24
+ GROUP = `id -gn`.strip
25
+ INTERNAL_KEY = Pathname.new("~/.ssh/id_rsa").expand_path
26
+
27
+ module EY
28
+ module Serverside
29
+ def self.dna_json=(j)
30
+ @dna_json = j
31
+ @node = nil
32
+ end
33
+ end
34
+ end
35
+
36
+ module SpecDependencyHelpers
37
+ $NPM_INSTALLED = system('which npm 2>&1')
38
+ unless $NPM_INSTALLED
39
+ $stderr.puts "npm not found; skipping Node.js specs."
40
+ end
41
+
42
+ def with_npm_mocked(&block)
43
+ context("mocked") { yield true }
44
+ context("unmocked") { yield false } if $NPM_INSTALLED
45
+ end
46
+
47
+ $COMPOSER_INSTALLED = system('command -v composer > /dev/null')
48
+ if $COMPOSER_INSTALLED
49
+ $stderr.puts "composer found; skipping tests that expect it to be missing."
50
+ else
51
+ $stderr.puts "composer not found; skipping tests that expect it to be available."
52
+ end
53
+
54
+ def with_composer_mocked(&block)
55
+ context("mocked") { yield true }
56
+ context("unmocked") { yield false } if $COMPOSER_INSTALLED
57
+ end
58
+ end
59
+
60
+ RSpec.configure do |config|
61
+ config.extend SpecDependencyHelpers
62
+
63
+ config.before(:all) do
64
+ make_tmpdir
65
+ EY::Serverside.dna_json = MultiJson.dump({})
66
+ end
67
+
68
+ config.after(:all) do
69
+ delete_tmpdir
70
+ end
71
+
72
+ class VerboseStringIO < StringIO
73
+ def <<(str)
74
+ if ENV['VERBOSE'] || ENV['DEBUG']
75
+ STDERR << str
76
+ end
77
+ super
78
+ end
79
+ end
80
+
81
+ def tmpdir
82
+ TMPDIR
83
+ end
84
+
85
+ def make_tmpdir
86
+ tmpdir.mkpath
87
+ end
88
+
89
+ def delete_tmpdir
90
+ tmpdir.exist? && tmpdir.rmtree
91
+ end
92
+
93
+ def stdout
94
+ @stdout ||= VerboseStringIO.new
95
+ end
96
+
97
+ def stderr
98
+ @stderr ||= VerboseStringIO.new
99
+ end
100
+
101
+ def read_stdout
102
+ stdout.rewind
103
+ stdout.read
104
+ end
105
+
106
+ def read_stderr
107
+ stderr.rewind
108
+ stderr.read
109
+ end
110
+
111
+ def read_output
112
+ read_stdout + "\n" + read_stderr
113
+ end
114
+
115
+ def capture
116
+ begin
117
+ $stdout = @stdout = VerboseStringIO.new
118
+ $stderr = @stderr = VerboseStringIO.new
119
+ yield
120
+ ensure
121
+ $stdout, $stderr = STDOUT, STDERR
122
+ end
123
+ end
124
+
125
+ def test_shell(verbose=true)
126
+ @test_shell ||= begin
127
+ @log_path = tmpdir.join("serverside-deploy-#{Time.now.to_f}-#{$$}.log")
128
+ EY::Serverside::Shell.new(:verbose => verbose, :log_path => @log_path, :stdout => stdout, :stderr => stderr)
129
+ end
130
+ end
131
+
132
+ def exist
133
+ be_exist
134
+ end
135
+
136
+ def bindir
137
+ @bindir ||= begin
138
+ dir = tmpdir.join("ey_test_cmds_#{Time.now.to_f}_#{$$}")
139
+ dir.mkpath
140
+ dir
141
+ end
142
+ end
143
+
144
+ def mock_command(cmd, contents, &block)
145
+ bindir.join(cmd).open('w') do |f|
146
+ f.write contents
147
+ f.chmod(0755)
148
+ end
149
+ with_mocked_commands(&block) if block_given?
150
+ end
151
+
152
+ def mock_bundler(failure = false, &block)
153
+ mock_command('bundle', <<-SCRIPT, &block)
154
+ #!#{`which ruby`}
155
+ puts "Bundling gems"
156
+ $stdout.flush
157
+ #{failure && '$stderr.puts "bundle install failure"; exit 1'}
158
+ SCRIPT
159
+ end
160
+
161
+ def mock_npm(&block)
162
+ mock_command('npm', <<-SCRIPT, &block)
163
+ #!/bin/bash
164
+ echo "Running npm with $@"
165
+ SCRIPT
166
+ end
167
+
168
+ def mock_composer(&block)
169
+ mock_command('composer', <<-SCRIPT, &block)
170
+ #!/bin/bash
171
+ echo "Running composer with $@"
172
+ SCRIPT
173
+ end
174
+
175
+ def mock_sudo(&block)
176
+ mock_command('sudo', <<-SCRIPT, &block)
177
+ #!/bin/bash
178
+ echo "$@"
179
+ exec "$@"
180
+ SCRIPT
181
+ end
182
+
183
+ def with_mocked_commands(&block)
184
+ with_env('PATH' => "#{bindir}:#{ENV['PATH']}", &block)
185
+ end
186
+
187
+ def with_env(new_env_vars)
188
+ raise ArgumentError, "with_env takes a block" unless block_given?
189
+
190
+ old_env_vars = {}
191
+ new_env_vars.each do |k, v|
192
+ if ENV.has_key?(k)
193
+ old_env_vars[k] = ENV[k]
194
+ end
195
+ ENV[k] = v if v
196
+ end
197
+
198
+ yield
199
+ ensure
200
+ new_env_vars.keys.each do |k|
201
+ if old_env_vars.has_key?(k)
202
+ ENV[k] = old_env_vars[k]
203
+ else
204
+ ENV.delete(k)
205
+ end
206
+ end
207
+ end
208
+
209
+
210
+ def deploy_dir
211
+ @deploy_dir ||= tmpdir.join("serverside-deploy-#{Time.now.to_f}-#{$$}")
212
+ end
213
+
214
+ def whoami
215
+ ENV['USER']
216
+ end
217
+
218
+ # set up EY::Serverside::Server like we're on a solo
219
+ def test_servers
220
+ @test_servers ||= EY::Serverside::Servers.from_hashes([{:hostname => 'localhost', :roles => %w[solo], :user => whoami}], test_shell)
221
+ end
222
+
223
+ def default_configuration
224
+ {
225
+ "source_class" => "IntegrationSpec",
226
+ "deploy_to" => deploy_dir.to_s,
227
+ "group" => GROUP,
228
+ "stack" => 'nginx_passenger',
229
+ "migrate" => "ruby -e 'puts ENV[\"PATH\"]' > #{deploy_dir}/path-when-migrating",
230
+ "app" => 'rails31',
231
+ "environment_name" => 'env',
232
+ "account_name" => 'acc',
233
+ "framework_env" => 'staging',
234
+ "branch" => 'somebranch',
235
+ "verbose" => true,
236
+ "git" => FIXTURES_DIR.join('repos', 'default'),
237
+ }
238
+ end
239
+
240
+ def test_adapter(repo_fixture_name = 'default', extra_config = {})
241
+ options = default_configuration.merge({ "git" => FIXTURES_DIR.join('repos', repo_fixture_name)}).merge(extra_config)
242
+
243
+ # pretend there is a shared bundled_gems directory
244
+ deploy_dir.join('shared', 'bundled_gems').mkpath
245
+ %w(RUBY_VERSION SYSTEM_VERSION).each do |name|
246
+ deploy_dir.join('shared', 'bundled_gems', name).open("w") { |f| f.write("old\n") }
247
+ end
248
+
249
+ EY::Serverside::Adapter.new do |args|
250
+ args.app = options['app']
251
+ args.environment_name = options['environment_name']
252
+ args.account_name = options['account_name']
253
+ args.migrate = options['migrate']
254
+ args.ref = options['branch']
255
+ args.git = options['git']
256
+ args.serverside_version = Gem::Version.create(EY::Serverside::VERSION.dup).release
257
+ args.config = {
258
+ "services_check_command" => "which echo",
259
+ "services_setup_command" => "echo 'services setup command'",
260
+ "source_class" => options["source_class"],
261
+ "deploy_to" => options["deploy_to"],
262
+ "group" => options["group"],
263
+ }.merge(options['config'] || {})
264
+ args.framework_env = options['framework_env']
265
+ args.stack = options['stack']
266
+ args.verbose = options['verbose']
267
+ args.clean = options['clean']
268
+ args.instances = test_servers.map {|s| {:hostname => s.hostname, :roles => s.roles.to_a, :name => s.name} }
269
+ end
270
+ end
271
+
272
+ # When a repo fixture name is specified, the files found in the specified
273
+ # spec/fixtures/repos dir are copied into the test github repository.
274
+ def deploy_test_application(repo_fixture_name = 'default', extra_config = {}, &block)
275
+ Timecop.travel(1)
276
+ @adapter = test_adapter(repo_fixture_name, extra_config)
277
+ @argv = @adapter.deploy.commands.last.to_argv[2..-1]
278
+
279
+ FullTestDeploy.on_create_callback = block
280
+
281
+ mock_bundler(extra_config['bundle_install_fails'])
282
+ with_mocked_commands do
283
+ capture do
284
+ EY::Serverside::CLI.start(@argv)
285
+ end
286
+ end
287
+ ensure
288
+ @deployer = EY::Serverside::Deploy.deployer
289
+ @config = EY::Serverside::Deploy.config
290
+ end
291
+
292
+ def redeploy_test_application(extra_config = {}, &block)
293
+ Timecop.travel(1)
294
+ raise "Please deploy_test_application first" unless @argv
295
+ bundle_install_fails = extra_config.delete('bundle_install_fails')
296
+
297
+ @action = @adapter.deploy do |args|
298
+ extra_config.each do |key,val|
299
+ case key
300
+ when 'branch' then args.ref = val
301
+ when 'config' then args.config = args.config.merge(val || {})
302
+ else args.send("#{key}=", val)
303
+ end
304
+ end
305
+ end
306
+
307
+ @argv = @action.commands.last.to_argv[2..-1]
308
+
309
+ FullTestDeploy.on_create_callback = block
310
+
311
+ mock_bundler(bundle_install_fails)
312
+
313
+ with_mocked_commands do
314
+ capture do
315
+ EY::Serverside::CLI.start(@argv)
316
+ end
317
+ end
318
+ ensure
319
+ @deployer = EY::Serverside::Deploy.deployer
320
+ @config = EY::Serverside::Deploy.config
321
+ end
322
+
323
+ def enable_maintenance(extra_adapter_config = {})
324
+ @adapter = test_adapter("default", extra_adapter_config)
325
+ @argv = @adapter.enable_maintenance.commands.last.to_argv[2..-1]
326
+
327
+ with_mocked_commands do
328
+ capture do
329
+ EY::Serverside::CLI.start(@argv)
330
+ end
331
+ end
332
+ end
333
+
334
+ def disable_maintenance(extra_adapter_config = {})
335
+ @adapter = test_adapter("default", extra_adapter_config)
336
+ @argv = @adapter.disable_maintenance.commands.last.to_argv[2..-1]
337
+
338
+ with_mocked_commands do
339
+ capture do
340
+ EY::Serverside::CLI.start(@argv)
341
+ end
342
+ end
343
+ end
344
+
345
+ def maintenance_status(extra_adapter_config = {})
346
+ @adapter = test_adapter("default", extra_adapter_config)
347
+ @argv = @adapter.maintenance_status.commands.last.to_argv[2..-1]
348
+
349
+ with_mocked_commands do
350
+ capture do
351
+ EY::Serverside::CLI.start(@argv)
352
+ end
353
+ end
354
+ end
355
+ end