ubalo 0.0.10 → 0.0.11
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/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:
|