startapp 0.1.6
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.
- checksums.yaml +7 -0
- data/COPYRIGHT +1 -0
- data/LICENSE +11 -0
- data/README.md +95 -0
- data/Rakefile +6 -0
- data/autocomplete/rhc_bash +1672 -0
- data/bin/app +37 -0
- data/conf/express.conf +8 -0
- data/features/assets/deploy.tar.gz +0 -0
- data/features/core_feature.rb +191 -0
- data/features/deployments_feature.rb +129 -0
- data/features/domains_feature.rb +58 -0
- data/features/keys_feature.rb +37 -0
- data/features/members_feature.rb +166 -0
- data/lib/rhc/auth/basic.rb +64 -0
- data/lib/rhc/auth/token.rb +102 -0
- data/lib/rhc/auth/token_store.rb +53 -0
- data/lib/rhc/auth.rb +5 -0
- data/lib/rhc/autocomplete.rb +66 -0
- data/lib/rhc/autocomplete_templates/bash.erb +39 -0
- data/lib/rhc/cartridge_helpers.rb +118 -0
- data/lib/rhc/cli.rb +40 -0
- data/lib/rhc/command_runner.rb +185 -0
- data/lib/rhc/commands/account.rb +25 -0
- data/lib/rhc/commands/alias.rb +124 -0
- data/lib/rhc/commands/app.rb +726 -0
- data/lib/rhc/commands/apps.rb +20 -0
- data/lib/rhc/commands/authorization.rb +115 -0
- data/lib/rhc/commands/base.rb +174 -0
- data/lib/rhc/commands/cartridge.rb +329 -0
- data/lib/rhc/commands/clone.rb +66 -0
- data/lib/rhc/commands/configure.rb +20 -0
- data/lib/rhc/commands/create.rb +100 -0
- data/lib/rhc/commands/delete.rb +19 -0
- data/lib/rhc/commands/deploy.rb +32 -0
- data/lib/rhc/commands/deployment.rb +82 -0
- data/lib/rhc/commands/domain.rb +172 -0
- data/lib/rhc/commands/env.rb +142 -0
- data/lib/rhc/commands/force_stop.rb +17 -0
- data/lib/rhc/commands/git_clone.rb +34 -0
- data/lib/rhc/commands/logout.rb +51 -0
- data/lib/rhc/commands/logs.rb +21 -0
- data/lib/rhc/commands/member.rb +148 -0
- data/lib/rhc/commands/port_forward.rb +197 -0
- data/lib/rhc/commands/reload.rb +17 -0
- data/lib/rhc/commands/restart.rb +17 -0
- data/lib/rhc/commands/scp.rb +54 -0
- data/lib/rhc/commands/server.rb +40 -0
- data/lib/rhc/commands/setup.rb +60 -0
- data/lib/rhc/commands/show.rb +43 -0
- data/lib/rhc/commands/snapshot.rb +137 -0
- data/lib/rhc/commands/ssh.rb +51 -0
- data/lib/rhc/commands/sshkey.rb +97 -0
- data/lib/rhc/commands/start.rb +17 -0
- data/lib/rhc/commands/stop.rb +17 -0
- data/lib/rhc/commands/tail.rb +47 -0
- data/lib/rhc/commands/threaddump.rb +14 -0
- data/lib/rhc/commands/tidy.rb +17 -0
- data/lib/rhc/commands.rb +396 -0
- data/lib/rhc/config.rb +321 -0
- data/lib/rhc/context_helper.rb +121 -0
- data/lib/rhc/core_ext.rb +202 -0
- data/lib/rhc/coverage_helper.rb +33 -0
- data/lib/rhc/deployment_helpers.rb +111 -0
- data/lib/rhc/exceptions.rb +256 -0
- data/lib/rhc/git_helpers.rb +106 -0
- data/lib/rhc/help_formatter.rb +55 -0
- data/lib/rhc/helpers.rb +481 -0
- data/lib/rhc/highline_extensions.rb +479 -0
- data/lib/rhc/json.rb +51 -0
- data/lib/rhc/output_helpers.rb +260 -0
- data/lib/rhc/rest/activation.rb +11 -0
- data/lib/rhc/rest/alias.rb +42 -0
- data/lib/rhc/rest/api.rb +87 -0
- data/lib/rhc/rest/application.rb +348 -0
- data/lib/rhc/rest/attributes.rb +36 -0
- data/lib/rhc/rest/authorization.rb +8 -0
- data/lib/rhc/rest/base.rb +79 -0
- data/lib/rhc/rest/cartridge.rb +162 -0
- data/lib/rhc/rest/client.rb +650 -0
- data/lib/rhc/rest/deployment.rb +18 -0
- data/lib/rhc/rest/domain.rb +98 -0
- data/lib/rhc/rest/environment_variable.rb +15 -0
- data/lib/rhc/rest/gear_group.rb +16 -0
- data/lib/rhc/rest/httpclient.rb +145 -0
- data/lib/rhc/rest/key.rb +44 -0
- data/lib/rhc/rest/membership.rb +105 -0
- data/lib/rhc/rest/mock.rb +1042 -0
- data/lib/rhc/rest/user.rb +32 -0
- data/lib/rhc/rest.rb +148 -0
- data/lib/rhc/scp_helpers.rb +27 -0
- data/lib/rhc/ssh_helpers.rb +380 -0
- data/lib/rhc/tar_gz.rb +51 -0
- data/lib/rhc/usage_templates/command_help.erb +51 -0
- data/lib/rhc/usage_templates/command_syntax_help.erb +11 -0
- data/lib/rhc/usage_templates/help.erb +61 -0
- data/lib/rhc/usage_templates/missing_help.erb +1 -0
- data/lib/rhc/usage_templates/options_help.erb +12 -0
- data/lib/rhc/vendor/okjson.rb +600 -0
- data/lib/rhc/vendor/parseconfig.rb +178 -0
- data/lib/rhc/vendor/sshkey.rb +253 -0
- data/lib/rhc/vendor/zliby.rb +628 -0
- data/lib/rhc/version.rb +5 -0
- data/lib/rhc/wizard.rb +637 -0
- data/lib/rhc.rb +34 -0
- data/spec/coverage_helper.rb +82 -0
- data/spec/direct_execution_helper.rb +339 -0
- data/spec/keys/example.pem +23 -0
- data/spec/keys/example_private.pem +27 -0
- data/spec/keys/server.pem +19 -0
- data/spec/rest_spec_helper.rb +31 -0
- data/spec/rhc/assets/cert.crt +22 -0
- data/spec/rhc/assets/cert_key_rsa +27 -0
- data/spec/rhc/assets/empty.txt +0 -0
- data/spec/rhc/assets/env_vars.txt +7 -0
- data/spec/rhc/assets/env_vars_2.txt +1 -0
- data/spec/rhc/assets/foo.txt +1 -0
- data/spec/rhc/assets/targz_corrupted.tar.gz +1 -0
- data/spec/rhc/assets/targz_sample.tar.gz +0 -0
- data/spec/rhc/auth_spec.rb +442 -0
- data/spec/rhc/cli_spec.rb +186 -0
- data/spec/rhc/command_spec.rb +435 -0
- data/spec/rhc/commands/account_spec.rb +42 -0
- data/spec/rhc/commands/alias_spec.rb +333 -0
- data/spec/rhc/commands/app_spec.rb +777 -0
- data/spec/rhc/commands/apps_spec.rb +39 -0
- data/spec/rhc/commands/authorization_spec.rb +157 -0
- data/spec/rhc/commands/cartridge_spec.rb +665 -0
- data/spec/rhc/commands/clone_spec.rb +41 -0
- data/spec/rhc/commands/deployment_spec.rb +327 -0
- data/spec/rhc/commands/domain_spec.rb +401 -0
- data/spec/rhc/commands/env_spec.rb +493 -0
- data/spec/rhc/commands/git_clone_spec.rb +102 -0
- data/spec/rhc/commands/logout_spec.rb +86 -0
- data/spec/rhc/commands/member_spec.rb +247 -0
- data/spec/rhc/commands/port_forward_spec.rb +217 -0
- data/spec/rhc/commands/scp_spec.rb +77 -0
- data/spec/rhc/commands/server_spec.rb +69 -0
- data/spec/rhc/commands/setup_spec.rb +118 -0
- data/spec/rhc/commands/snapshot_spec.rb +179 -0
- data/spec/rhc/commands/ssh_spec.rb +163 -0
- data/spec/rhc/commands/sshkey_spec.rb +188 -0
- data/spec/rhc/commands/tail_spec.rb +81 -0
- data/spec/rhc/commands/threaddump_spec.rb +84 -0
- data/spec/rhc/config_spec.rb +407 -0
- data/spec/rhc/helpers_spec.rb +531 -0
- data/spec/rhc/highline_extensions_spec.rb +314 -0
- data/spec/rhc/json_spec.rb +30 -0
- data/spec/rhc/rest_application_spec.rb +258 -0
- data/spec/rhc/rest_client_spec.rb +752 -0
- data/spec/rhc/rest_spec.rb +740 -0
- data/spec/rhc/targz_spec.rb +55 -0
- data/spec/rhc/wizard_spec.rb +756 -0
- data/spec/spec_helper.rb +575 -0
- data/spec/wizard_spec_helper.rb +330 -0
- metadata +469 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'rest_spec_helper'
|
|
3
|
+
require 'rhc/commands/clone'
|
|
4
|
+
|
|
5
|
+
describe RHC::Commands::Clone do
|
|
6
|
+
before{ user_config }
|
|
7
|
+
let!(:rest_client){ MockRestClient.new }
|
|
8
|
+
|
|
9
|
+
describe 'run' do
|
|
10
|
+
|
|
11
|
+
context 'clone invalid url' do
|
|
12
|
+
let(:arguments) { ['clone','http://someivalidurl.com'] }
|
|
13
|
+
|
|
14
|
+
it { run_output.should match(/URL is invalid. To clone app your url must be something/) }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context 'with valid url and no domains' do
|
|
18
|
+
let(:arguments) { ['clone','http://myapp-mydomain.startapp.bg'] }
|
|
19
|
+
|
|
20
|
+
it { expect { run }.to exit_with_code(127) }
|
|
21
|
+
it { run_output.should match(/Domain *mydomain* not found/) }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context 'with valid url and domain' do
|
|
25
|
+
let(:arguments) { ['clone','http://myapp-myfirsrdomain.startapp.bg'] }
|
|
26
|
+
let!(:domain){ rest_client.add_domain("myfirsrdomain") }
|
|
27
|
+
|
|
28
|
+
it { expect { run }.to exit_with_code(101) }
|
|
29
|
+
it { run_output.should match(/Application myapp does not exist/) }
|
|
30
|
+
|
|
31
|
+
context 'with apps' do
|
|
32
|
+
let(:arguments) { ['clone','http://myapp-myfirsrdomain.startapp.bg'] }
|
|
33
|
+
before{ domain.add_application('myapp') }
|
|
34
|
+
|
|
35
|
+
it { expect { run }.to exit_with_code(216) }
|
|
36
|
+
it { run_output.should match(/Cloning into 'myapp'/) }
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'rest_spec_helper'
|
|
3
|
+
require 'rhc/commands/deployment'
|
|
4
|
+
|
|
5
|
+
describe RHC::Commands::Deployment do
|
|
6
|
+
|
|
7
|
+
DEPLOYMENT_APP_NAME = 'mock_app_deploy'
|
|
8
|
+
|
|
9
|
+
let!(:rest_client) { MockRestClient.new }
|
|
10
|
+
|
|
11
|
+
before do
|
|
12
|
+
user_config
|
|
13
|
+
@rest_app = rest_client.add_domain("mock_domain").add_application(DEPLOYMENT_APP_NAME, 'ruby-1.8.7')
|
|
14
|
+
@rest_app.stub(:ssh_url).and_return("ssh://user@test.domain.com")
|
|
15
|
+
@targz_filename = File.dirname(__FILE__) + '/' + DEPLOYMENT_APP_NAME + '.tar.gz'
|
|
16
|
+
FileUtils.cp(File.expand_path('../../assets/targz_sample.tar.gz', __FILE__), @targz_filename)
|
|
17
|
+
File.chmod 0644, @targz_filename unless File.executable? @targz_filename
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
after do
|
|
21
|
+
File.delete @targz_filename if File.exist? @targz_filename
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe "configure app" do
|
|
25
|
+
context "manual deployment keeping a history of 10" do
|
|
26
|
+
let(:arguments) {['app', 'configure', '--app', DEPLOYMENT_APP_NAME, '--no-auto-deploy', '--keep-deployments', '10']}
|
|
27
|
+
it "should succeed" do
|
|
28
|
+
expect{ run }.to exit_with_code(0)
|
|
29
|
+
run_output.should match(/Configuring application '#{DEPLOYMENT_APP_NAME}' .../)
|
|
30
|
+
run_output.should match(/done/)
|
|
31
|
+
@rest_app.auto_deploy.should == false
|
|
32
|
+
@rest_app.keep_deployments.should == 10
|
|
33
|
+
run_output.should match(/Your application '#{DEPLOYMENT_APP_NAME}' is now configured as listed above/)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context "with no configuration options" do
|
|
38
|
+
let(:arguments) {['app', 'configure', '--app', DEPLOYMENT_APP_NAME]}
|
|
39
|
+
it "should display the current configuration" do
|
|
40
|
+
expect{ run }.to exit_with_code(0)
|
|
41
|
+
run_output.should_not match(/Configuring application '#{DEPLOYMENT_APP_NAME}' .../)
|
|
42
|
+
run_output.should_not match(/done/)
|
|
43
|
+
run_output.should match(/Your application '#{DEPLOYMENT_APP_NAME}' is configured as listed above/)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
describe "deploy" do
|
|
49
|
+
context "git ref successfully" do
|
|
50
|
+
before { Net::SSH.should_receive(:start).exactly(3).times.with('test.domain.com', 'user', :compression=>false) }
|
|
51
|
+
let(:arguments) {['app', 'deploy', 'master', '--app', DEPLOYMENT_APP_NAME]}
|
|
52
|
+
it "should succeed" do
|
|
53
|
+
expect{ run }.to exit_with_code(0)
|
|
54
|
+
run_output.should match(/Deployment of git ref 'master' in progress for application #{DEPLOYMENT_APP_NAME} .../)
|
|
55
|
+
run_output.should match(/Success/)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context "binary file successfully" do
|
|
60
|
+
before do
|
|
61
|
+
@rest_app.stub(:deployment_type).and_return('binary')
|
|
62
|
+
ssh = double(Net::SSH)
|
|
63
|
+
session = double(Net::SSH::Connection::Session)
|
|
64
|
+
channel = double(Net::SSH::Connection::Channel)
|
|
65
|
+
exit_status = double(Net::SSH::Buffer)
|
|
66
|
+
exit_status.stub(:read_long).and_return(0)
|
|
67
|
+
Net::SSH.should_receive(:start).exactly(3).times.with('test.domain.com', 'user', :compression=>false).and_yield(session)
|
|
68
|
+
session.should_receive(:open_channel).exactly(3).times.and_yield(channel)
|
|
69
|
+
channel.should_receive(:exec).exactly(3).times.with("oo-binary-deploy").and_yield(nil, nil)
|
|
70
|
+
channel.should_receive(:on_data).exactly(3).times.and_yield(nil, 'foo')
|
|
71
|
+
channel.should_receive(:on_extended_data).exactly(3).times.and_yield(nil, nil, '')
|
|
72
|
+
channel.should_receive(:on_close).exactly(3).times.and_yield(nil)
|
|
73
|
+
channel.should_receive(:on_request).exactly(3).times.with("exit-status").and_yield(nil, exit_status)
|
|
74
|
+
lines = ''
|
|
75
|
+
File.open(@targz_filename, 'rb') do |file|
|
|
76
|
+
file.chunk(1024) do |chunk|
|
|
77
|
+
lines << chunk
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
channel.should_receive(:send_data).exactly(3).times.with(lines)
|
|
81
|
+
channel.should_receive(:eof!).exactly(3).times
|
|
82
|
+
session.should_receive(:loop).exactly(3).times
|
|
83
|
+
end
|
|
84
|
+
let(:arguments) {['app', 'deploy', @targz_filename, '--app', DEPLOYMENT_APP_NAME]}
|
|
85
|
+
it "should succeed" do
|
|
86
|
+
expect{ run }.to exit_with_code(0)
|
|
87
|
+
run_output.should match(/Deployment of file '#{@targz_filename}' in progress for application #{DEPLOYMENT_APP_NAME} .../)
|
|
88
|
+
run_output.should match(/Success/)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
[URI('http://foo.com/path/to/file/' + DEPLOYMENT_APP_NAME + '.tar.gz'),
|
|
93
|
+
URI('https://foo.com/path/to/file/' + DEPLOYMENT_APP_NAME + '.tar.gz')].each do |uri|
|
|
94
|
+
context "url file successfully" do
|
|
95
|
+
before do
|
|
96
|
+
@rest_app.stub(:deployment_type).and_return('binary')
|
|
97
|
+
ssh = double(Net::SSH)
|
|
98
|
+
session = double(Net::SSH::Connection::Session)
|
|
99
|
+
channel = double(Net::SSH::Connection::Channel)
|
|
100
|
+
exit_status = double(Net::SSH::Buffer)
|
|
101
|
+
exit_status.stub(:read_long).and_return(0)
|
|
102
|
+
Net::SSH.should_receive(:start).exactly(3).times.with('test.domain.com', 'user', :compression=>false).and_yield(session)
|
|
103
|
+
session.should_receive(:open_channel).exactly(3).times.and_yield(channel)
|
|
104
|
+
channel.should_receive(:exec).exactly(3).times.with("oo-binary-deploy").and_yield(nil, nil)
|
|
105
|
+
channel.should_receive(:on_data).exactly(3).times.and_yield(nil, 'foo')
|
|
106
|
+
channel.should_receive(:on_extended_data).exactly(3).times.and_yield(nil, nil, '')
|
|
107
|
+
channel.should_receive(:on_close).exactly(3).times.and_yield(nil)
|
|
108
|
+
channel.should_receive(:on_request).exactly(3).times.with("exit-status").and_yield(nil, exit_status)
|
|
109
|
+
lines = ''
|
|
110
|
+
File.open(@targz_filename, 'rb') do |file|
|
|
111
|
+
file.chunk(1024) do |chunk|
|
|
112
|
+
lines << chunk
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
stub_request(:get, uri.to_s).to_return(:status => 200, :body => lines, :headers => {})
|
|
116
|
+
channel.should_receive(:send_data).exactly(3).times.with(lines)
|
|
117
|
+
channel.should_receive(:eof!).exactly(3).times
|
|
118
|
+
session.should_receive(:loop).exactly(3).times
|
|
119
|
+
end
|
|
120
|
+
let(:arguments) {['app', 'deploy', uri.to_s, '--app', DEPLOYMENT_APP_NAME]}
|
|
121
|
+
it "should succeed" do
|
|
122
|
+
expect{ run }.to exit_with_code(0)
|
|
123
|
+
run_output.should match(/Deployment of file '#{uri.to_s}' in progress for application #{DEPLOYMENT_APP_NAME} .../)
|
|
124
|
+
run_output.should match(/Success/)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
context "binary file with corrupted file" do
|
|
130
|
+
before do
|
|
131
|
+
@rest_app.stub(:deployment_type).and_return('binary')
|
|
132
|
+
ssh = double(Net::SSH)
|
|
133
|
+
session = double(Net::SSH::Connection::Session)
|
|
134
|
+
channel = double(Net::SSH::Connection::Channel)
|
|
135
|
+
exit_status = double(Net::SSH::Buffer)
|
|
136
|
+
exit_status.stub(:read_long).and_return(255)
|
|
137
|
+
Net::SSH.should_receive(:start).exactly(3).times.with('test.domain.com', 'user', :compression=>false).and_yield(session)
|
|
138
|
+
session.should_receive(:open_channel).exactly(3).times.and_yield(channel)
|
|
139
|
+
channel.should_receive(:exec).exactly(3).times.with("oo-binary-deploy").and_yield(nil, nil)
|
|
140
|
+
channel.should_receive(:on_data).exactly(3).times.and_yield(nil, 'foo')
|
|
141
|
+
channel.should_receive(:on_extended_data).exactly(3).times.and_yield(nil, nil, 'Invalid file')
|
|
142
|
+
channel.should_receive(:on_close).exactly(3).times.and_yield(nil)
|
|
143
|
+
channel.should_receive(:on_request).exactly(3).times.with("exit-status").and_yield(nil, exit_status)
|
|
144
|
+
lines = ''
|
|
145
|
+
File.open(@targz_filename, 'rb') do |file|
|
|
146
|
+
file.chunk(1024) do |chunk|
|
|
147
|
+
lines << chunk
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
channel.should_receive(:send_data).exactly(3).times.with(lines)
|
|
151
|
+
channel.should_receive(:eof!).exactly(3).times
|
|
152
|
+
session.should_receive(:loop).exactly(3).times
|
|
153
|
+
end
|
|
154
|
+
let(:arguments) {['app', 'deploy', @targz_filename, '--app', DEPLOYMENT_APP_NAME]}
|
|
155
|
+
it "should not succeed" do
|
|
156
|
+
expect{ run }.to exit_with_code(133)
|
|
157
|
+
run_output.should match(/Deployment of file '#{@targz_filename}' in progress for application #{DEPLOYMENT_APP_NAME} .../)
|
|
158
|
+
run_output.should match(/Invalid file/)
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
context "fails when deploying git ref" do
|
|
163
|
+
before (:each) { Net::SSH.should_receive(:start).and_raise(Errno::ECONNREFUSED) }
|
|
164
|
+
let(:arguments) {['app', 'deploy', 'master', '--app', DEPLOYMENT_APP_NAME]}
|
|
165
|
+
it "should exit with error" do
|
|
166
|
+
expect{ run }.to exit_with_code(1)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
context "fails when deploying binary file" do
|
|
171
|
+
before (:each) do
|
|
172
|
+
@rest_app.stub(:deployment_type).and_return('binary')
|
|
173
|
+
Net::SSH.should_receive(:start).and_raise(Errno::ECONNREFUSED)
|
|
174
|
+
end
|
|
175
|
+
let(:arguments) {['app', 'deploy', @targz_filename, '--app', DEPLOYMENT_APP_NAME]}
|
|
176
|
+
it "should exit with error" do
|
|
177
|
+
expect{ run }.to exit_with_code(1)
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
context "fails when deploying binary file" do
|
|
182
|
+
before (:each) do
|
|
183
|
+
@rest_app.stub(:deployment_type).and_return('binary')
|
|
184
|
+
Net::SSH.should_receive(:start).and_raise(SocketError)
|
|
185
|
+
end
|
|
186
|
+
let(:arguments) {['app', 'deploy', @targz_filename, '--app', DEPLOYMENT_APP_NAME]}
|
|
187
|
+
it "should exit with error" do
|
|
188
|
+
expect{ run }.to exit_with_code(1)
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
context "fails when deploying url file" do
|
|
193
|
+
before (:each) do
|
|
194
|
+
@rest_app.stub(:deployment_type).and_return('binary')
|
|
195
|
+
Net::SSH.should_receive(:start).and_raise(Errno::ECONNREFUSED)
|
|
196
|
+
end
|
|
197
|
+
let(:arguments) {['app', 'deploy', 'http://foo.com/deploy.tar.gz', '--app', DEPLOYMENT_APP_NAME]}
|
|
198
|
+
it "should exit with error" do
|
|
199
|
+
expect{ run }.to exit_with_code(1)
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
context "fails when deploying url file" do
|
|
204
|
+
before (:each) do
|
|
205
|
+
@rest_app.stub(:deployment_type).and_return('binary')
|
|
206
|
+
Net::SSH.should_receive(:start).and_raise(SocketError)
|
|
207
|
+
end
|
|
208
|
+
let(:arguments) {['app', 'deploy', 'http://foo.com/deploy.tar.gz', '--app', DEPLOYMENT_APP_NAME]}
|
|
209
|
+
it "should exit with error" do
|
|
210
|
+
expect{ run }.to exit_with_code(1)
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
context 'when run against an unsupported server' do
|
|
215
|
+
before {
|
|
216
|
+
@rest_app.links.delete 'UPDATE'
|
|
217
|
+
@rest_app.links.delete 'DEPLOY'
|
|
218
|
+
}
|
|
219
|
+
let(:arguments) {['app', 'deploy', 'master', '--app', DEPLOYMENT_APP_NAME]}
|
|
220
|
+
it "should raise not supported exception" do
|
|
221
|
+
expect{ run }.to exit_with_code(132)
|
|
222
|
+
run_output.should match(/The server does not support deployments/)
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
context "ssh authentication failure" do
|
|
227
|
+
before (:each) { Net::SSH.should_receive(:start).exactly(2).times.and_raise(Net::SSH::AuthenticationFailed) }
|
|
228
|
+
let(:arguments) {['app', 'deploy', 'master', '--app', DEPLOYMENT_APP_NAME]}
|
|
229
|
+
it "should exit with error" do
|
|
230
|
+
expect{ run }.to exit_with_code(1)
|
|
231
|
+
run_output.should match(/Authentication to server test.domain.com with user user failed/)
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
context "fails when deploying git reference on an app configured to deployment_type = binary" do
|
|
236
|
+
before { @rest_app.stub(:deployment_type).and_return('binary') }
|
|
237
|
+
let(:arguments) {['app', 'deploy', 'master', '--app', DEPLOYMENT_APP_NAME]}
|
|
238
|
+
it "should exit with error" do
|
|
239
|
+
expect{ run }.to exit_with_code(133)
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
context "fails when deploying file on an app configured to deployment_type = git" do
|
|
244
|
+
before { @rest_app.stub(:deployment_type).and_return('git') }
|
|
245
|
+
let(:arguments) {['app', 'deploy', @targz_filename, '--app', DEPLOYMENT_APP_NAME]}
|
|
246
|
+
it "should exit with error" do
|
|
247
|
+
expect{ run }.to exit_with_code(133)
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
[URI('http://foo.com/path/to/file/' + DEPLOYMENT_APP_NAME + '.tar.gz'),
|
|
252
|
+
URI('https://foo.com/path/to/file/' + DEPLOYMENT_APP_NAME + '.tar.gz')].each do |uri|
|
|
253
|
+
context "fails when deploying url on an app configured to deployment_type = git" do
|
|
254
|
+
before { @rest_app.stub(:deployment_type).and_return('git') }
|
|
255
|
+
let(:arguments) {['app', 'deploy', uri.to_s, '--app', DEPLOYMENT_APP_NAME]}
|
|
256
|
+
it "should exit with error" do
|
|
257
|
+
expect{ run }.to exit_with_code(133)
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
describe "activate deployment" do
|
|
264
|
+
context "activates 123456" do
|
|
265
|
+
before { Net::SSH.should_receive(:start).exactly(3).times.with('test.domain.com', 'user', :compression => false) }
|
|
266
|
+
let(:arguments) {['deployment', 'activate', '123456', '--app', DEPLOYMENT_APP_NAME]}
|
|
267
|
+
it "should succeed" do
|
|
268
|
+
expect{ run }.to exit_with_code(0)
|
|
269
|
+
run_output.should match(/Activating deployment '123456' on application #{DEPLOYMENT_APP_NAME} .../)
|
|
270
|
+
run_output.should match(/Success/)
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
context "fails with ssh error" do
|
|
275
|
+
before (:each) { Net::SSH.should_receive(:start).and_raise(Errno::ECONNREFUSED) }
|
|
276
|
+
let(:arguments) {['deployment', 'activate', '123456', '--app', DEPLOYMENT_APP_NAME]}
|
|
277
|
+
it "should exit with error" do
|
|
278
|
+
expect{ run }.to exit_with_code(1)
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
describe "list deployments" do
|
|
284
|
+
context "simple" do
|
|
285
|
+
let(:arguments) {['deployment', 'list', DEPLOYMENT_APP_NAME]}
|
|
286
|
+
it "should succeed" do
|
|
287
|
+
expect{ run }.to exit_with_code(0)
|
|
288
|
+
run_output.should match(/Jan 01\, 2000 1\:00 AM\, deployment 0000001/)
|
|
289
|
+
run_output.should match(/Jan 01\, 2000 2\:00 AM\, deployment 0000002/)
|
|
290
|
+
run_output.should match(/Jan 01\, 2000 3\:00 AM\, deployment 0000003 \(rolled back\)/)
|
|
291
|
+
run_output.should match(/Jan 01\, 2000 4\:00 AM\, deployment 0000004 \(rolled back\)/)
|
|
292
|
+
run_output.should match(/Jan 01\, 2000 5\:00 AM\, deployment 0000003 \(rollback to Jan 01\, 2000 3\:00 AM\, rolled back\)/)
|
|
293
|
+
run_output.should match(/Jan 01\, 2000 5\:00 AM\, deployment 0000005 \(rolled back\)/)
|
|
294
|
+
run_output.should match(/Jan 01\, 2000 6\:00 AM\, deployment 0000002 \(rollback to Jan 01\, 2000 2\:00 AM\)/)
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
describe "show deployment" do
|
|
300
|
+
context "simple" do
|
|
301
|
+
let(:arguments) {['deployment', 'show', '0000001', '--app', DEPLOYMENT_APP_NAME]}
|
|
302
|
+
it "should succeed" do
|
|
303
|
+
expect{ run }.to exit_with_code(0)
|
|
304
|
+
run_output.should match(/Deployment ID 0000001/)
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
context "fails when deployment is not found" do
|
|
309
|
+
let(:arguments) {['deployment', 'show', 'zee', '--app', DEPLOYMENT_APP_NAME]}
|
|
310
|
+
it "should succeed" do
|
|
311
|
+
expect{ run }.to exit_with_code(131)
|
|
312
|
+
run_output.should match(/Deployment ID 'zee' not found for application #{DEPLOYMENT_APP_NAME}/)
|
|
313
|
+
end
|
|
314
|
+
end
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
describe "show configuration" do
|
|
318
|
+
context "simple" do
|
|
319
|
+
let(:arguments) {['app', 'show', '--app', DEPLOYMENT_APP_NAME, '--configuration']}
|
|
320
|
+
it "should succeed" do
|
|
321
|
+
expect{ run }.to exit_with_code(0)
|
|
322
|
+
#run_output.should match(/Deployment ID 1/)
|
|
323
|
+
end
|
|
324
|
+
end
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
end
|