shelly 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.travis.yml +2 -1
- data/CHANGELOG.md +9 -0
- data/lib/shelly/app.rb +49 -12
- data/lib/shelly/cli/backup.rb +17 -3
- data/lib/shelly/cli/database.rb +26 -0
- data/lib/shelly/cli/deploy.rb +3 -0
- data/lib/shelly/cli/main.rb +3 -1
- data/lib/shelly/client/apps.rb +8 -0
- data/lib/shelly/helpers.rb +10 -6
- data/lib/shelly/version.rb +1 -1
- data/spec/helpers.rb +1 -1
- data/spec/shelly/app_spec.rb +7 -6
- data/spec/shelly/cli/backup_spec.rb +18 -5
- data/spec/shelly/cli/database_spec.rb +33 -0
- data/spec/shelly/cli/deploy_spec.rb +4 -2
- data/spec/shelly/cli/file_spec.rb +2 -2
- data/spec/shelly/cli/main_spec.rb +3 -2
- data/spec/shelly/cli/organization_spec.rb +10 -10
- metadata +50 -47
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MTBiNDgwNzhlNDdhZGU5YmY3MjQ3YTUwNTJmNjY0YTEyMTA4YTlkNA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NWQ3NTdjZGY4ZTFiNjgwMTQ2Y2FiMzYwYmNmMzRkMDcxZjA5ZGMwNQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YTczNTdhMjljZjEyY2ZiZDcyMDM0ODUxMDY5ZTZlYmE5YjQ0YjBlMGRlNTNj
|
10
|
+
OTFmYzc1MzAzOGRhYzgxMDM2NWVhN2YwNzViMjljOTljMmFmMTY4MDQ0MzU3
|
11
|
+
MzU3MWQ1NGFhOWUzMDg3NmNhZmZiNmFmMTFiMjY1NzUxNTk1MDk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MjA4ZjQyODRhYjRjYjIzZGUwNjczM2QyMTM4MTY4NTBlYWVmM2FlNTQ4NmFk
|
14
|
+
YjBiYWFhOTdkNTljOTNmODc3ZmZjNTBlMzU1YTU3MWVhNWMyNDExYjZmYzVj
|
15
|
+
Y2VhNzY1ODZiYTAzZTA4MmY0NzkyYzQyNDQyNmY2OTRhMWIwOGE=
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## 0.3.1 / 2013-06-28
|
2
|
+
|
3
|
+
* [feature] `shelly database reset` reset PostgreSQL or MongoDB database, also possible to use with `shelly backup import DB_KIND dump --reset` option
|
4
|
+
* [improvement] Puma starting/stopping output shows up in deployment logs
|
5
|
+
* [improvement] Affects all commands using ssh connection:
|
6
|
+
* `shelly backup import` works when deployment failed
|
7
|
+
* `shelly dbconsole` works if database was configured
|
8
|
+
* `shelly files *` works if virutal server was at least configured
|
9
|
+
|
1
10
|
## 0.3.0 / 2013-06-23
|
2
11
|
|
3
12
|
* [improvement] API key is now stored in .netrc
|
data/lib/shelly/app.rb
CHANGED
@@ -130,7 +130,11 @@ module Shelly
|
|
130
130
|
|
131
131
|
def import_database(kind, filename, server)
|
132
132
|
ssh(:command => "import_database #{kind.downcase} #{filename}",
|
133
|
-
:server => server)
|
133
|
+
:server => server, :type => :db_server)
|
134
|
+
end
|
135
|
+
|
136
|
+
def reset_database(kind)
|
137
|
+
ssh(:command => "reset_database #{kind.downcase}", :type => :db_server)
|
134
138
|
end
|
135
139
|
|
136
140
|
def request_backup(kinds)
|
@@ -197,7 +201,7 @@ module Shelly
|
|
197
201
|
end
|
198
202
|
|
199
203
|
def dbconsole
|
200
|
-
ssh(:command => "dbconsole")
|
204
|
+
ssh(:command => "dbconsole", :type => :db_server)
|
201
205
|
end
|
202
206
|
|
203
207
|
def attributes
|
@@ -253,19 +257,26 @@ module Shelly
|
|
253
257
|
end
|
254
258
|
|
255
259
|
def list_files(path)
|
256
|
-
ssh(:command => "ls -l
|
260
|
+
ssh(:command => "ls -l #{persistent_disk}/#{path}", :type => :server)
|
257
261
|
end
|
258
262
|
|
259
263
|
def upload(source)
|
260
|
-
|
261
|
-
rsync(source, "#{conn['host']}
|
264
|
+
server_connection.tap do |conn|
|
265
|
+
rsync(source, "#{conn['host']}:#{persistent_disk}", conn)
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
def upload_database(source)
|
270
|
+
db_server_connection.tap do |conn|
|
271
|
+
rsync(source, "#{conn['host']}:#{persistent_disk}", conn)
|
262
272
|
end
|
263
273
|
end
|
264
274
|
|
265
275
|
def download(relative_source, destination)
|
266
|
-
|
267
|
-
|
268
|
-
|
276
|
+
server_connection.tap do |conn|
|
277
|
+
source = File.join("#{conn['host']}:#{persistent_disk}", relative_source)
|
278
|
+
rsync(source, destination, conn)
|
279
|
+
end
|
269
280
|
end
|
270
281
|
|
271
282
|
def delete_file(remote_path)
|
@@ -341,6 +352,10 @@ module Shelly
|
|
341
352
|
self.environment = response["environment"]
|
342
353
|
end
|
343
354
|
|
355
|
+
def persistent_disk
|
356
|
+
"/home/#{code_name}/disk"
|
357
|
+
end
|
358
|
+
|
344
359
|
def jruby?
|
345
360
|
RUBY_PLATFORM == 'java'
|
346
361
|
end
|
@@ -354,17 +369,39 @@ module Shelly
|
|
354
369
|
shelly.console(code_name, server)
|
355
370
|
end
|
356
371
|
|
372
|
+
# Returns first configured virtual server
|
373
|
+
def server_connection
|
374
|
+
shelly.configured_server(code_name)
|
375
|
+
end
|
376
|
+
|
377
|
+
# Returns first configured virtual server with database
|
378
|
+
def db_server_connection(server = nil)
|
379
|
+
shelly.configured_db_server(code_name, server)
|
380
|
+
end
|
381
|
+
|
382
|
+
def connection(options)
|
383
|
+
case options[:type]
|
384
|
+
when :console
|
385
|
+
console_connection(options[:server])
|
386
|
+
when :server
|
387
|
+
server_connection
|
388
|
+
when :db_server
|
389
|
+
db_server_connection(options[:server])
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
357
393
|
def ssh(options = {})
|
358
|
-
|
394
|
+
options[:type] = :console unless options[:type]
|
395
|
+
conn = connection(options)
|
359
396
|
system "ssh #{ssh_options(conn)} -t #{conn['host']} #{options[:command]}"
|
360
397
|
end
|
361
398
|
|
362
|
-
def ssh_options(conn
|
399
|
+
def ssh_options(conn)
|
363
400
|
"-o StrictHostKeyChecking=no -p #{conn['port']} -l #{conn['user']}"
|
364
401
|
end
|
365
402
|
|
366
|
-
def rsync(source, destination)
|
367
|
-
system "rsync -avz -e 'ssh #{ssh_options}' --progress #{source} #{destination}"
|
403
|
+
def rsync(source, destination, conn)
|
404
|
+
system "rsync -avz -e 'ssh #{ssh_options(conn)}' --progress #{source} #{destination}"
|
368
405
|
end
|
369
406
|
end
|
370
407
|
end
|
data/lib/shelly/cli/backup.rb
CHANGED
@@ -105,20 +105,34 @@ module Shelly
|
|
105
105
|
KIND - Database kind. Possible values are: postgresql or mongodb
|
106
106
|
FILENAME - Database dump file or directory (mongodb)
|
107
107
|
}
|
108
|
+
method_option :reset, :type => :boolean, :aliases => "-r",
|
109
|
+
:desc => "Reset database before importing from file"
|
108
110
|
def import(kind, filename)
|
109
111
|
app = multiple_clouds(options[:cloud], "backup import KIND FILENAME")
|
110
112
|
unless ::File.exist?(filename)
|
111
113
|
say_error "File #{filename} doesn't exist"
|
112
114
|
end
|
113
|
-
|
114
|
-
|
115
|
+
if options[:reset]
|
116
|
+
say_warning "You are about to reset database #{kind} for cloud #{app}"
|
117
|
+
say_warning "Next, database will be restored to state from file #{filename}"
|
118
|
+
question = "I want to reset and import the database from dump (yes/no):"
|
119
|
+
say_new_line
|
120
|
+
yes?(question) ? app.reset_database(kind) : say_error("Canceled")
|
121
|
+
else
|
122
|
+
say_warning "You are about to import #{kind} database for cloud #{app} to state from file #{filename}"
|
123
|
+
question = "I want to import the database from dump (yes/no):"
|
124
|
+
say_new_line
|
125
|
+
say_error "Canceled" unless yes?(question)
|
126
|
+
end
|
115
127
|
archive = compress(filename)
|
116
128
|
say "Uploading #{archive}", :green
|
117
|
-
connection = app.
|
129
|
+
connection = app.upload_database(archive)
|
118
130
|
say "Uploading done", :green
|
119
131
|
say "Importing database", :green
|
120
132
|
app.import_database(kind, archive, connection["server"])
|
121
133
|
say "Database imported successfully", :green
|
134
|
+
rescue Client::ConflictException => e
|
135
|
+
say_error e[:message]
|
122
136
|
end
|
123
137
|
|
124
138
|
no_tasks do
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "shelly/cli/command"
|
2
|
+
require "time"
|
3
|
+
|
4
|
+
module Shelly
|
5
|
+
module CLI
|
6
|
+
class Database < Command
|
7
|
+
namespace :database
|
8
|
+
include Helpers
|
9
|
+
before_hook :logged_in?, :only => [:reset]
|
10
|
+
class_option :cloud, :type => :string, :aliases => "-c", :desc => "Specify cloud"
|
11
|
+
|
12
|
+
desc "reset KIND", "Reset database"
|
13
|
+
long_desc %{
|
14
|
+
Removes all objects from the database
|
15
|
+
KIND - Database kind. Possible values are: postgresql or mongodb
|
16
|
+
}
|
17
|
+
def reset(kind)
|
18
|
+
app = multiple_clouds(options[:cloud], "database reset")
|
19
|
+
say "You are about to reset database #{kind} for cloud #{app}"
|
20
|
+
say "All database objects and data will be removed"
|
21
|
+
ask_to_reset_database
|
22
|
+
app.reset_database(kind)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/shelly/cli/deploy.rb
CHANGED
@@ -57,6 +57,9 @@ module Shelly
|
|
57
57
|
if content["thin_restart"]
|
58
58
|
say("Starting thin", :green); say(content["thin_restart"])
|
59
59
|
end
|
60
|
+
if content["puma_restart"]
|
61
|
+
say("Starting puma", :green); say(content["puma_restart"])
|
62
|
+
end
|
60
63
|
rescue Client::NotFoundException => e
|
61
64
|
raise unless e.resource == :log
|
62
65
|
say_error "Log not found, list all deploy logs using `shelly deploys list --cloud=#{app.code_name}`"
|
data/lib/shelly/cli/main.rb
CHANGED
@@ -3,6 +3,7 @@ require "shelly/cli/command"
|
|
3
3
|
require "shelly/cli/user"
|
4
4
|
require "shelly/cli/backup"
|
5
5
|
require "shelly/cli/deploy"
|
6
|
+
require "shelly/cli/database"
|
6
7
|
require "shelly/cli/config"
|
7
8
|
require "shelly/cli/file"
|
8
9
|
require "shelly/cli/organization"
|
@@ -13,6 +14,7 @@ module Shelly
|
|
13
14
|
class Main < Command
|
14
15
|
register_subcommand(User, "user", "user <command>", "Manage collaborators")
|
15
16
|
register_subcommand(Backup, "backup", "backup <command>", "Manage database backups")
|
17
|
+
register_subcommand(Database, "database", "database <command>", "Manage databases")
|
16
18
|
register_subcommand(Deploy, "deploy", "deploy <command>", "View deploy logs")
|
17
19
|
register_subcommand(Config, "config", "config <command>", "Manage application configuration files")
|
18
20
|
register_subcommand(File, "file", "file <command>", "Upload and download files to and from persistent storage")
|
@@ -339,7 +341,7 @@ Wait until cloud is in 'turned off' state and try again.}
|
|
339
341
|
app = multiple_clouds(options[:cloud], "dbconsole")
|
340
342
|
app.dbconsole
|
341
343
|
rescue Client::ConflictException
|
342
|
-
say_error "Cloud #{app}
|
344
|
+
say_error "Cloud #{app} wasn't deployed properly. Can not run dbconsole."
|
343
345
|
end
|
344
346
|
|
345
347
|
desc "redeploy", "Redeploy application"
|
data/lib/shelly/client/apps.rb
CHANGED
@@ -37,4 +37,12 @@ class Shelly::Client
|
|
37
37
|
def console(code_name, server = nil)
|
38
38
|
get("/apps/#{code_name}/console", {:server => server})
|
39
39
|
end
|
40
|
+
|
41
|
+
def configured_server(code_name)
|
42
|
+
get("/apps/#{code_name}/configured_server")
|
43
|
+
end
|
44
|
+
|
45
|
+
def configured_db_server(code_name, server = nil)
|
46
|
+
get("/apps/#{code_name}/configured_db_server", {:server => server})
|
47
|
+
end
|
40
48
|
end
|
data/lib/shelly/helpers.rb
CHANGED
@@ -19,6 +19,10 @@ module Shelly
|
|
19
19
|
exit 1 if options[:with_exit]
|
20
20
|
end
|
21
21
|
|
22
|
+
def say_warning(message)
|
23
|
+
say message, :yellow
|
24
|
+
end
|
25
|
+
|
22
26
|
def ask_for_email(options = {})
|
23
27
|
options = {:guess_email => true}.merge(options)
|
24
28
|
email_question = options[:guess_email] && !User.guess_email.blank? ? "Email (#{User.guess_email} - default):" : "Email:"
|
@@ -50,6 +54,11 @@ module Shelly
|
|
50
54
|
end
|
51
55
|
end
|
52
56
|
|
57
|
+
def ask_to_reset_database
|
58
|
+
reset_database_question = "I want to reset the database (yes/no):"
|
59
|
+
exit 1 unless yes?(reset_database_question)
|
60
|
+
end
|
61
|
+
|
53
62
|
def inside_git_repository?
|
54
63
|
unless App.inside_git_repository?
|
55
64
|
say_error %q{Current directory is not a git repository.
|
@@ -67,11 +76,6 @@ More info at http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository}
|
|
67
76
|
say_new_line say_error "Canceled" unless yes?(question)
|
68
77
|
end
|
69
78
|
|
70
|
-
def ask_to_import_database
|
71
|
-
question = "I want to import the database (yes/no):"
|
72
|
-
say_new_line say_error "Canceled" unless yes?(question)
|
73
|
-
end
|
74
|
-
|
75
79
|
def logged_in?
|
76
80
|
user = Shelly::User.new
|
77
81
|
user.authorize!
|
@@ -126,7 +130,7 @@ More info at http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository}
|
|
126
130
|
end
|
127
131
|
|
128
132
|
def yellow(string)
|
129
|
-
"\e[
|
133
|
+
"\e[33m#{string}\e[0m"
|
130
134
|
end
|
131
135
|
|
132
136
|
def print_check(check, success_message, failure_message, options = {})
|
data/lib/shelly/version.rb
CHANGED
data/spec/helpers.rb
CHANGED
data/spec/shelly/app_spec.rb
CHANGED
@@ -300,7 +300,7 @@ describe Shelly::App do
|
|
300
300
|
|
301
301
|
describe "#dbconsole" do
|
302
302
|
it "should return result of dbconsole" do
|
303
|
-
@client.stub(:
|
303
|
+
@client.stub(:configured_db_server).and_return(
|
304
304
|
{"host" => "console.example.com", "port" => "40010", "user" => "foo"})
|
305
305
|
@app.should_receive(:system).with("ssh -o StrictHostKeyChecking=no -p 40010 -l foo -t console.example.com dbconsole")
|
306
306
|
@app.dbconsole
|
@@ -348,25 +348,26 @@ describe Shelly::App do
|
|
348
348
|
|
349
349
|
describe "#list_files" do
|
350
350
|
it "should list files for given subpath in disk" do
|
351
|
-
@app.should_receive(:ssh).with(:command => "ls -l /
|
351
|
+
@app.should_receive(:ssh).with(:command => "ls -l /home/foo-staging/disk/foo",
|
352
|
+
:type => :server)
|
352
353
|
@app.list_files("foo")
|
353
354
|
end
|
354
355
|
end
|
355
356
|
|
356
357
|
describe "#upload" do
|
357
358
|
it "should run rsync with proper parameters" do
|
358
|
-
@client.stub(:
|
359
|
+
@client.stub(:configured_server).and_return(
|
359
360
|
{"host" => "console.example.com", "port" => "40010", "user" => "foo"})
|
360
|
-
@app.should_receive(:system).with("rsync -avz -e 'ssh -o StrictHostKeyChecking=no -p 40010 -l foo' --progress /path console.example.com:/
|
361
|
+
@app.should_receive(:system).with("rsync -avz -e 'ssh -o StrictHostKeyChecking=no -p 40010 -l foo' --progress /path console.example.com:/home/foo-staging/disk")
|
361
362
|
@app.upload("/path")
|
362
363
|
end
|
363
364
|
end
|
364
365
|
|
365
366
|
describe "#download" do
|
366
367
|
it "should run rsync with proper parameters" do
|
367
|
-
@client.stub(:
|
368
|
+
@client.stub(:configured_server).and_return(
|
368
369
|
{"host" => "console.example.com", "port" => "40010", "user" => "foo"})
|
369
|
-
@app.should_receive(:system).with("rsync -avz -e 'ssh -o StrictHostKeyChecking=no -p 40010 -l foo' --progress console.example.com:/
|
370
|
+
@app.should_receive(:system).with("rsync -avz -e 'ssh -o StrictHostKeyChecking=no -p 40010 -l foo' --progress console.example.com:/home/foo-staging/disk/. /tmp")
|
370
371
|
@app.download(".", "/tmp")
|
371
372
|
end
|
372
373
|
end
|
@@ -264,7 +264,7 @@ describe Shelly::CLI::Backup do
|
|
264
264
|
describe "#import" do
|
265
265
|
before do
|
266
266
|
FileUtils.touch("dump.sql")
|
267
|
-
@app.stub(:
|
267
|
+
@app.stub(:upload_database => {"server" => "app1"}, :ssh => nil)
|
268
268
|
@backup.stub(:system)
|
269
269
|
$stdout.stub(:puts)
|
270
270
|
$stdout.stub(:print)
|
@@ -284,7 +284,7 @@ describe Shelly::CLI::Backup do
|
|
284
284
|
end
|
285
285
|
|
286
286
|
it "should upload compressed file" do
|
287
|
-
@app.should_receive(:
|
287
|
+
@app.should_receive(:upload_database).with("dump.sql-1370879705.tar.bz2")
|
288
288
|
$stdout.should_receive(:puts).with(green "Uploading dump.sql-1370879705.tar.bz2")
|
289
289
|
fake_stdin(["yes"]) do
|
290
290
|
invoke(@backup, :import, "postgresql", "dump.sql")
|
@@ -293,7 +293,7 @@ describe Shelly::CLI::Backup do
|
|
293
293
|
|
294
294
|
it "should import given database from uploaded file" do
|
295
295
|
@app.should_receive(:ssh).with(:command => "import_database postgresql dump.sql-1370879705.tar.bz2",
|
296
|
-
:server => "app1")
|
296
|
+
:server => "app1", :type => :db_server)
|
297
297
|
$stdout.should_receive(:puts).with(green "Importing database")
|
298
298
|
fake_stdin(["yes"]) do
|
299
299
|
invoke(@backup, :import, "PostgreSQL", "dump.sql")
|
@@ -302,8 +302,8 @@ describe Shelly::CLI::Backup do
|
|
302
302
|
|
303
303
|
context "on answering no" do
|
304
304
|
it "should cancel database import" do
|
305
|
-
$stdout.should_receive(:puts).with("You are about import postgresql database for cloud foo-staging to state from file dump.sql")
|
306
|
-
$stdout.should_receive(:print).with("I want to import the database (yes/no): ")
|
305
|
+
$stdout.should_receive(:puts).with(yellow "You are about to import postgresql database for cloud foo-staging to state from file dump.sql")
|
306
|
+
$stdout.should_receive(:print).with("I want to import the database from dump (yes/no): ")
|
307
307
|
$stdout.should_receive(:puts).with(red "Canceled")
|
308
308
|
lambda {
|
309
309
|
fake_stdin(["no"]) do
|
@@ -324,5 +324,18 @@ describe Shelly::CLI::Backup do
|
|
324
324
|
}.should raise_error(SystemExit)
|
325
325
|
end
|
326
326
|
end
|
327
|
+
|
328
|
+
context "with --reset option" do
|
329
|
+
it "should reset database first" do
|
330
|
+
@backup.options = {:cloud => "foo-staging", :reset => true}
|
331
|
+
@app.should_receive(:reset_database).with("postgresql")
|
332
|
+
@app.should_receive(:ssh).with(:command => "import_database postgresql dump.sql-1370879705.tar.bz2",
|
333
|
+
:server => "app1", :type => :db_server)
|
334
|
+
$stdout.should_receive(:puts).with(green "Importing database")
|
335
|
+
fake_stdin(["yes"]) do
|
336
|
+
invoke(@backup, :import, "postgresql", "dump.sql")
|
337
|
+
end
|
338
|
+
end
|
339
|
+
end
|
327
340
|
end
|
328
341
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "shelly/cli/database"
|
3
|
+
|
4
|
+
describe Shelly::CLI::Database do
|
5
|
+
before do
|
6
|
+
@database = Shelly::CLI::Database.new
|
7
|
+
Shelly::CLI::Database.stub(:new).and_return(@database)
|
8
|
+
$stdout.stub(:puts)
|
9
|
+
$stdout.stub(:print)
|
10
|
+
@client = mock
|
11
|
+
Shelly::Client.stub(:new).and_return(@client)
|
12
|
+
@client.stub(:authorize!)
|
13
|
+
@client.stub(:console)
|
14
|
+
@app = mock(:to_s => "foo-staging")
|
15
|
+
Shelly::App.stub(:new).and_return(@app)
|
16
|
+
File.open("Cloudfile", 'w') {|f| f.write("foo-staging:\n") }
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#reset" do
|
20
|
+
it "should ensure user has logged in" do
|
21
|
+
hooks(@database, :reset).should include(:logged_in?)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should reset given database via SSH" do
|
25
|
+
$stdout.should_receive(:puts).with("You are about to reset database Mongodb for cloud foo-staging")
|
26
|
+
$stdout.should_receive(:puts).with("All database objects and data will be removed")
|
27
|
+
@app.should_receive(:reset_database).with("Mongodb")
|
28
|
+
fake_stdin(["yes"]) do
|
29
|
+
invoke(@database, :reset, "Mongodb")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -100,13 +100,15 @@ describe Shelly::CLI::Deploy do
|
|
100
100
|
$stdout.should_receive(:puts).with("sidekiq workers")
|
101
101
|
$stdout.should_receive(:puts).with(green "Starting thin")
|
102
102
|
$stdout.should_receive(:puts).with("thins up and running")
|
103
|
+
$stdout.should_receive(:puts).with(green "Starting puma")
|
104
|
+
$stdout.should_receive(:puts).with("pumas up and running")
|
103
105
|
end
|
104
106
|
|
105
107
|
def response
|
106
108
|
{"created_at" => "2011-12-12 at 14:14:59", "bundle_install" => "Installing gems",
|
107
109
|
"whenever" => "Looking up schedule.rb", "thin_restart" => "thins up and running",
|
108
|
-
"
|
109
|
-
"callbacks" => "rake db:migrate"}
|
110
|
+
"puma_restart" => "pumas up and running", "delayed_job" => "delayed jobs",
|
111
|
+
"sidekiq" => "sidekiq workers", "callbacks" => "rake db:migrate"}
|
110
112
|
end
|
111
113
|
end
|
112
114
|
|
@@ -28,7 +28,7 @@ describe Shelly::CLI::File do
|
|
28
28
|
|
29
29
|
context "cloud is not running" do
|
30
30
|
it "should display error" do
|
31
|
-
@client.stub(:
|
31
|
+
@client.stub(:configured_server).and_raise(Shelly::Client::ConflictException)
|
32
32
|
$stdout.should_receive(:puts).with(red "Cloud foo-production is not running. Cannot list files.")
|
33
33
|
lambda {
|
34
34
|
invoke(@cli_files, :list, "some/path")
|
@@ -59,7 +59,7 @@ describe Shelly::CLI::File do
|
|
59
59
|
|
60
60
|
context "cloud is not running" do
|
61
61
|
it "should display error" do
|
62
|
-
@client.stub(:
|
62
|
+
@client.stub(:configured_server).and_raise(Shelly::Client::ConflictException)
|
63
63
|
$stdout.should_receive(:puts).with(red "Cloud foo-production is not running. Cannot upload files.")
|
64
64
|
lambda {
|
65
65
|
invoke(@cli_files, :upload, "some/path")
|
@@ -35,6 +35,7 @@ describe Shelly::CLI::Main do
|
|
35
35
|
out.should include("shelly check # Check if application fulfills Shelly Cloud requirements")
|
36
36
|
out.should include("shelly config <command> # Manage application configuration files")
|
37
37
|
out.should include("shelly console # Open application console")
|
38
|
+
out.should include("shelly database <command> # Manage databases")
|
38
39
|
out.should include("shelly dbconsole # Run rails dbconsole")
|
39
40
|
out.should include("shelly delete # Delete the cloud")
|
40
41
|
out.should include("shelly deploy <command> # View deploy logs")
|
@@ -1413,8 +1414,8 @@ Wait until cloud is in 'turned off' state and try again.")
|
|
1413
1414
|
|
1414
1415
|
context "Instances are not running" do
|
1415
1416
|
it "should display error" do
|
1416
|
-
@client.stub(:
|
1417
|
-
$stdout.should_receive(:puts).with(red "Cloud foo-production
|
1417
|
+
@client.stub(:configured_db_server).and_raise(Shelly::Client::ConflictException)
|
1418
|
+
$stdout.should_receive(:puts).with(red "Cloud foo-production wasn't deployed properly. Can not run dbconsole.")
|
1418
1419
|
lambda {
|
1419
1420
|
invoke(@main, :dbconsole)
|
1420
1421
|
}.should raise_error(SystemExit)
|
@@ -3,16 +3,16 @@ require "shelly/cli/organization"
|
|
3
3
|
|
4
4
|
describe Shelly::CLI::Organization do
|
5
5
|
before do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
6
|
+
FileUtils.stub(:chmod)
|
7
|
+
@organization = Shelly::CLI::Organization.new
|
8
|
+
Shelly::CLI::Organization.stub(:new).and_return(@organization)
|
9
|
+
@client = mock
|
10
|
+
Shelly::Client.stub(:new).and_return(@client)
|
11
|
+
$stdout.stub(:puts)
|
12
|
+
$stdout.stub(:print)
|
13
|
+
@client.stub(:authorize!)
|
14
|
+
FileUtils.mkdir_p("/projects/foo")
|
15
|
+
Dir.chdir("/projects/foo")
|
16
16
|
end
|
17
17
|
|
18
18
|
describe "#list" do
|
metadata
CHANGED
@@ -1,225 +1,225 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shelly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shelly Cloud team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-06-
|
11
|
+
date: 2013-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
14
15
|
requirement: !ruby/object:Gem::Requirement
|
15
16
|
requirements:
|
16
17
|
- - ~>
|
17
18
|
- !ruby/object:Gem::Version
|
18
19
|
version: 2.11.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
19
22
|
version_requirements: !ruby/object:Gem::Requirement
|
20
23
|
requirements:
|
21
24
|
- - ~>
|
22
25
|
- !ruby/object:Gem::Version
|
23
26
|
version: 2.11.0
|
24
|
-
type: :development
|
25
|
-
prerelease: false
|
26
|
-
name: rspec
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
28
29
|
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
31
|
- - ! '>='
|
31
32
|
- !ruby/object:Gem::Version
|
32
33
|
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
33
36
|
version_requirements: !ruby/object:Gem::Requirement
|
34
37
|
requirements:
|
35
38
|
- - ! '>='
|
36
39
|
- !ruby/object:Gem::Version
|
37
40
|
version: '0'
|
38
|
-
type: :development
|
39
|
-
prerelease: false
|
40
|
-
name: rake
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
+
name: guard
|
42
43
|
requirement: !ruby/object:Gem::Requirement
|
43
44
|
requirements:
|
44
45
|
- - ! '>='
|
45
46
|
- !ruby/object:Gem::Version
|
46
47
|
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
47
50
|
version_requirements: !ruby/object:Gem::Requirement
|
48
51
|
requirements:
|
49
52
|
- - ! '>='
|
50
53
|
- !ruby/object:Gem::Version
|
51
54
|
version: '0'
|
52
|
-
type: :development
|
53
|
-
prerelease: false
|
54
|
-
name: guard
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
+
name: guard-rspec
|
56
57
|
requirement: !ruby/object:Gem::Requirement
|
57
58
|
requirements:
|
58
59
|
- - ! '>='
|
59
60
|
- !ruby/object:Gem::Version
|
60
61
|
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
61
64
|
version_requirements: !ruby/object:Gem::Requirement
|
62
65
|
requirements:
|
63
66
|
- - ! '>='
|
64
67
|
- !ruby/object:Gem::Version
|
65
68
|
version: '0'
|
66
|
-
type: :development
|
67
|
-
prerelease: false
|
68
|
-
name: guard-rspec
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
70
71
|
requirement: !ruby/object:Gem::Requirement
|
71
72
|
requirements:
|
72
73
|
- - ! '>='
|
73
74
|
- !ruby/object:Gem::Version
|
74
75
|
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
75
78
|
version_requirements: !ruby/object:Gem::Requirement
|
76
79
|
requirements:
|
77
80
|
- - ! '>='
|
78
81
|
- !ruby/object:Gem::Version
|
79
82
|
version: '0'
|
80
|
-
type: :development
|
81
|
-
prerelease: false
|
82
|
-
name: simplecov
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
+
name: ruby_gntp
|
84
85
|
requirement: !ruby/object:Gem::Requirement
|
85
86
|
requirements:
|
86
87
|
- - ! '>='
|
87
88
|
- !ruby/object:Gem::Version
|
88
89
|
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
89
92
|
version_requirements: !ruby/object:Gem::Requirement
|
90
93
|
requirements:
|
91
94
|
- - ! '>='
|
92
95
|
- !ruby/object:Gem::Version
|
93
96
|
version: '0'
|
94
|
-
type: :development
|
95
|
-
prerelease: false
|
96
|
-
name: ruby_gntp
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
+
name: rb-fsevent
|
98
99
|
requirement: !ruby/object:Gem::Requirement
|
99
100
|
requirements:
|
100
101
|
- - ! '>='
|
101
102
|
- !ruby/object:Gem::Version
|
102
103
|
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
103
106
|
version_requirements: !ruby/object:Gem::Requirement
|
104
107
|
requirements:
|
105
108
|
- - ! '>='
|
106
109
|
- !ruby/object:Gem::Version
|
107
110
|
version: '0'
|
108
|
-
type: :development
|
109
|
-
prerelease: false
|
110
|
-
name: rb-fsevent
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
+
name: fakefs
|
112
113
|
requirement: !ruby/object:Gem::Requirement
|
113
114
|
requirements:
|
114
115
|
- - ! '>='
|
115
116
|
- !ruby/object:Gem::Version
|
116
117
|
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
117
120
|
version_requirements: !ruby/object:Gem::Requirement
|
118
121
|
requirements:
|
119
122
|
- - ! '>='
|
120
123
|
- !ruby/object:Gem::Version
|
121
124
|
version: '0'
|
122
|
-
type: :development
|
123
|
-
prerelease: false
|
124
|
-
name: fakefs
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
|
+
name: fakeweb
|
126
127
|
requirement: !ruby/object:Gem::Requirement
|
127
128
|
requirements:
|
128
129
|
- - ! '>='
|
129
130
|
- !ruby/object:Gem::Version
|
130
131
|
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
131
134
|
version_requirements: !ruby/object:Gem::Requirement
|
132
135
|
requirements:
|
133
136
|
- - ! '>='
|
134
137
|
- !ruby/object:Gem::Version
|
135
138
|
version: '0'
|
136
|
-
type: :development
|
137
|
-
prerelease: false
|
138
|
-
name: fakeweb
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
|
+
name: wijet-thor
|
140
141
|
requirement: !ruby/object:Gem::Requirement
|
141
142
|
requirements:
|
142
143
|
- - ~>
|
143
144
|
- !ruby/object:Gem::Version
|
144
145
|
version: 0.14.9
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
145
148
|
version_requirements: !ruby/object:Gem::Requirement
|
146
149
|
requirements:
|
147
150
|
- - ~>
|
148
151
|
- !ruby/object:Gem::Version
|
149
152
|
version: 0.14.9
|
150
|
-
type: :runtime
|
151
|
-
prerelease: false
|
152
|
-
name: wijet-thor
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
|
+
name: rest-client
|
154
155
|
requirement: !ruby/object:Gem::Requirement
|
155
156
|
requirements:
|
156
157
|
- - ! '>='
|
157
158
|
- !ruby/object:Gem::Version
|
158
159
|
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
159
162
|
version_requirements: !ruby/object:Gem::Requirement
|
160
163
|
requirements:
|
161
164
|
- - ! '>='
|
162
165
|
- !ruby/object:Gem::Version
|
163
166
|
version: '0'
|
164
|
-
type: :runtime
|
165
|
-
prerelease: false
|
166
|
-
name: rest-client
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
|
+
name: json
|
168
169
|
requirement: !ruby/object:Gem::Requirement
|
169
170
|
requirements:
|
170
171
|
- - ! '>='
|
171
172
|
- !ruby/object:Gem::Version
|
172
173
|
version: '0'
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
173
176
|
version_requirements: !ruby/object:Gem::Requirement
|
174
177
|
requirements:
|
175
178
|
- - ! '>='
|
176
179
|
- !ruby/object:Gem::Version
|
177
180
|
version: '0'
|
178
|
-
type: :runtime
|
179
|
-
prerelease: false
|
180
|
-
name: json
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
|
+
name: progressbar
|
182
183
|
requirement: !ruby/object:Gem::Requirement
|
183
184
|
requirements:
|
184
185
|
- - ! '>='
|
185
186
|
- !ruby/object:Gem::Version
|
186
187
|
version: '0'
|
188
|
+
type: :runtime
|
189
|
+
prerelease: false
|
187
190
|
version_requirements: !ruby/object:Gem::Requirement
|
188
191
|
requirements:
|
189
192
|
- - ! '>='
|
190
193
|
- !ruby/object:Gem::Version
|
191
194
|
version: '0'
|
192
|
-
type: :runtime
|
193
|
-
prerelease: false
|
194
|
-
name: progressbar
|
195
195
|
- !ruby/object:Gem::Dependency
|
196
|
+
name: launchy
|
196
197
|
requirement: !ruby/object:Gem::Requirement
|
197
198
|
requirements:
|
198
199
|
- - ! '>='
|
199
200
|
- !ruby/object:Gem::Version
|
200
201
|
version: '0'
|
202
|
+
type: :runtime
|
203
|
+
prerelease: false
|
201
204
|
version_requirements: !ruby/object:Gem::Requirement
|
202
205
|
requirements:
|
203
206
|
- - ! '>='
|
204
207
|
- !ruby/object:Gem::Version
|
205
208
|
version: '0'
|
206
|
-
type: :runtime
|
207
|
-
prerelease: false
|
208
|
-
name: launchy
|
209
209
|
- !ruby/object:Gem::Dependency
|
210
|
+
name: netrc
|
210
211
|
requirement: !ruby/object:Gem::Requirement
|
211
212
|
requirements:
|
212
213
|
- - ! '>='
|
213
214
|
- !ruby/object:Gem::Version
|
214
215
|
version: '0'
|
216
|
+
type: :runtime
|
217
|
+
prerelease: false
|
215
218
|
version_requirements: !ruby/object:Gem::Requirement
|
216
219
|
requirements:
|
217
220
|
- - ! '>='
|
218
221
|
- !ruby/object:Gem::Version
|
219
222
|
version: '0'
|
220
|
-
type: :runtime
|
221
|
-
prerelease: false
|
222
|
-
name: netrc
|
223
223
|
description: Tool for managing applications and clouds at shellycloud.com
|
224
224
|
email:
|
225
225
|
- devs@shellycloud.com
|
@@ -245,6 +245,7 @@ files:
|
|
245
245
|
- lib/shelly/cli/backup.rb
|
246
246
|
- lib/shelly/cli/command.rb
|
247
247
|
- lib/shelly/cli/config.rb
|
248
|
+
- lib/shelly/cli/database.rb
|
248
249
|
- lib/shelly/cli/deploy.rb
|
249
250
|
- lib/shelly/cli/file.rb
|
250
251
|
- lib/shelly/cli/logs.rb
|
@@ -286,6 +287,7 @@ files:
|
|
286
287
|
- spec/shelly/backup_spec.rb
|
287
288
|
- spec/shelly/cli/backup_spec.rb
|
288
289
|
- spec/shelly/cli/config_spec.rb
|
290
|
+
- spec/shelly/cli/database_spec.rb
|
289
291
|
- spec/shelly/cli/deploy_spec.rb
|
290
292
|
- spec/shelly/cli/file_spec.rb
|
291
293
|
- spec/shelly/cli/logs_spec.rb
|
@@ -332,6 +334,7 @@ test_files:
|
|
332
334
|
- spec/shelly/backup_spec.rb
|
333
335
|
- spec/shelly/cli/backup_spec.rb
|
334
336
|
- spec/shelly/cli/config_spec.rb
|
337
|
+
- spec/shelly/cli/database_spec.rb
|
335
338
|
- spec/shelly/cli/deploy_spec.rb
|
336
339
|
- spec/shelly/cli/file_spec.rb
|
337
340
|
- spec/shelly/cli/logs_spec.rb
|