engineyard 0.2.11 → 0.2.12

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 (38) hide show
  1. data/lib/engineyard.rb +4 -3
  2. data/lib/engineyard/#repo.rb# +24 -0
  3. data/lib/engineyard/account.rb +32 -11
  4. data/lib/engineyard/account/api_struct.rb +25 -0
  5. data/lib/engineyard/account/app.rb +11 -10
  6. data/lib/engineyard/account/app_master.rb +1 -7
  7. data/lib/engineyard/account/environment.rb +31 -16
  8. data/lib/engineyard/account/instance.rb +6 -0
  9. data/lib/engineyard/account/log.rb +7 -16
  10. data/lib/engineyard/action/deploy.rb +138 -0
  11. data/lib/engineyard/action/list_environments.rb +22 -0
  12. data/lib/engineyard/action/rebuild.rb +31 -0
  13. data/lib/engineyard/action/show_logs.rb +26 -0
  14. data/lib/engineyard/action/ssh.rb +19 -0
  15. data/lib/engineyard/action/upload_recipes.rb +17 -0
  16. data/lib/engineyard/action/util.rb +47 -0
  17. data/lib/engineyard/cli.rb +24 -150
  18. data/lib/engineyard/cli/thor_fixes.rb +26 -0
  19. data/lib/engineyard/error.rb +48 -0
  20. data/lib/engineyard/repo.rb +1 -1
  21. data/lib/engineyard/ruby_ext.rb +9 -0
  22. data/spec/engineyard/account/api_struct_spec.rb +37 -0
  23. data/spec/engineyard/account/environment_spec.rb +20 -0
  24. data/spec/engineyard/account_spec.rb +18 -0
  25. data/spec/engineyard/cli_spec.rb +3 -3
  26. data/spec/ey/deploy_spec.rb +166 -28
  27. data/spec/ey/ey_spec.rb +3 -3
  28. data/spec/ey/list_environments_spec.rb +16 -0
  29. data/spec/ey/logs_spec.rb +2 -17
  30. data/spec/ey/rebuild_spec.rb +25 -0
  31. data/spec/ey/ssh_spec.rb +24 -0
  32. data/spec/ey/upload_recipes_spec.rb +21 -0
  33. data/spec/spec_helper.rb +32 -0
  34. data/spec/support/fake_awsm.ru +25 -1
  35. data/spec/support/helpers.rb +72 -7
  36. metadata +44 -56
  37. data/lib/engineyard/cli/error.rb +0 -44
  38. data/spec/spec.opts +0 -2
@@ -40,6 +40,14 @@ class FakeAwsm < Sinatra::Base
40
40
  end
41
41
  end
42
42
 
43
+ put "/git_remote" do
44
+ FindableGitRemote.remote = if (!params[:remote] || params[:remote].empty?)
45
+ nil
46
+ else
47
+ params[:remote]
48
+ end
49
+ end
50
+
43
51
  get "/api/v2/apps" do
44
52
  {"apps" => @@scenario.apps}.to_json
45
53
  end
@@ -52,6 +60,14 @@ class FakeAwsm < Sinatra::Base
52
60
  {"logs" => @@scenario.logs(params[:env_id])}.to_json
53
61
  end
54
62
 
63
+ post "/api/v2/environments/:env_id/recipes" do
64
+ {}.to_json
65
+ end
66
+
67
+ put "/api/v2/environments/:env_id/rebuild" do
68
+ {}.to_json
69
+ end
70
+
55
71
  post "/api/v2/authenticate" do
56
72
  if valid_user?
57
73
  {"api_token" => "deadbeef", "ok" => true}.to_json
@@ -69,11 +85,19 @@ private
69
85
  end
70
86
 
71
87
  module FindableGitRemote
88
+ class << self
89
+ attr_accessor :remote
90
+ end
91
+
92
+ def git_remote
93
+ FindableGitRemote.remote || local_git_remote
94
+ end
95
+
72
96
  # Since we have to find something in `git remote -v` that
73
97
  # corresponds to an app in cloud.ey in order to do anything, we
74
98
  # simulate this by faking out the API to have whatever git
75
99
  # remote we'll find anyway.
76
- def git_remote
100
+ def local_git_remote
77
101
  remotes = []
78
102
  `git remote -v`.each_line do |line|
79
103
  parts = line.split(/\t/)
@@ -1,21 +1,59 @@
1
1
  require 'ey_merkin'
2
2
  require "rest_client"
3
+ require 'open4'
3
4
 
4
5
  module Spec
5
6
  module Helpers
6
- def ey(cmd = nil, options = {})
7
+ class UnexpectedExit < StandardError
8
+ def initialize(stdout, stderr)
9
+ @stdout, @stderr = stdout, stderr
10
+ end
11
+
12
+ def message
13
+ "Exited with an unexpected exit code\n---STDOUT---\n#{@stdout}\n---STDERR---\n#{@stderr}\n"
14
+ end
15
+ end
16
+ NonzeroExitStatus = Class.new(UnexpectedExit)
17
+ ZeroExitStatus = Class.new(UnexpectedExit)
18
+
19
+ def ey(cmd = nil, options = {}, &block)
7
20
  require "open3"
8
21
  hide_err = options.delete(:hide_err)
9
- ENV['DEBUG'] = options.delete(:debug)
22
+ path_prepends = options.delete(:prepend_to_path)
23
+
24
+ ey_env = {
25
+ 'DEBUG' => options[:debug].to_s
26
+ }
27
+
28
+ if path_prepends
29
+ tempdir = File.join(Dir.tmpdir, "ey_test_cmds_#{Time.now.tv_sec}#{Time.now.tv_usec}_#{$$}")
30
+ Dir.mkdir(tempdir)
31
+ path_prepends.each do |name, contents|
32
+ File.open(File.join(tempdir, name), 'w') do |f|
33
+ f.write(contents)
34
+ f.chmod(0755)
35
+ end
36
+ end
37
+
38
+ ey_env['PATH'] = tempdir + ':' + ENV['PATH']
39
+ end
10
40
 
11
- args = options.map { |k,v| "--#{k} #{v}"}.join(" ")
12
41
  eybin = File.expand_path('../bundled_ey', __FILE__)
13
42
 
14
- @in, @out, @err = Open3.popen3("#{eybin} #{cmd} #{args}")
43
+ with_env(ey_env) do
44
+ exit_status = Open4::open4("#{eybin} #{cmd}") do |pid, stdin, stdout, stderr|
45
+ block.call(stdin) if block
46
+ @err = stderr.read_available_bytes
47
+ @out = stdout.read_available_bytes
48
+ end
49
+
50
+ if !exit_status.success? && !options[:expect_failure]
51
+ raise NonzeroExitStatus.new(@out, @err)
52
+ elsif exit_status.success? && options[:expect_failure]
53
+ raise ZeroExitStatus.new(@out, @err)
54
+ end
55
+ end
15
56
 
16
- yield @in if block_given?
17
- @err = @err.read_available_bytes
18
- @out = @out.read_available_bytes
19
57
  @ssh_commands = @out.split(/\n/).find_all do |line|
20
58
  line =~ /^ssh/
21
59
  end.map do |line|
@@ -31,6 +69,11 @@ module Spec
31
69
  raise "Setting scenario failed: #{response.inspect}" unless response.code == 200
32
70
  end
33
71
 
72
+ def api_git_remote(remote)
73
+ response = ::RestClient.put(EY.fake_awsm + '/git_remote', {"remote" => remote}, {})
74
+ raise "Setting git remote failed: #{response.inspect}" unless response.code == 200
75
+ end
76
+
34
77
  def read_yaml(file="ey.yml")
35
78
  YAML.load_file(File.expand_path(file))
36
79
  end
@@ -38,6 +81,28 @@ module Spec
38
81
  def write_yaml(data, file = "ey.yml")
39
82
  File.open(file, "w"){|f| YAML.dump(data, f) }
40
83
  end
84
+
85
+ def with_env(new_env_vars)
86
+ raise ArgumentError, "with_env takes a block" unless block_given?
87
+ old_env_vars = {}
88
+ new_env_vars.each do |k, v|
89
+ if ENV.has_key?(k)
90
+ old_env_vars[k] = ENV[k]
91
+ end
92
+ ENV[k] = v
93
+ end
94
+
95
+ retval = yield
96
+
97
+ new_env_vars.keys.each do |k|
98
+ if old_env_vars.has_key?(k)
99
+ ENV[k] = old_env_vars[k]
100
+ else
101
+ ENV.delete(k)
102
+ end
103
+ end
104
+ retval
105
+ end
41
106
  end
42
107
  end
43
108
 
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: engineyard
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 2
9
- - 11
10
- version: 0.2.11
8
+ - 12
9
+ version: 0.2.12
11
10
  platform: ruby
12
11
  authors:
13
12
  - EY Cloud Team
@@ -15,80 +14,70 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-04-28 00:00:00 -07:00
17
+ date: 2010-05-07 00:00:00 -07:00
19
18
  default_executable: ey
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
- version_requirements: &id001 !ruby/object:Gem::Requirement
23
- none: false
21
+ prerelease: false
22
+ name: termios
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- hash: 3
28
27
  segments:
29
28
  - 0
30
29
  version: "0"
31
- name: termios
32
- requirement: *id001
33
- prerelease: false
34
30
  type: :runtime
31
+ version_requirements: *id001
35
32
  - !ruby/object:Gem::Dependency
36
- version_requirements: &id002 !ruby/object:Gem::Requirement
37
- none: false
33
+ prerelease: false
34
+ name: highline
35
+ requirement: &id002 !ruby/object:Gem::Requirement
38
36
  requirements:
39
37
  - - ">="
40
38
  - !ruby/object:Gem::Version
41
- hash: 3
42
39
  segments:
43
40
  - 0
44
41
  version: "0"
45
- name: highline
46
- requirement: *id002
47
- prerelease: false
48
42
  type: :runtime
43
+ version_requirements: *id002
49
44
  - !ruby/object:Gem::Dependency
50
- version_requirements: &id003 !ruby/object:Gem::Requirement
51
- none: false
45
+ prerelease: false
46
+ name: thor
47
+ requirement: &id003 !ruby/object:Gem::Requirement
52
48
  requirements:
53
49
  - - ">="
54
50
  - !ruby/object:Gem::Version
55
- hash: 3
56
51
  segments:
57
52
  - 0
58
53
  version: "0"
59
- name: thor
60
- requirement: *id003
61
- prerelease: false
62
54
  type: :runtime
55
+ version_requirements: *id003
63
56
  - !ruby/object:Gem::Dependency
64
- version_requirements: &id004 !ruby/object:Gem::Requirement
65
- none: false
57
+ prerelease: false
58
+ name: json
59
+ requirement: &id004 !ruby/object:Gem::Requirement
66
60
  requirements:
67
61
  - - ">="
68
62
  - !ruby/object:Gem::Version
69
- hash: 3
70
63
  segments:
71
64
  - 0
72
65
  version: "0"
73
- name: json
74
- requirement: *id004
75
- prerelease: false
76
66
  type: :runtime
67
+ version_requirements: *id004
77
68
  - !ruby/object:Gem::Dependency
78
- version_requirements: &id005 !ruby/object:Gem::Requirement
79
- none: false
69
+ prerelease: false
70
+ name: rest-client
71
+ requirement: &id005 !ruby/object:Gem::Requirement
80
72
  requirements:
81
73
  - - ~>
82
74
  - !ruby/object:Gem::Version
83
- hash: 7
84
75
  segments:
85
76
  - 1
86
77
  - 4
87
78
  version: "1.4"
88
- name: rest-client
89
- requirement: *id005
90
- prerelease: false
91
79
  type: :runtime
80
+ version_requirements: *id005
92
81
  description: This gem allows you to deploy your rails application to the Engine Yard cloud directly from the command line.
93
82
  email: cloud@engineyard.com
94
83
  executables:
@@ -99,36 +88,33 @@ extra_rdoc_files: []
99
88
 
100
89
  files:
101
90
  - bin/ey
91
+ - lib/engineyard/#repo.rb#
92
+ - lib/engineyard/account/api_struct.rb
102
93
  - lib/engineyard/account/app.rb
103
94
  - lib/engineyard/account/app_master.rb
104
95
  - lib/engineyard/account/environment.rb
96
+ - lib/engineyard/account/instance.rb
105
97
  - lib/engineyard/account/log.rb
106
98
  - lib/engineyard/account.rb
99
+ - lib/engineyard/action/deploy.rb
100
+ - lib/engineyard/action/list_environments.rb
101
+ - lib/engineyard/action/rebuild.rb
102
+ - lib/engineyard/action/show_logs.rb
103
+ - lib/engineyard/action/ssh.rb
104
+ - lib/engineyard/action/upload_recipes.rb
105
+ - lib/engineyard/action/util.rb
107
106
  - lib/engineyard/api.rb
108
107
  - lib/engineyard/cli/api.rb
109
- - lib/engineyard/cli/error.rb
108
+ - lib/engineyard/cli/thor_fixes.rb
110
109
  - lib/engineyard/cli/ui.rb
111
110
  - lib/engineyard/cli.rb
112
111
  - lib/engineyard/config.rb
112
+ - lib/engineyard/error.rb
113
113
  - lib/engineyard/repo.rb
114
+ - lib/engineyard/ruby_ext.rb
114
115
  - lib/engineyard.rb
115
116
  - LICENSE
116
117
  - README.rdoc
117
- - spec/engineyard/api_spec.rb
118
- - spec/engineyard/cli/api_spec.rb
119
- - spec/engineyard/cli_spec.rb
120
- - spec/engineyard/config_spec.rb
121
- - spec/engineyard/repo_spec.rb
122
- - spec/engineyard_spec.rb
123
- - spec/ey/deploy_spec.rb
124
- - spec/ey/ey_spec.rb
125
- - spec/ey/logs_spec.rb
126
- - spec/spec.opts
127
- - spec/spec_helper.rb
128
- - spec/support/bundled_ey
129
- - spec/support/fake_awsm.ru
130
- - spec/support/helpers.rb
131
- - spec/support/ruby_ext.rb
132
118
  has_rdoc: true
133
119
  homepage: http://engineyard.com
134
120
  licenses: []
@@ -139,31 +125,30 @@ rdoc_options: []
139
125
  require_paths:
140
126
  - lib
141
127
  required_ruby_version: !ruby/object:Gem::Requirement
142
- none: false
143
128
  requirements:
144
129
  - - ">="
145
130
  - !ruby/object:Gem::Version
146
- hash: 3
147
131
  segments:
148
132
  - 0
149
133
  version: "0"
150
134
  required_rubygems_version: !ruby/object:Gem::Requirement
151
- none: false
152
135
  requirements:
153
136
  - - ">="
154
137
  - !ruby/object:Gem::Version
155
- hash: 3
156
138
  segments:
157
139
  - 0
158
140
  version: "0"
159
141
  requirements: []
160
142
 
161
143
  rubyforge_project:
162
- rubygems_version: 1.3.7.pre.1
144
+ rubygems_version: 1.3.6
163
145
  signing_key:
164
146
  specification_version: 3
165
147
  summary: Command-line deployment for the Engine Yard cloud
166
148
  test_files:
149
+ - spec/engineyard/account/api_struct_spec.rb
150
+ - spec/engineyard/account/environment_spec.rb
151
+ - spec/engineyard/account_spec.rb
167
152
  - spec/engineyard/api_spec.rb
168
153
  - spec/engineyard/cli/api_spec.rb
169
154
  - spec/engineyard/cli_spec.rb
@@ -172,8 +157,11 @@ test_files:
172
157
  - spec/engineyard_spec.rb
173
158
  - spec/ey/deploy_spec.rb
174
159
  - spec/ey/ey_spec.rb
160
+ - spec/ey/list_environments_spec.rb
175
161
  - spec/ey/logs_spec.rb
176
- - spec/spec.opts
162
+ - spec/ey/rebuild_spec.rb
163
+ - spec/ey/ssh_spec.rb
164
+ - spec/ey/upload_recipes_spec.rb
177
165
  - spec/spec_helper.rb
178
166
  - spec/support/bundled_ey
179
167
  - spec/support/fake_awsm.ru
@@ -1,44 +0,0 @@
1
- module EY
2
- class CLI < Thor
3
- class NoAppError < EY::Error
4
- def initialize(repo)
5
- @repo = repo
6
- end
7
-
8
- def message
9
- error = [%|There is no application configured for any of the following remotes:|]
10
- @repo.urls.each{|url| error << %|\t#{url}| }
11
- error << %|You can add this application at #{EY.config.endpoint}|
12
- error.join("\n")
13
- end
14
- end
15
-
16
- class EnvironmentError < EY::Error
17
- end
18
-
19
- class NoEnvironmentError < EnvironmentError
20
- def message
21
- "No environment named '#{env_name}'\nYou can create one at #{EY.config.endpoint}"
22
- end
23
- end
24
-
25
- class BranchMismatch < EY::Error
26
- def initialize(default_branch, branch)
27
- super(nil)
28
- @default_branch, @branch = default_branch, branch
29
- end
30
-
31
- def message
32
- %|Your deploy branch is set to "#{@default_branch}".\n| +
33
- %|If you want to deploy branch "#{@branch}", use --force.|
34
- end
35
- end
36
-
37
- class DeployArgumentError < EY::Error
38
- def message
39
- %|"deploy" was called incorrectly. Call as "deploy [ENVIRONMENT] [BRANCH]"\n| +
40
- %|You can set default environments and branches in ey.yml|
41
- end
42
- end
43
- end
44
- end
data/spec/spec.opts DELETED
@@ -1,2 +0,0 @@
1
- --color
2
- --format specdoc