shelly 0.0.36 → 0.0.37

Sign up to get free protection for your applications and to get access to all the features.
data/lib/shelly/app.rb CHANGED
@@ -75,6 +75,10 @@ module Shelly
75
75
  Shelly::Backup.new(attributes.merge("code_name" => code_name))
76
76
  end
77
77
 
78
+ def request_backup(kind)
79
+ shelly.request_backup(code_name, kind)
80
+ end
81
+
78
82
  def logs
79
83
  shelly.cloud_logs(code_name)
80
84
  end
@@ -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
- get("/users/new", :ssh_key => ssh_key)
144
+ get("/users/new", :ssh_key => ssh_key)
141
145
  end
142
146
 
143
147
  def app_users(cloud)
@@ -1,3 +1,3 @@
1
1
  module Shelly
2
- VERSION = "0.0.36"
2
+ VERSION = "0.0.37"
3
3
  end
@@ -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
- version: 0.0.36
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
- date: 2011-12-27 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
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
- version_requirements: *70232388827320
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
- version: '0'
33
- type: :development
34
- prerelease: false
35
- version_requirements: *70232388826900
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
- version_requirements: *70232388826480
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
- version: '0'
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
- version_requirements: *70232388826060
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
- version: '0'
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
- version_requirements: *70232388825540
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
- version: '0'
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
77
74
  type: :development
78
- prerelease: false
79
- version_requirements: *70232388825120
80
- - !ruby/object:Gem::Dependency
75
+ version_requirements: *id004
76
+ - !ruby/object:Gem::Dependency
81
77
  name: fakefs
82
- requirement: &70232388824600 !ruby/object:Gem::Requirement
78
+ prerelease: false
79
+ requirement: &id005 !ruby/object:Gem::Requirement
83
80
  none: false
84
- requirements:
85
- - - ! '>='
86
- - !ruby/object:Gem::Version
87
- version: '0'
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
88
  type: :development
89
- prerelease: false
90
- version_requirements: *70232388824600
91
- - !ruby/object:Gem::Dependency
89
+ version_requirements: *id005
90
+ - !ruby/object:Gem::Dependency
92
91
  name: fakeweb
93
- requirement: &70232388824140 !ruby/object:Gem::Requirement
92
+ prerelease: false
93
+ requirement: &id006 !ruby/object:Gem::Requirement
94
94
  none: false
95
- requirements:
96
- - - ! '>='
97
- - !ruby/object:Gem::Version
98
- version: '0'
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ hash: 3
99
+ segments:
100
+ - 0
101
+ version: "0"
99
102
  type: :development
100
- prerelease: false
101
- version_requirements: *70232388824140
102
- - !ruby/object:Gem::Dependency
103
+ version_requirements: *id006
104
+ - !ruby/object:Gem::Dependency
103
105
  name: wijet-thor
104
- requirement: &70232388823400 !ruby/object:Gem::Requirement
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
- prerelease: false
112
- version_requirements: *70232388823400
113
- - !ruby/object:Gem::Dependency
119
+ version_requirements: *id007
120
+ - !ruby/object:Gem::Dependency
114
121
  name: rest-client
115
- requirement: &70232388821260 !ruby/object:Gem::Requirement
122
+ prerelease: false
123
+ requirement: &id008 !ruby/object:Gem::Requirement
116
124
  none: false
117
- requirements:
118
- - - ! '>='
119
- - !ruby/object:Gem::Version
120
- version: '0'
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ hash: 3
129
+ segments:
130
+ - 0
131
+ version: "0"
121
132
  type: :runtime
122
- prerelease: false
123
- version_requirements: *70232388821260
124
- - !ruby/object:Gem::Dependency
133
+ version_requirements: *id008
134
+ - !ruby/object:Gem::Dependency
125
135
  name: json
126
- requirement: &70232388820800 !ruby/object:Gem::Requirement
136
+ prerelease: false
137
+ requirement: &id009 !ruby/object:Gem::Requirement
127
138
  none: false
128
- requirements:
129
- - - ! '>='
130
- - !ruby/object:Gem::Version
131
- version: '0'
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ hash: 3
143
+ segments:
144
+ - 0
145
+ version: "0"
132
146
  type: :runtime
133
- prerelease: false
134
- version_requirements: *70232388820800
135
- - !ruby/object:Gem::Dependency
147
+ version_requirements: *id009
148
+ - !ruby/object:Gem::Dependency
136
149
  name: wijet-launchy
137
- requirement: &70232388820380 !ruby/object:Gem::Requirement
150
+ prerelease: false
151
+ requirement: &id010 !ruby/object:Gem::Requirement
138
152
  none: false
139
- requirements:
140
- - - ! '>='
141
- - !ruby/object:Gem::Version
142
- version: '0'
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ hash: 3
157
+ segments:
158
+ - 0
159
+ version: "0"
143
160
  type: :runtime
144
- prerelease: false
145
- version_requirements: *70232388820380
146
- - !ruby/object:Gem::Dependency
161
+ version_requirements: *id010
162
+ - !ruby/object:Gem::Dependency
147
163
  name: progressbar
148
- requirement: &70232388808000 !ruby/object:Gem::Requirement
164
+ prerelease: false
165
+ requirement: &id011 !ruby/object:Gem::Requirement
149
166
  none: false
150
- requirements:
151
- - - ! '>='
152
- - !ruby/object:Gem::Version
153
- version: '0'
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ hash: 3
171
+ segments:
172
+ - 0
173
+ version: "0"
154
174
  type: :runtime
155
- prerelease: false
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
- files:
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
- require_paths:
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
- version: '0'
225
- required_rubygems_version: !ruby/object:Gem::Requirement
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
- version: '0'
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
- - spec/helpers.rb
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
+