engineyard 0.7.0 → 0.7.1
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.
- 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
|