engineyard 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/engineyard/cli.rb +19 -7
- data/lib/engineyard/cli/ui.rb +22 -15
- data/lib/engineyard/cli/web.rb +8 -4
- data/lib/engineyard/model/environment.rb +8 -8
- data/lib/engineyard/model/instance.rb +17 -13
- data/lib/engineyard/version.rb +1 -1
- data/spec/ey/deploy_spec.rb +4 -3
- data/spec/ey/list_environments_spec.rb +17 -1
- data/spec/ey/logs_spec.rb +1 -1
- data/spec/ey/rollback_spec.rb +2 -1
- data/spec/ey/ssh_spec.rb +1 -1
- data/spec/ey/web/disable_spec.rb +1 -0
- data/spec/ey/web/enable_spec.rb +1 -0
- data/spec/support/fake_awsm.ru +12 -3
- data/spec/support/helpers.rb +4 -2
- data/spec/support/shared_behavior.rb +6 -0
- metadata +3 -3
data/lib/engineyard/cli.rb
CHANGED
@@ -40,6 +40,8 @@ module EY
|
|
40
40
|
:desc => "Git ref to deploy. May be a branch, a tag, or a SHA."
|
41
41
|
method_option :app, :type => :string, :aliases => %w(-a),
|
42
42
|
:desc => "Name of the application to deploy"
|
43
|
+
method_option :verbose, :type => :boolean, :aliases => %w(-v),
|
44
|
+
:desc => "Be verbose"
|
43
45
|
def deploy
|
44
46
|
app = fetch_app(options[:app])
|
45
47
|
environment = fetch_environment(options[:environment], app)
|
@@ -56,9 +58,9 @@ module EY
|
|
56
58
|
|
57
59
|
loudly_check_eysd(environment)
|
58
60
|
|
59
|
-
EY.ui.info "
|
61
|
+
EY.ui.info "Beginning deploy for '#{app.name}' in '#{environment.name}' on server..."
|
60
62
|
|
61
|
-
if environment.deploy(app, deploy_ref, options[:migrate])
|
63
|
+
if environment.deploy(app, deploy_ref, options[:migrate], options[:verbose])
|
62
64
|
EY.ui.info "Deploy complete"
|
63
65
|
else
|
64
66
|
raise EY::Error, "Deploy failed"
|
@@ -77,10 +79,18 @@ module EY
|
|
77
79
|
DESC
|
78
80
|
|
79
81
|
method_option :all, :type => :boolean, :aliases => %(-a)
|
82
|
+
method_option :simple, :type => :boolean, :aliases => %(-s)
|
80
83
|
def environments
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
+
if options[:all] && options[:simple]
|
85
|
+
# just put each env
|
86
|
+
api.environments.each do |env|
|
87
|
+
puts env.name
|
88
|
+
end
|
89
|
+
else
|
90
|
+
apps = get_apps(options[:all])
|
91
|
+
EY.ui.warn(NoAppError.new(repo).message) unless apps.any? || options[:all]
|
92
|
+
EY.ui.print_envs(apps, EY.config.default_environment, options[:simple])
|
93
|
+
end
|
84
94
|
end
|
85
95
|
map "envs" => :environments
|
86
96
|
|
@@ -113,14 +123,16 @@ module EY
|
|
113
123
|
:desc => "Environment in which to roll back the application"
|
114
124
|
method_option :app, :type => :string, :aliases => %w(-a),
|
115
125
|
:desc => "Name of the application to roll back"
|
126
|
+
method_option :verbose, :type => :boolean, :aliases => %w(-v),
|
127
|
+
:desc => "Be verbose"
|
116
128
|
def rollback
|
117
129
|
app = fetch_app(options[:app])
|
118
130
|
env = fetch_environment(options[:environment], app)
|
119
131
|
|
120
132
|
loudly_check_eysd(env)
|
121
133
|
|
122
|
-
EY.ui.info("Rolling back #{env.name}")
|
123
|
-
if env.rollback(app)
|
134
|
+
EY.ui.info("Rolling back '#{app.name}' in '#{env.name}'")
|
135
|
+
if env.rollback(app, options[:verbose])
|
124
136
|
EY.ui.info "Rollback complete"
|
125
137
|
else
|
126
138
|
raise EY::Error, "Rollback failed"
|
data/lib/engineyard/cli/ui.rb
CHANGED
@@ -59,25 +59,32 @@ module EY
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
def print_envs(apps, default_env_name = nil)
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
62
|
+
def print_envs(apps, default_env_name = nil, simple = false)
|
63
|
+
if simple
|
64
|
+
envs = apps.map{ |a| a.environments }
|
65
|
+
envs.flatten.map{|x| x.name}.uniq.each do |env|
|
66
|
+
puts env
|
67
|
+
end
|
68
|
+
else
|
69
|
+
apps.each do |app|
|
70
|
+
puts app.name
|
71
|
+
if app.environments.any?
|
72
|
+
app.environments.each do |env|
|
73
|
+
short_name = env.shorten_name_for(app)
|
68
74
|
|
69
|
-
|
70
|
-
|
75
|
+
icount = env.instances_count
|
76
|
+
iname = (icount == 1) ? "instance" : "instances"
|
71
77
|
|
72
|
-
|
78
|
+
default_text = env.name == default_env_name ? " [default]" : ""
|
73
79
|
|
74
|
-
|
80
|
+
puts " #{short_name}#{default_text} (#{icount} #{iname})"
|
81
|
+
end
|
82
|
+
else
|
83
|
+
puts " (This application is not in any environments; you can make one at #{EY.config.endpoint})"
|
75
84
|
end
|
76
|
-
else
|
77
|
-
puts " (This application is not in any environments; you can make one at #{EY.config.endpoint})"
|
78
|
-
end
|
79
85
|
|
80
|
-
|
86
|
+
puts ""
|
87
|
+
end
|
81
88
|
end
|
82
89
|
end
|
83
90
|
|
@@ -101,7 +108,7 @@ module EY
|
|
101
108
|
end
|
102
109
|
|
103
110
|
def set_color(string, color, bold=false)
|
104
|
-
$stdout.tty? ? super : string
|
111
|
+
($stdout.tty? || ENV['THOR_SHELL']) ? super : string
|
105
112
|
end
|
106
113
|
|
107
114
|
end
|
data/lib/engineyard/cli/web.rb
CHANGED
@@ -7,12 +7,14 @@ module EY
|
|
7
7
|
:desc => "Environment on which to take down the maintenance page"
|
8
8
|
method_option :app, :type => :string, :aliases => %w(-a),
|
9
9
|
:desc => "Name of the application whose maintenance page will be removed"
|
10
|
+
method_option :verbose, :type => :boolean, :aliases => %w(-v),
|
11
|
+
:desc => "Be verbose"
|
10
12
|
def enable
|
11
13
|
app = fetch_app(options[:app])
|
12
14
|
environment = fetch_environment(options[:environment], app)
|
13
15
|
loudly_check_eysd(environment)
|
14
|
-
EY.ui.info "Taking down maintenance page for #{environment.name}"
|
15
|
-
environment.take_down_maintenance_page(app)
|
16
|
+
EY.ui.info "Taking down maintenance page for '#{app.name}' in '#{environment.name}'"
|
17
|
+
environment.take_down_maintenance_page(app, options[:verbose])
|
16
18
|
end
|
17
19
|
|
18
20
|
desc "disable [--environment/-e ENVIRONMENT]",
|
@@ -32,12 +34,14 @@ module EY
|
|
32
34
|
:desc => "Environment on which to put up the maintenance page"
|
33
35
|
method_option :app, :type => :string, :aliases => %w(-a),
|
34
36
|
:desc => "Name of the application whose maintenance page will be put up"
|
37
|
+
method_option :verbose, :type => :boolean, :aliases => %w(-v),
|
38
|
+
:desc => "Be verbose"
|
35
39
|
def disable
|
36
40
|
app = fetch_app(options[:app])
|
37
41
|
environment = fetch_environment(options[:environment], app)
|
38
42
|
loudly_check_eysd(environment)
|
39
|
-
EY.ui.info "Putting up maintenance page for #{environment.name}"
|
40
|
-
environment.put_up_maintenance_page(app)
|
43
|
+
EY.ui.info "Putting up maintenance page for '#{app.name}' in '#{environment.name}'"
|
44
|
+
environment.put_up_maintenance_page(app, options[:verbose])
|
41
45
|
end
|
42
46
|
end
|
43
47
|
end
|
@@ -32,20 +32,20 @@ module EY
|
|
32
32
|
app_master!.ensure_eysd_present(&blk)
|
33
33
|
end
|
34
34
|
|
35
|
-
def deploy(app, ref, migration_command=nil)
|
36
|
-
app_master!.deploy(app, ref, migration_command, config)
|
35
|
+
def deploy(app, ref, migration_command=nil, verbose=false)
|
36
|
+
app_master!.deploy(app, ref, migration_command, config, verbose)
|
37
37
|
end
|
38
38
|
|
39
|
-
def rollback(app)
|
40
|
-
app_master!.rollback(app, config)
|
39
|
+
def rollback(app, verbose=false)
|
40
|
+
app_master!.rollback(app, config, verbose)
|
41
41
|
end
|
42
42
|
|
43
|
-
def take_down_maintenance_page(app)
|
44
|
-
app_master!.take_down_maintenance_page(app)
|
43
|
+
def take_down_maintenance_page(app, verbose=false)
|
44
|
+
app_master!.take_down_maintenance_page(app, verbose)
|
45
45
|
end
|
46
46
|
|
47
|
-
def put_up_maintenance_page(app)
|
48
|
-
app_master!.put_up_maintenance_page(app)
|
47
|
+
def put_up_maintenance_page(app, verbose=false)
|
48
|
+
app_master!.put_up_maintenance_page(app, verbose)
|
49
49
|
end
|
50
50
|
|
51
51
|
def rebuild
|
@@ -3,7 +3,7 @@ require 'escape'
|
|
3
3
|
module EY
|
4
4
|
module Model
|
5
5
|
class Instance < ApiStruct.new(:id, :role, :name, :status, :amazon_id, :public_hostname, :environment)
|
6
|
-
EYSD_VERSION = ENV["EY_DEPLOY_VERSION"] || "0.7.
|
6
|
+
EYSD_VERSION = ENV["EY_DEPLOY_VERSION"] || "0.7.1"
|
7
7
|
EXIT_STATUS = Hash.new { |h,k| raise EY::Error, "ey-deploy version checker exited with unknown status code #{k}" }
|
8
8
|
EXIT_STATUS.merge!({
|
9
9
|
255 => :ssh_failed,
|
@@ -14,7 +14,7 @@ module EY
|
|
14
14
|
alias :hostname :public_hostname
|
15
15
|
|
16
16
|
|
17
|
-
def deploy(app, ref, migration_command=nil, extra_configuration=nil)
|
17
|
+
def deploy(app, ref, migration_command=nil, extra_configuration=nil, verbose=false)
|
18
18
|
deploy_args = [
|
19
19
|
'--app', app.name,
|
20
20
|
'--repo', app.repository_uri,
|
@@ -30,10 +30,10 @@ module EY
|
|
30
30
|
deploy_args << "--migrate" << migration_command
|
31
31
|
end
|
32
32
|
|
33
|
-
invoke_eysd_deploy(deploy_args)
|
33
|
+
invoke_eysd_deploy(deploy_args, verbose)
|
34
34
|
end
|
35
35
|
|
36
|
-
def rollback(app, extra_configuration=nil)
|
36
|
+
def rollback(app, extra_configuration=nil, verbose=false)
|
37
37
|
deploy_args = ['rollback',
|
38
38
|
'--app', app.name,
|
39
39
|
'--stack', environment.stack_name,
|
@@ -43,16 +43,16 @@ module EY
|
|
43
43
|
deploy_args << '--config' << extra_configuration.to_json
|
44
44
|
end
|
45
45
|
|
46
|
-
invoke_eysd_deploy(deploy_args)
|
46
|
+
invoke_eysd_deploy(deploy_args, verbose)
|
47
47
|
end
|
48
48
|
|
49
49
|
|
50
|
-
def put_up_maintenance_page(app)
|
51
|
-
invoke_eysd_deploy(['enable_maintenance_page', '--app', app.name])
|
50
|
+
def put_up_maintenance_page(app, verbose=false)
|
51
|
+
invoke_eysd_deploy(['enable_maintenance_page', '--app', app.name], verbose)
|
52
52
|
end
|
53
53
|
|
54
|
-
def take_down_maintenance_page(app)
|
55
|
-
invoke_eysd_deploy(['disable_maintenance_page', '--app', app.name])
|
54
|
+
def take_down_maintenance_page(app, verbose=false)
|
55
|
+
invoke_eysd_deploy(['disable_maintenance_page', '--app', app.name], verbose)
|
56
56
|
end
|
57
57
|
|
58
58
|
|
@@ -76,7 +76,7 @@ module EY
|
|
76
76
|
if ENV["NO_SSH"]
|
77
77
|
:ok
|
78
78
|
else
|
79
|
-
ssh "#{gem_path} list ey-deploy | grep \"ey-deploy \" | egrep -q '#{escaped_eysd_version}[,)]'"
|
79
|
+
ssh "#{gem_path} list ey-deploy | grep \"ey-deploy \" | egrep -q '#{escaped_eysd_version}[,)]'", false
|
80
80
|
EXIT_STATUS[$?.exitstatus]
|
81
81
|
end
|
82
82
|
end
|
@@ -100,7 +100,7 @@ module EY
|
|
100
100
|
|
101
101
|
cmd = Escape.shell_command(%w[ssh -o StrictHostKeyChecking=no -q] << "#{user}@#{hostname}" << remote_command)
|
102
102
|
cmd << " > /dev/null" unless output
|
103
|
-
|
103
|
+
EY.ui.debug(cmd)
|
104
104
|
unless ENV["NO_SSH"]
|
105
105
|
system cmd
|
106
106
|
else
|
@@ -108,7 +108,7 @@ module EY
|
|
108
108
|
end
|
109
109
|
end
|
110
110
|
|
111
|
-
def invoke_eysd_deploy(deploy_args)
|
111
|
+
def invoke_eysd_deploy(deploy_args, verbose=false)
|
112
112
|
start = [eysd_path, "_#{EYSD_VERSION}_", 'deploy']
|
113
113
|
instance_args = environment.instances.inject(['--instances']) do |command, inst|
|
114
114
|
instance_tuple = [inst.public_hostname, inst.role]
|
@@ -117,7 +117,11 @@ module EY
|
|
117
117
|
command << instance_tuple.join(',')
|
118
118
|
end
|
119
119
|
|
120
|
-
|
120
|
+
verbose_arg = verbose ? ['--verbose'] : []
|
121
|
+
|
122
|
+
cmd = Escape.shell_command(start + deploy_args + instance_args + verbose_arg)
|
123
|
+
puts cmd if verbose
|
124
|
+
ssh cmd
|
121
125
|
end
|
122
126
|
|
123
127
|
def eysd_path
|
data/lib/engineyard/version.rb
CHANGED
data/spec/ey/deploy_spec.rb
CHANGED
@@ -31,11 +31,12 @@ describe "ey deploy" do
|
|
31
31
|
cmd << " --environment #{options[:env]}" if options[:env]
|
32
32
|
cmd << " --app #{options[:app]}" if options[:app]
|
33
33
|
cmd << " --ref #{options[:ref]}" if options[:ref]
|
34
|
+
cmd << " --verbose" if options[:verbose]
|
34
35
|
cmd
|
35
36
|
end
|
36
37
|
|
37
38
|
def verify_ran(scenario)
|
38
|
-
@out.should match(/
|
39
|
+
@out.should match(/Beginning deploy for.*#{scenario[:application]}.*#{scenario[:environment]}/)
|
39
40
|
@ssh_commands.should have_command_like(/eysd.*deploy.*--app #{scenario[:application]}/)
|
40
41
|
end
|
41
42
|
|
@@ -62,7 +63,7 @@ describe "ey deploy" do
|
|
62
63
|
end
|
63
64
|
|
64
65
|
it "complains when environment is not specified and app is in >1 environment" do
|
65
|
-
api_scenario "one app,
|
66
|
+
api_scenario "one app, many environments"
|
66
67
|
ey "deploy", :expect_failure => true
|
67
68
|
@err.should match(/single environment.*2/i)
|
68
69
|
end
|
@@ -193,7 +194,7 @@ describe "ey deploy" do
|
|
193
194
|
|
194
195
|
it "lets you choose by complete name even if the complete name is ambiguous" do
|
195
196
|
ey "deploy --environment railsapp_staging"
|
196
|
-
@out.should match(/
|
197
|
+
@out.should match(/Beginning deploy for.*'railsapp_staging'/)
|
197
198
|
end
|
198
199
|
end
|
199
200
|
|
@@ -5,7 +5,7 @@ describe "ey environments" do
|
|
5
5
|
given "integration"
|
6
6
|
|
7
7
|
before(:all) do
|
8
|
-
api_scenario "one app,
|
8
|
+
api_scenario "one app, many environments"
|
9
9
|
end
|
10
10
|
|
11
11
|
it "lists the environments your app is in" do
|
@@ -22,4 +22,20 @@ describe "ey environments" do
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
it "lists all environments that have apps with -a" do
|
26
|
+
ey "environments -a"
|
27
|
+
@out.should include("bakon")
|
28
|
+
@out.should include("giblets")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "outputs simply with -s" do
|
32
|
+
ey "environments -s", :debug => false
|
33
|
+
@out.split(/\n/).sort.should == ["bakon", "giblets"]
|
34
|
+
end
|
35
|
+
|
36
|
+
it "outputs all environments (including ones with no apps) simply with -a and -s" do
|
37
|
+
ey "environments -a -s", :debug => false
|
38
|
+
@out.split(/\n/).sort.should == ["bakon", "beef", "giblets"]
|
39
|
+
end
|
40
|
+
|
25
41
|
end
|
data/spec/ey/logs_spec.rb
CHANGED
@@ -12,7 +12,7 @@ describe "ey logs" do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it "complains when it can't infer the environment" do
|
15
|
-
api_scenario "one app,
|
15
|
+
api_scenario "one app, many environments"
|
16
16
|
ey "logs", :expect_failure => true
|
17
17
|
@err.should =~ /single environment/
|
18
18
|
end
|
data/spec/ey/rollback_spec.rb
CHANGED
@@ -7,11 +7,12 @@ describe "ey rollback" do
|
|
7
7
|
cmd = "rollback"
|
8
8
|
cmd << " -e #{opts[:env]}" if opts[:env]
|
9
9
|
cmd << " -a #{opts[:app]}" if opts[:app]
|
10
|
+
cmd << " --verbose" if opts[:verbose]
|
10
11
|
cmd
|
11
12
|
end
|
12
13
|
|
13
14
|
def verify_ran(scenario)
|
14
|
-
@out.should match(/Rolling back
|
15
|
+
@out.should match(/Rolling back.*#{scenario[:application]}.*#{scenario[:environment]}/)
|
15
16
|
@err.should be_empty
|
16
17
|
@ssh_commands.last.should match(/eysd.*deploy rollback.*--app #{scenario[:application]}/)
|
17
18
|
end
|
data/spec/ey/ssh_spec.rb
CHANGED
data/spec/ey/web/disable_spec.rb
CHANGED
data/spec/ey/web/enable_spec.rb
CHANGED
data/spec/support/fake_awsm.ru
CHANGED
@@ -32,8 +32,8 @@ class FakeAwsm < Sinatra::Base
|
|
32
32
|
Scenario::LinkedApp
|
33
33
|
when "one app, one environment, app master red"
|
34
34
|
Scenario::LinkedAppRedMaster
|
35
|
-
when "one app,
|
36
|
-
Scenario::
|
35
|
+
when "one app, many environments"
|
36
|
+
Scenario::OneAppManyEnvs
|
37
37
|
when "one app, many similarly-named environments"
|
38
38
|
Scenario::OneAppManySimilarlyNamedEnvs
|
39
39
|
else
|
@@ -252,7 +252,7 @@ private
|
|
252
252
|
end
|
253
253
|
end
|
254
254
|
|
255
|
-
class
|
255
|
+
class OneAppManyEnvs < Empty
|
256
256
|
def apps
|
257
257
|
apps = [{
|
258
258
|
"name" => "rails232app",
|
@@ -325,6 +325,15 @@ private
|
|
325
325
|
"stack_name" => "nginx_passenger",
|
326
326
|
"id" => 8371,
|
327
327
|
"app_master" => nil,
|
328
|
+
}, {
|
329
|
+
"ssh_username" => "hamburger",
|
330
|
+
"instances" => [],
|
331
|
+
"name" => "beef",
|
332
|
+
"apps" => [],
|
333
|
+
"instances_count" => 0,
|
334
|
+
"stack_name" => "nginx_passenger",
|
335
|
+
"id" => 8372,
|
336
|
+
"app_master" => nil,
|
328
337
|
}]
|
329
338
|
end
|
330
339
|
end # OneAppTwoEnvs
|
data/spec/support/helpers.rb
CHANGED
@@ -20,8 +20,10 @@ module Spec
|
|
20
20
|
hide_err = options.has_key?(:hide_err) ? options[:hide_err] : options[:expect_failure]
|
21
21
|
path_prepends = options[:prepend_to_path]
|
22
22
|
|
23
|
-
ey_env = {}
|
24
|
-
|
23
|
+
ey_env = {'DEBUG' => 'true'}
|
24
|
+
if options.has_key?(:debug)
|
25
|
+
ey_env['DEBUG'] = options[:debug] ? "true" : nil
|
26
|
+
end
|
25
27
|
|
26
28
|
if path_prepends
|
27
29
|
tempdir = File.join(Dir.tmpdir, "ey_test_cmds_#{Time.now.tv_sec}#{Time.now.tv_usec}_#{$$}")
|
@@ -113,6 +113,12 @@ end
|
|
113
113
|
shared_examples_for "it invokes eysd" do
|
114
114
|
include Spec::Helpers::SharedIntegrationTestUtils
|
115
115
|
|
116
|
+
it "passes --verbose to eysd" do
|
117
|
+
api_scenario "one app, one environment"
|
118
|
+
run_ey({:env => 'giblets', :verbose => true})
|
119
|
+
@ssh_commands.should have_command_like(/eysd.*deploy.*--verbose/)
|
120
|
+
end
|
121
|
+
|
116
122
|
it "passes along instance information to eysd" do
|
117
123
|
api_scenario "one app, one environment"
|
118
124
|
run_ey({:env => 'giblets'})
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 7
|
8
|
-
-
|
9
|
-
version: 0.7.
|
8
|
+
- 1
|
9
|
+
version: 0.7.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- EY Cloud Team
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-06-
|
17
|
+
date: 2010-06-29 00:00:00 -07:00
|
18
18
|
default_executable: ey
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|