ubalo 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/ubalo +57 -34
- data/lib/ubalo.rb +15 -6
- metadata +8 -8
data/bin/ubalo
CHANGED
@@ -55,9 +55,6 @@ program_desc 'Command-line access to ubalo.com.'
|
|
55
55
|
desc "Change the connect url"
|
56
56
|
flag 'connect-url'
|
57
57
|
|
58
|
-
desc "Enable debug mode"
|
59
|
-
switch :debug
|
60
|
-
|
61
58
|
desc 'Display authentication information'
|
62
59
|
command :whoami do |c|
|
63
60
|
c.action do |global_options,options,args|
|
@@ -66,22 +63,22 @@ command :whoami do |c|
|
|
66
63
|
end
|
67
64
|
|
68
65
|
desc 'Display a list of available pods'
|
69
|
-
command :
|
66
|
+
command :pods do |c|
|
70
67
|
c.action do |global_options,options,args|
|
71
68
|
response = ubalo.pods
|
72
69
|
|
73
70
|
puts "your pods:"
|
74
|
-
your_pods = response
|
71
|
+
your_pods = response.fetch('your_pods')
|
75
72
|
if your_pods.empty?
|
76
73
|
puts " (none)"
|
77
74
|
else
|
78
|
-
|
75
|
+
your_pods.each do |pod|
|
79
76
|
puts Ubalo.format_pod(pod, false)
|
80
77
|
end
|
81
78
|
end
|
82
79
|
|
83
80
|
puts "other pods:"
|
84
|
-
other_pods = response
|
81
|
+
other_pods = response.fetch('other_pods')
|
85
82
|
if other_pods.empty?
|
86
83
|
puts " (none)"
|
87
84
|
else
|
@@ -112,7 +109,7 @@ def process_download response, destination_path=nil
|
|
112
109
|
files = response.fetch('files')
|
113
110
|
destination_path ||= name
|
114
111
|
|
115
|
-
if
|
112
|
+
if File.exists?(destination_path)
|
116
113
|
raise "directory #{destination_path.inspect} already exists"
|
117
114
|
end
|
118
115
|
|
@@ -168,13 +165,13 @@ command :create do |c|
|
|
168
165
|
end
|
169
166
|
destination_path = pod_name
|
170
167
|
|
171
|
-
if
|
168
|
+
if File.exists?(pod_name)
|
172
169
|
raise "directory #{destination_path} already exists, giving up."
|
173
170
|
end
|
174
171
|
|
175
172
|
templates = ubalo.available_templates
|
176
|
-
if options
|
177
|
-
pod_type = options
|
173
|
+
if options['type']
|
174
|
+
pod_type = options['type']
|
178
175
|
unless templates.include? pod_type
|
179
176
|
raise "Invalid pod type"
|
180
177
|
end
|
@@ -186,7 +183,7 @@ command :create do |c|
|
|
186
183
|
end
|
187
184
|
|
188
185
|
$stderr.print "Creating a new #{pod_type} pod called #{pod_name}..."
|
189
|
-
response = ubalo.create_pod(pod_name, templates
|
186
|
+
response = ubalo.create_pod(pod_name, templates.fetch(pod_type))
|
190
187
|
|
191
188
|
fullname, destination_path = process_download(response)
|
192
189
|
|
@@ -203,7 +200,7 @@ command :run do |c|
|
|
203
200
|
|
204
201
|
$stderr.print "Running #{pod_name}..."
|
205
202
|
response = ubalo.submit_task(pod_name, args.join(" "))
|
206
|
-
task_label = response
|
203
|
+
task_label = response.fetch('label')
|
207
204
|
|
208
205
|
result = ubalo.wait_task(task_label)
|
209
206
|
ubalo.show_result(result)
|
@@ -268,7 +265,7 @@ command :stop do |c|
|
|
268
265
|
task_label = args.first
|
269
266
|
$stderr.print "Stopping task #{task_label}..."
|
270
267
|
result = ubalo.stop_task(task_label)
|
271
|
-
$stderr.puts " task now #{result
|
268
|
+
$stderr.puts " task now #{result.fetch('state')}."
|
272
269
|
end
|
273
270
|
end
|
274
271
|
|
@@ -279,7 +276,7 @@ command :add_key do |c|
|
|
279
276
|
public_key_file = args.shift
|
280
277
|
public_key_file ||= File.expand_path('~/.ssh/id_rsa.pub')
|
281
278
|
|
282
|
-
puts ubalo.upload_key(File.read(public_key_file))
|
279
|
+
puts ubalo.upload_key(File.read(public_key_file)).fetch('message')
|
283
280
|
end
|
284
281
|
end
|
285
282
|
|
@@ -293,7 +290,7 @@ end
|
|
293
290
|
desc 'Push code to Ubalo'
|
294
291
|
command :push do |c|
|
295
292
|
c.action do |global_options,options,args|
|
296
|
-
filenames = local_config
|
293
|
+
filenames = local_config.fetch('filenames')
|
297
294
|
contents = {}
|
298
295
|
filenames.each do |filename|
|
299
296
|
contents[filename] = File.read(filename)
|
@@ -303,8 +300,8 @@ command :push do |c|
|
|
303
300
|
fail unless filenames.length == 1
|
304
301
|
|
305
302
|
print "Uploading changes to #{filenames.first}... "
|
306
|
-
result = ubalo.push(local_config
|
307
|
-
puts result
|
303
|
+
result = ubalo.push(local_config.fetch('pod_url'), contents)
|
304
|
+
puts result.fetch('message')
|
308
305
|
end
|
309
306
|
end
|
310
307
|
|
@@ -312,27 +309,26 @@ desc 'Pull code from Ubalo'
|
|
312
309
|
command :pull do |c|
|
313
310
|
c.action do |global_options,options,args|
|
314
311
|
print "Pulling changes from Ubalo..."
|
315
|
-
contents = ubalo.pull(local_config
|
312
|
+
contents = ubalo.pull(local_config.fetch('pod_url'))
|
316
313
|
puts " received."
|
317
314
|
|
318
|
-
filenames = local_config
|
315
|
+
filenames = local_config.fetch('filenames')
|
319
316
|
|
320
317
|
filenames.each do |filename|
|
321
|
-
|
322
318
|
if File.exists?(filename)
|
323
319
|
existing_contents = File.read(filename)
|
324
320
|
else
|
325
321
|
existing_contents = nil
|
326
322
|
end
|
327
323
|
|
328
|
-
if contents
|
324
|
+
if contents.fetch(filename) == existing_contents
|
329
325
|
puts "Checking #{filename}... no changes."
|
330
326
|
else
|
331
327
|
hl.choose do |menu|
|
332
328
|
menu.prompt = "Changes made to #{filename}. Overwrite your copy? "
|
333
329
|
menu.choice :yes do
|
334
330
|
open(filename, 'w') do |f|
|
335
|
-
f.puts contents
|
331
|
+
f.puts contents.fetch(filename)
|
336
332
|
end
|
337
333
|
puts "Changes saved to #{filename}."
|
338
334
|
end
|
@@ -353,7 +349,8 @@ command :add_key do |c|
|
|
353
349
|
public_key_file = args.shift
|
354
350
|
public_key_file ||= File.expand_path('~/.ssh/id_rsa.pub')
|
355
351
|
|
356
|
-
|
352
|
+
response = ubalo.upload_key(File.read(public_key_file))
|
353
|
+
puts response.fetch('message')
|
357
354
|
end
|
358
355
|
end
|
359
356
|
|
@@ -373,6 +370,26 @@ command :edit do |c|
|
|
373
370
|
end
|
374
371
|
end
|
375
372
|
|
373
|
+
desc 'Copy files to or from a pod environ'
|
374
|
+
arg_name '<pod name>'
|
375
|
+
command :cp do |c|
|
376
|
+
c.desc 'copy recursively'
|
377
|
+
c.switch :r
|
378
|
+
|
379
|
+
c.action do |global_options,options,args|
|
380
|
+
opts = ""
|
381
|
+
opts << " -r" if options.r
|
382
|
+
|
383
|
+
environ = nil
|
384
|
+
scp_args = args.join(" ").gsub(/[\w-]+(?=:)/) do |pod_name|
|
385
|
+
ssh_path, environ = ubalo.ssh_path(pod_name)
|
386
|
+
"#{ssh_path}"
|
387
|
+
end
|
388
|
+
|
389
|
+
ubalo.scp(environ, opts, scp_args)
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
376
393
|
desc 'Enter username and password for access'
|
377
394
|
command :login do |c|
|
378
395
|
c.action do |global_options,options,args|
|
@@ -381,8 +398,8 @@ command :login do |c|
|
|
381
398
|
password = hl.ask(" password: "){|q| q.echo = false}
|
382
399
|
|
383
400
|
response = ubalo.get_api_token(login, password)
|
384
|
-
ubalo.token = response
|
385
|
-
username = response
|
401
|
+
ubalo.token = response.fetch('api_token')
|
402
|
+
username = response.fetch('username')
|
386
403
|
|
387
404
|
Ubalo.write_config(ubalo.base_url => {'token' => ubalo.token})
|
388
405
|
puts "Success! Ready to use as #{username}."
|
@@ -406,7 +423,7 @@ command :publish do |c|
|
|
406
423
|
$stderr.print "Publishing #{pod_name}..."
|
407
424
|
response = ubalo.publish(pod_name)
|
408
425
|
$stderr.puts " done."
|
409
|
-
$stderr.puts "Your pod is now available at #{response
|
426
|
+
$stderr.puts "Your pod is now available at #{response.fetch('pod_url')}."
|
410
427
|
end
|
411
428
|
end
|
412
429
|
|
@@ -435,16 +452,17 @@ pre do |global,command,options,args|
|
|
435
452
|
end
|
436
453
|
|
437
454
|
unless token or (command && command.name == :login)
|
438
|
-
|
455
|
+
$stderr.puts "No credentials found. Please run 'ubalo login'."
|
456
|
+
raise UbaloExit, 1
|
439
457
|
end
|
440
458
|
|
441
459
|
local_config_filename = ".ubalo/config"
|
442
460
|
if File.exists?(local_config_filename)
|
443
|
-
|
461
|
+
full_path = File.expand_path(local_config_filename)
|
462
|
+
@local_config = YAML.load_file(full_path)
|
444
463
|
end
|
445
464
|
|
446
465
|
@ubalo ||= Ubalo.login(token, connect_url)
|
447
|
-
@debug = global.debug
|
448
466
|
|
449
467
|
true
|
450
468
|
end
|
@@ -454,16 +472,21 @@ on_error do |exception|
|
|
454
472
|
case exception
|
455
473
|
when RestClient::BadRequest
|
456
474
|
$stderr.puts exception.inspect.sub('400 Bad Request', 'Error')
|
457
|
-
false
|
475
|
+
false # no additional raise required.
|
458
476
|
when RestClient::ResourceNotFound
|
459
477
|
$stderr.puts exception.inspect.sub('404 Resource Not Found', 'Error')
|
460
|
-
false
|
478
|
+
false # no additional raise required.
|
479
|
+
when RestClient::Unauthorized
|
480
|
+
$stderr.puts "Invalid credentials. Please use ubalo login to reset them."
|
481
|
+
true # fall back to GLI's handling
|
482
|
+
when GLI::BadCommandLine
|
483
|
+
true # fall back to GLI's handling
|
461
484
|
when UbaloExit
|
462
485
|
# Normal exit, preserving the correct exit code.
|
463
486
|
exit exception.message
|
464
487
|
else
|
465
|
-
|
466
|
-
|
488
|
+
$stderr.puts "Error! Unfortunately something went wrong. Please contact us: errors@ubalo.com."
|
489
|
+
raise # and go on to raise
|
467
490
|
end
|
468
491
|
end
|
469
492
|
|
data/lib/ubalo.rb
CHANGED
@@ -164,6 +164,15 @@ class Ubalo
|
|
164
164
|
end
|
165
165
|
end
|
166
166
|
|
167
|
+
def scp(environ, opts, args)
|
168
|
+
scp_command = "scp -o SendEnv=UBALO_ENVIRON #{opts} #{args}"
|
169
|
+
Process.spawn({'UBALO_ENVIRON' => environ}, scp_command)
|
170
|
+
pid, status = Process.wait2
|
171
|
+
unless status.success?
|
172
|
+
abort "Error running cp"
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
167
176
|
def stop_task(label)
|
168
177
|
post(:stop_task, {:label => label})
|
169
178
|
end
|
@@ -200,12 +209,12 @@ class Ubalo
|
|
200
209
|
get(:available_templates)['templates']
|
201
210
|
end
|
202
211
|
|
203
|
-
def create_pod name,
|
204
|
-
post(:create_pod, template
|
212
|
+
def create_pod name, pod_type
|
213
|
+
post(:create_pod, :template => pod_type, :pod_name => name)
|
205
214
|
end
|
206
215
|
|
207
216
|
def push pod_url, contents
|
208
|
-
url_post("#{pod_url}/api/push", contents
|
217
|
+
url_post("#{pod_url}/api/push", :contents => contents)
|
209
218
|
end
|
210
219
|
|
211
220
|
def pull pod_url
|
@@ -213,7 +222,7 @@ class Ubalo
|
|
213
222
|
end
|
214
223
|
|
215
224
|
def check_task label
|
216
|
-
check_task_json({label
|
225
|
+
check_task_json({:label => label})
|
217
226
|
end
|
218
227
|
|
219
228
|
def check_task_json hash
|
@@ -221,11 +230,11 @@ class Ubalo
|
|
221
230
|
end
|
222
231
|
|
223
232
|
def publish pod_name
|
224
|
-
post(:publish, pod_name
|
233
|
+
post(:publish, :pod_name => pod_name)
|
225
234
|
end
|
226
235
|
|
227
236
|
def unpublish pod_name
|
228
|
-
post(:unpublish, pod_name
|
237
|
+
post(:unpublish, :pod_name => pod_name)
|
229
238
|
end
|
230
239
|
|
231
240
|
private
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ubalo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-12-
|
12
|
+
date: 2011-12-07 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: gli
|
16
|
-
requirement: &
|
16
|
+
requirement: &2164902800 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2164902800
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: highline
|
27
|
-
requirement: &
|
27
|
+
requirement: &2164902220 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2164902220
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rest-client
|
38
|
-
requirement: &
|
38
|
+
requirement: &2164901580 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: 1.6.3
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2164901580
|
47
47
|
description: CLI and API client for Ubalo
|
48
48
|
email: dev@ubalo.com
|
49
49
|
executables:
|