shelly 0.0.36 → 0.0.37
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/shelly/app.rb +4 -0
- data/lib/shelly/cli/backup.rb +17 -1
- data/lib/shelly/client.rb +5 -1
- data/lib/shelly/version.rb +1 -1
- data/spec/shelly/cli/backup_spec.rb +48 -11
- metadata +159 -145
data/lib/shelly/app.rb
CHANGED
data/lib/shelly/cli/backup.rb
CHANGED
@@ -13,7 +13,6 @@ module Shelly
|
|
13
13
|
:desc => "Specify which cloud to list backups for"
|
14
14
|
def list
|
15
15
|
logged_in?
|
16
|
-
say_error "Must be run inside your project git repository" unless App.inside_git_repository?
|
17
16
|
say_error "No Cloudfile found" unless Cloudfile.present?
|
18
17
|
multiple_clouds(options[:cloud], "backup list", "Select cloud to view database backups for using:")
|
19
18
|
backups = @app.database_backups
|
@@ -56,6 +55,23 @@ module Shelly
|
|
56
55
|
raise e
|
57
56
|
end
|
58
57
|
end
|
58
|
+
|
59
|
+
desc "create [KIND]", "Creates current snapshot of given database. Default: all databases."
|
60
|
+
method_option :cloud, :type => :string, :aliases => "-c",
|
61
|
+
:desc => "Specify which cloud to create database snapshot for"
|
62
|
+
def create(kind = nil)
|
63
|
+
logged_in?
|
64
|
+
multiple_clouds(options[:cloud], "backup create", "Select cloud to create snapshot of database")
|
65
|
+
@app.request_backup(kind)
|
66
|
+
say "Backup requested. It can take up to several minutes for" +
|
67
|
+
"the backup process to finish and the backup to show up in backups list.", :green
|
68
|
+
rescue Client::APIError => e
|
69
|
+
if e.unauthorized?
|
70
|
+
say_error "You have no access to '#{@app.code_name}' cloud defined in Cloudfile"
|
71
|
+
else
|
72
|
+
say_error e.message
|
73
|
+
end
|
74
|
+
end
|
59
75
|
end
|
60
76
|
end
|
61
77
|
end
|
data/lib/shelly/client.rb
CHANGED
@@ -136,8 +136,12 @@ module Shelly
|
|
136
136
|
get("/apps/#{code_name}/database_backups/#{handler}")
|
137
137
|
end
|
138
138
|
|
139
|
+
def request_backup(code_name, kind = nil)
|
140
|
+
post("/apps/#{code_name}/database_backups", :kind => kind)
|
141
|
+
end
|
142
|
+
|
139
143
|
def ssh_key_available?(ssh_key)
|
140
|
-
|
144
|
+
get("/users/new", :ssh_key => ssh_key)
|
141
145
|
end
|
142
146
|
|
143
147
|
def app_users(cloud)
|
data/lib/shelly/version.rb
CHANGED
@@ -14,6 +14,12 @@ describe Shelly::CLI::Backup do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
describe "#list" do
|
17
|
+
before do
|
18
|
+
FileUtils.mkdir_p("/projects/foo")
|
19
|
+
Dir.chdir("/projects/foo")
|
20
|
+
File.open("Cloudfile", 'w') {|f| f.write("foo-staging:\n") }
|
21
|
+
end
|
22
|
+
|
17
23
|
it "should exit with message if there is no Cloudfile" do
|
18
24
|
File.delete("Cloudfile")
|
19
25
|
$stdout.should_receive(:puts).with("\e[31mNo Cloudfile found\e[0m")
|
@@ -55,7 +61,7 @@ describe Shelly::CLI::Backup do
|
|
55
61
|
@backup.list
|
56
62
|
end
|
57
63
|
end
|
58
|
-
|
64
|
+
|
59
65
|
describe "#get" do
|
60
66
|
before do
|
61
67
|
@client.stub(:download_backup)
|
@@ -64,35 +70,35 @@ describe Shelly::CLI::Backup do
|
|
64
70
|
@client.stub(:database_backup).and_return({"filename" => "better.tar.gz", "size" => 12345})
|
65
71
|
$stdout.stub(:puts)
|
66
72
|
end
|
67
|
-
|
73
|
+
|
68
74
|
it "should make sure that cloud is choosen" do
|
69
75
|
@client.should_receive(:database_backup).with("foo-staging", "last")
|
70
76
|
@backup.get
|
71
|
-
|
77
|
+
|
72
78
|
@backup.options = {:cloud => "other"}
|
73
79
|
@client.should_receive(:database_backup).with("other", "last")
|
74
80
|
@backup.get
|
75
81
|
end
|
76
|
-
|
82
|
+
|
77
83
|
it "should fetch backup size and initialize download progress bar" do
|
78
84
|
@client.stub(:database_backup).and_return({"filename" => "backup.postgres.tar.gz", "size" => 333})
|
79
85
|
Shelly::DownloadProgressBar.should_receive(:new).with(333).and_return(@bar)
|
80
|
-
|
86
|
+
|
81
87
|
@backup.get
|
82
88
|
end
|
83
|
-
|
89
|
+
|
84
90
|
it "should fetch given backup file itself" do
|
85
91
|
@client.should_receive(:download_backup).with("foo-staging", "better.tar.gz", @bar.progress_callback)
|
86
92
|
@backup.get("better.tar.gz")
|
87
93
|
end
|
88
|
-
|
94
|
+
|
89
95
|
it "should show info where file has been saved" do
|
90
96
|
$stdout.should_receive(:puts)
|
91
97
|
$stdout.should_receive(:puts).with(green "Backup file saved to better.tar.gz")
|
92
98
|
@client.should_receive(:download_backup).with("foo-staging", "better.tar.gz", @bar.progress_callback)
|
93
99
|
@backup.get("last")
|
94
100
|
end
|
95
|
-
|
101
|
+
|
96
102
|
context "on backup not found" do
|
97
103
|
it "it should display error message" do
|
98
104
|
exception = Shelly::Client::APIError.new({}.to_json, 404)
|
@@ -102,18 +108,49 @@ describe Shelly::CLI::Backup do
|
|
102
108
|
@backup.get("better.tar.gz")
|
103
109
|
end
|
104
110
|
end
|
105
|
-
|
111
|
+
|
106
112
|
context "on unsupported exception" do
|
107
113
|
it "should re-raise it" do
|
108
114
|
exception = Shelly::Client::APIError.new({}.to_json, 500)
|
109
115
|
@client.stub(:database_backup).and_raise(exception)
|
110
116
|
$stdout.should_not_receive(:puts).with(red "Backup not found")
|
111
117
|
$stdout.should_not_receive(:puts).with("You can list available backups with 'shelly backup list' command")
|
112
|
-
lambda {
|
113
|
-
@backup.get("better.tar.gz")
|
118
|
+
lambda {
|
119
|
+
@backup.get("better.tar.gz")
|
114
120
|
}.should raise_error(Shelly::Client::APIError)
|
115
121
|
end
|
116
122
|
end
|
117
123
|
end
|
118
124
|
end
|
125
|
+
|
126
|
+
describe "create" do
|
127
|
+
before do
|
128
|
+
FileUtils.mkdir_p("/projects/foo")
|
129
|
+
Dir.chdir("/projects/foo")
|
130
|
+
File.open("Cloudfile", 'w') {|f| f.write("foo-staging:\n") }
|
131
|
+
end
|
132
|
+
|
133
|
+
it "should exit if user doesn't have access to cloud in Cloudfile" do
|
134
|
+
response = {"message" => "Cloud foo-staging not found"}
|
135
|
+
exception = Shelly::Client::APIError.new(response.to_json, 404)
|
136
|
+
@client.stub(:request_backup).and_raise(exception)
|
137
|
+
$stdout.should_receive(:puts).with(red "You have no access to 'foo-staging' cloud defined in Cloudfile")
|
138
|
+
lambda { @backup.create }.should raise_error(SystemExit)
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should display errors and exit 1 when kind is not valid" do
|
142
|
+
response = {"message" => "Wrong KIND argument. User one of following: postgresql, mongodb, redis"}
|
143
|
+
exception = Shelly::Client::APIError.new(response.to_json, 404)
|
144
|
+
@client.should_receive(:request_backup).and_raise(exception)
|
145
|
+
$stdout.should_receive(:puts).with(red response["message"])
|
146
|
+
lambda { @backup.create }.should raise_error(SystemExit)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should display information about request backup" do
|
150
|
+
@client.stub(:request_backup)
|
151
|
+
$stdout.should_receive(:puts).with(green "Backup requested. It can take up to several minutes for" +
|
152
|
+
"the backup process to finish and the backup to show up in backups list.")
|
153
|
+
@backup.create
|
154
|
+
end
|
155
|
+
end
|
119
156
|
end
|
metadata
CHANGED
@@ -1,167 +1,188 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: shelly
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 85
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 37
|
10
|
+
version: 0.0.37
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Shelly Cloud team
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
17
|
+
|
18
|
+
date: 2011-12-27 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
15
21
|
name: rspec
|
16
|
-
requirement: &70232388827320 !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
22
|
-
type: :development
|
23
22
|
prerelease: false
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: rake
|
27
|
-
requirement: &70232388826900 !ruby/object:Gem::Requirement
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
28
24
|
none: false
|
29
|
-
requirements:
|
30
|
-
- -
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: guard
|
38
|
-
requirement: &70232388826480 !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
|
-
requirements:
|
41
|
-
- - ! '>='
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '0'
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
44
32
|
type: :development
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: rake
|
45
36
|
prerelease: false
|
46
|
-
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: guard-rspec
|
49
|
-
requirement: &70232388826060 !ruby/object:Gem::Requirement
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
50
38
|
none: false
|
51
|
-
requirements:
|
52
|
-
- -
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
55
46
|
type: :development
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: guard
|
56
50
|
prerelease: false
|
57
|
-
|
58
|
-
- !ruby/object:Gem::Dependency
|
59
|
-
name: growl_notify
|
60
|
-
requirement: &70232388825540 !ruby/object:Gem::Requirement
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
61
52
|
none: false
|
62
|
-
requirements:
|
63
|
-
- -
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
66
60
|
type: :development
|
61
|
+
version_requirements: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: guard-rspec
|
67
64
|
prerelease: false
|
68
|
-
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rb-fsevent
|
71
|
-
requirement: &70232388825120 !ruby/object:Gem::Requirement
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
72
66
|
none: false
|
73
|
-
requirements:
|
74
|
-
- -
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
77
74
|
type: :development
|
78
|
-
|
79
|
-
|
80
|
-
- !ruby/object:Gem::Dependency
|
75
|
+
version_requirements: *id004
|
76
|
+
- !ruby/object:Gem::Dependency
|
81
77
|
name: fakefs
|
82
|
-
|
78
|
+
prerelease: false
|
79
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
83
80
|
none: false
|
84
|
-
requirements:
|
85
|
-
- -
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
hash: 3
|
85
|
+
segments:
|
86
|
+
- 0
|
87
|
+
version: "0"
|
88
88
|
type: :development
|
89
|
-
|
90
|
-
|
91
|
-
- !ruby/object:Gem::Dependency
|
89
|
+
version_requirements: *id005
|
90
|
+
- !ruby/object:Gem::Dependency
|
92
91
|
name: fakeweb
|
93
|
-
|
92
|
+
prerelease: false
|
93
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
|
-
requirements:
|
96
|
-
- -
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
hash: 3
|
99
|
+
segments:
|
100
|
+
- 0
|
101
|
+
version: "0"
|
99
102
|
type: :development
|
100
|
-
|
101
|
-
|
102
|
-
- !ruby/object:Gem::Dependency
|
103
|
+
version_requirements: *id006
|
104
|
+
- !ruby/object:Gem::Dependency
|
103
105
|
name: wijet-thor
|
104
|
-
|
106
|
+
prerelease: false
|
107
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
105
108
|
none: false
|
106
|
-
requirements:
|
109
|
+
requirements:
|
107
110
|
- - ~>
|
108
|
-
- !ruby/object:Gem::Version
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
hash: 41
|
113
|
+
segments:
|
114
|
+
- 0
|
115
|
+
- 14
|
116
|
+
- 7
|
109
117
|
version: 0.14.7
|
110
118
|
type: :runtime
|
111
|
-
|
112
|
-
|
113
|
-
- !ruby/object:Gem::Dependency
|
119
|
+
version_requirements: *id007
|
120
|
+
- !ruby/object:Gem::Dependency
|
114
121
|
name: rest-client
|
115
|
-
|
122
|
+
prerelease: false
|
123
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
116
124
|
none: false
|
117
|
-
requirements:
|
118
|
-
- -
|
119
|
-
- !ruby/object:Gem::Version
|
120
|
-
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
hash: 3
|
129
|
+
segments:
|
130
|
+
- 0
|
131
|
+
version: "0"
|
121
132
|
type: :runtime
|
122
|
-
|
123
|
-
|
124
|
-
- !ruby/object:Gem::Dependency
|
133
|
+
version_requirements: *id008
|
134
|
+
- !ruby/object:Gem::Dependency
|
125
135
|
name: json
|
126
|
-
|
136
|
+
prerelease: false
|
137
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
127
138
|
none: false
|
128
|
-
requirements:
|
129
|
-
- -
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
|
139
|
+
requirements:
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
hash: 3
|
143
|
+
segments:
|
144
|
+
- 0
|
145
|
+
version: "0"
|
132
146
|
type: :runtime
|
133
|
-
|
134
|
-
|
135
|
-
- !ruby/object:Gem::Dependency
|
147
|
+
version_requirements: *id009
|
148
|
+
- !ruby/object:Gem::Dependency
|
136
149
|
name: wijet-launchy
|
137
|
-
|
150
|
+
prerelease: false
|
151
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
138
152
|
none: false
|
139
|
-
requirements:
|
140
|
-
- -
|
141
|
-
- !ruby/object:Gem::Version
|
142
|
-
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
hash: 3
|
157
|
+
segments:
|
158
|
+
- 0
|
159
|
+
version: "0"
|
143
160
|
type: :runtime
|
144
|
-
|
145
|
-
|
146
|
-
- !ruby/object:Gem::Dependency
|
161
|
+
version_requirements: *id010
|
162
|
+
- !ruby/object:Gem::Dependency
|
147
163
|
name: progressbar
|
148
|
-
|
164
|
+
prerelease: false
|
165
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
149
166
|
none: false
|
150
|
-
requirements:
|
151
|
-
- -
|
152
|
-
- !ruby/object:Gem::Version
|
153
|
-
|
167
|
+
requirements:
|
168
|
+
- - ">="
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
hash: 3
|
171
|
+
segments:
|
172
|
+
- 0
|
173
|
+
version: "0"
|
154
174
|
type: :runtime
|
155
|
-
|
156
|
-
version_requirements: *70232388808000
|
175
|
+
version_requirements: *id011
|
157
176
|
description: Tool for managing applications and clouds at shellycloud.com
|
158
|
-
email:
|
177
|
+
email:
|
159
178
|
- support@shellycloud.com
|
160
|
-
executables:
|
179
|
+
executables:
|
161
180
|
- shelly
|
162
181
|
extensions: []
|
182
|
+
|
163
183
|
extra_rdoc_files: []
|
164
|
-
|
184
|
+
|
185
|
+
files:
|
165
186
|
- .gitignore
|
166
187
|
- .travis.yml
|
167
188
|
- Gemfile
|
@@ -212,43 +233,36 @@ files:
|
|
212
233
|
- spec/thor/options_spec.rb
|
213
234
|
homepage: http://shellycloud.com
|
214
235
|
licenses: []
|
236
|
+
|
215
237
|
post_install_message:
|
216
238
|
rdoc_options: []
|
217
|
-
|
239
|
+
|
240
|
+
require_paths:
|
218
241
|
- lib
|
219
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
242
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
220
243
|
none: false
|
221
|
-
requirements:
|
222
|
-
- -
|
223
|
-
- !ruby/object:Gem::Version
|
224
|
-
|
225
|
-
|
244
|
+
requirements:
|
245
|
+
- - ">="
|
246
|
+
- !ruby/object:Gem::Version
|
247
|
+
hash: 3
|
248
|
+
segments:
|
249
|
+
- 0
|
250
|
+
version: "0"
|
251
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
226
252
|
none: false
|
227
|
-
requirements:
|
228
|
-
- -
|
229
|
-
- !ruby/object:Gem::Version
|
230
|
-
|
253
|
+
requirements:
|
254
|
+
- - ">="
|
255
|
+
- !ruby/object:Gem::Version
|
256
|
+
hash: 3
|
257
|
+
segments:
|
258
|
+
- 0
|
259
|
+
version: "0"
|
231
260
|
requirements: []
|
261
|
+
|
232
262
|
rubyforge_project: shelly
|
233
263
|
rubygems_version: 1.8.10
|
234
264
|
signing_key:
|
235
265
|
specification_version: 3
|
236
266
|
summary: Shelly Cloud command line tool
|
237
|
-
test_files:
|
238
|
-
|
239
|
-
- spec/input_faker.rb
|
240
|
-
- spec/shelly/app_spec.rb
|
241
|
-
- spec/shelly/backup_spec.rb
|
242
|
-
- spec/shelly/cli/backup_spec.rb
|
243
|
-
- spec/shelly/cli/config_spec.rb
|
244
|
-
- spec/shelly/cli/deploys_spec.rb
|
245
|
-
- spec/shelly/cli/main_spec.rb
|
246
|
-
- spec/shelly/cli/runner_spec.rb
|
247
|
-
- spec/shelly/cli/user_spec.rb
|
248
|
-
- spec/shelly/client_spec.rb
|
249
|
-
- spec/shelly/cloudfile_spec.rb
|
250
|
-
- spec/shelly/download_progress_bar_spec.rb
|
251
|
-
- spec/shelly/model_spec.rb
|
252
|
-
- spec/shelly/user_spec.rb
|
253
|
-
- spec/spec_helper.rb
|
254
|
-
- spec/thor/options_spec.rb
|
267
|
+
test_files: []
|
268
|
+
|