ubalo 0.14 → 0.15

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 CHANGED
@@ -7,6 +7,8 @@ include GLI
7
7
 
8
8
  require 'yaml'
9
9
  require 'fileutils'
10
+ require 'shellwords'
11
+ require 'launchy'
10
12
 
11
13
  require 'highline'
12
14
  hl = HighLine.new
@@ -171,16 +173,12 @@ end
171
173
 
172
174
  desc 'Run a pod'
173
175
  command :run do |c|
174
- c.action do |global_options,options,args|
175
- logger.puts "Running #{pod.fullname}."
176
- task = pod.run(args.shift)
176
+ c.flag :arg
177
+ c.switch :v2
177
178
 
178
- tailer = Ubalo::Tailer.new(logger)
179
- tailer.poll_on("Waiting for task #{task.label.inspect}") do
180
- task.refresh!
181
- tailer.update(task.process_output)
182
- task.complete?
183
- end
179
+ c.action do |global_options,options,args|
180
+ task = pod.run(options.v2 || pod_dir.v2?, args, options.arg)
181
+ task.tail_process
184
182
  puts task.printable_result
185
183
  end
186
184
  end
@@ -193,11 +191,19 @@ command :pod do |c|
193
191
  end
194
192
  end
195
193
 
194
+ desc 'Open the pod in a browser'
195
+ command 'pod:open' do |c|
196
+ c.action do |global_options,options,args|
197
+ Launchy.open(pod.url)
198
+ end
199
+ end
200
+
196
201
  desc 'Run a pod in the background'
197
202
  command :submit do |c|
203
+ c.flag :arg
204
+
198
205
  c.action do |global_options,options,args|
199
- logger.print "Submitting #{pod.fullname}..."
200
- task = pod.run(args.shift)
206
+ task = pod.run(pod_dir.v2?, args, options.arg)
201
207
  logger.puts " done."
202
208
  puts task.printable_result
203
209
  end
@@ -217,6 +223,20 @@ command :task do |c|
217
223
  end
218
224
  end
219
225
 
226
+ desc 'Open the task in a browser'
227
+ arg_name '<task label>'
228
+ command 'task:open' do |c|
229
+ c.action do |global_options,options,args|
230
+ if label = args.shift
231
+ task = account.task_by_label!(label)
232
+ else
233
+ task = pod.latest_task
234
+ end
235
+
236
+ Launchy.open(task.url)
237
+ end
238
+ end
239
+
220
240
  desc 'Stop a task'
221
241
  arg_name '<task label>'
222
242
  command 'task:stop' do |c|
@@ -240,14 +260,25 @@ end
240
260
  desc 'Push files to Ubalo'
241
261
  command :push do |c|
242
262
  c.action do |global_options,options,args|
243
- logger.print "Pushing files to #{pod.fullname.inspect}..."
244
263
  pod.push_from(pod_dir)
245
- logger.puts " done."
246
- logger.poll_on("Waiting for #{pod.fullname.inspect} to compile") do
247
- pod.refresh!
248
- pod.compiled?
249
- end
264
+ pod.tail_process
265
+ puts pod.printable_result
266
+ end
267
+ end
268
+
269
+ desc 'Push files and run'
270
+ command 'push-run' do |c|
271
+ c.flag :arg
272
+ c.switch :v2
273
+
274
+ c.action do |global_options,options,args|
275
+ pod.push_from(pod_dir)
276
+ pod.tail_process
250
277
  puts pod.printable_result
278
+
279
+ task = pod.run(options.v2 || pod_dir.v2?, args, options.arg)
280
+ task.tail_process
281
+ puts task.printable_result
251
282
  end
252
283
  end
253
284
 
@@ -15,7 +15,11 @@ module Ubalo
15
15
  if authorization and !options[:skip_authorization]
16
16
  options[:authorization] = authorization
17
17
  end
18
- Util.http_request(method, "#{@base_url}#{path}", options)
18
+ Util.http_request(method, url_for(path), options)
19
+ end
20
+
21
+ def url_for(path)
22
+ "#{@base_url}#{path}"
19
23
  end
20
24
 
21
25
  def authorize(login, password)
@@ -37,12 +37,28 @@ module Ubalo
37
37
  end
38
38
  end
39
39
 
40
- def run(arg)
40
+ def run(version2, argv, arg)
41
+ if version2
42
+ if argv.empty?
43
+ raise Ubalo::Error, "Specify the command to run"
44
+ end
45
+ else
46
+ arg = argv.shift || arg
47
+ argv = ["sh", "run.sh"]
48
+ end
49
+
50
+ logger.print "Running #{Shellwords.join(argv)} inside #{fullname}..."
51
+
41
52
  params = {
42
53
  :arg_content_type => UbaloJSON.content_type,
43
- :arg => UbaloJSON.dump(arg)
54
+ :arg => UbaloJSON.dump(arg),
55
+ :argv => argv,
44
56
  }
45
- @account.task_from_json(request(:post, "/tasks", :params => params))
57
+ task = @account.task_from_json(request(:post, "/tasks", :params => params))
58
+
59
+ logger.puts " done."
60
+
61
+ task
46
62
  rescue RestClient::Conflict
47
63
  raise Ubalo::Error, "Cannot run pod while compiling"
48
64
  rescue RestClient::ResourceNotFound
@@ -58,10 +74,14 @@ module Ubalo
58
74
  end
59
75
 
60
76
  def push_from(pod_dir)
77
+ logger.print "Pushing files to #{fullname.inspect}..."
78
+
61
79
  pod_dir.assert_not_empty!
62
80
  update!
63
81
  new_archive.activate_from(pod_dir)
64
82
  refresh!
83
+
84
+ logger.puts " done."
65
85
  end
66
86
 
67
87
  def clone_to(pod_dir)
@@ -74,6 +94,15 @@ module Ubalo
74
94
  state == 'compiled'
75
95
  end
76
96
 
97
+ def tail_process
98
+ tailer = Ubalo::Tailer.new(logger)
99
+ tailer.poll_on("Waiting for #{fullname.inspect} to compile") do
100
+ refresh!
101
+ tailer.update(process_output)
102
+ compiled?
103
+ end
104
+ end
105
+
77
106
  def delete!
78
107
  request(:delete, nil, :parse => false)
79
108
  @deleted = true
@@ -107,6 +136,20 @@ module Ubalo
107
136
  fullname == other.fullname
108
137
  end
109
138
 
139
+ attr_reader :compilation_process
140
+
141
+ def process_output
142
+ if compilation_process
143
+ if data = compilation_process.fetch('output')
144
+ data
145
+ end
146
+ end
147
+ end
148
+
149
+ def url
150
+ @account.url_for(path_prefix)
151
+ end
152
+
110
153
  private
111
154
  def update_attributes(attributes)
112
155
  @state = attributes['state']
@@ -124,7 +167,11 @@ module Ubalo
124
167
  end
125
168
 
126
169
  def request method, path = nil, options = {}
127
- @account.request(method, "/pods/#{fullname}#{path}", options)
170
+ @account.request(method, "#{path_prefix}#{path}", options)
171
+ end
172
+
173
+ def path_prefix
174
+ "/pods/#{fullname}"
128
175
  end
129
176
  end
130
177
  end
@@ -10,6 +10,16 @@ module Ubalo
10
10
  @path = path
11
11
  end
12
12
 
13
+ def v2?
14
+ inited? && manifest.include?(".ubalov2")
15
+ end
16
+
17
+ def inited?
18
+ in_path do
19
+ File.exist?("Ubalopod")
20
+ end
21
+ end
22
+
13
23
  def name
14
24
  in_path do
15
25
  File.read("Ubalopod").strip
@@ -1,6 +1,6 @@
1
1
  module Ubalo
2
2
  class Task
3
- attr_reader :label, :state, :pod_name, :arg_error, :output_error, :submitted_at, :elapsed_time
3
+ attr_reader :label, :state, :pod_name, :argv, :arg_error, :output_error, :submitted_at, :elapsed_time
4
4
 
5
5
  def self.create_with_json(account, json)
6
6
  new(account, json.fetch('label'), json)
@@ -26,6 +26,15 @@ module Ubalo
26
26
  state == 'exited'
27
27
  end
28
28
 
29
+ def tail_process
30
+ tailer = Ubalo::Tailer.new(logger)
31
+ tailer.poll_on("Waiting for task #{label.inspect}") do
32
+ refresh!
33
+ tailer.update(process_output)
34
+ complete?
35
+ end
36
+ end
37
+
29
38
  def stop!
30
39
  request(:put, "/stop")
31
40
  refresh!
@@ -43,6 +52,7 @@ module Ubalo
43
52
  s = ""
44
53
  s << " label: #{label}\n"
45
54
  s << " pod: #{pod_name}\n"
55
+ s << " argv: #{pretty_argv}\n"
46
56
  if arg?
47
57
  if @arg_error
48
58
  s << "! Parse error in arg: #{@arg_error.message}"
@@ -83,12 +93,21 @@ module Ubalo
83
93
  end
84
94
  end
85
95
 
96
+ def pretty_argv
97
+ Shellwords.join(argv)
98
+ end
99
+
86
100
  attr_reader :container_process
87
101
 
102
+ def url
103
+ @account.url_for(path_prefix)
104
+ end
105
+
88
106
  private
89
107
 
90
108
  def update_attributes(attributes)
91
109
  @state = attributes['state']
110
+ @argv = attributes['argv']
92
111
  @arg = attributes['arg']
93
112
  @pod_name = attributes['pod_name']
94
113
  @container_process = attributes['container_process']
@@ -130,9 +149,12 @@ module Ubalo
130
149
  @output || @output_error
131
150
  end
132
151
 
133
-
134
152
  def request method, path = nil, options = {}
135
- @account.request(method, "/tasks/#{label}#{path}", options)
153
+ @account.request(method, "#{path_prefix}#{path}", options)
154
+ end
155
+
156
+ def path_prefix
157
+ "/tasks/#{label}"
136
158
  end
137
159
  end
138
160
  end
@@ -1,6 +1,6 @@
1
1
  module Ubalo
2
2
  unless const_defined?('VERSION')
3
- VERSION = "0.14"
3
+ VERSION = "0.15"
4
4
  end
5
5
 
6
6
  def self.version
@@ -19,7 +19,7 @@ echo "Please edit run.sh to get started."
19
19
  # Sample main.py:
20
20
  #
21
21
  # import ubalo
22
- # ubalo.output("The argument was %s." % ubalo.arg)
22
+ # ubalo.output("The argument was %s." % ubalo.arg())
23
23
 
24
24
 
25
25
  ## R code? ##
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.14'
4
+ version: '0.15'
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: 2012-05-22 00:00:00.000000000 Z
12
+ date: 2012-06-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: gli
16
- requirement: &70233277486400 !ruby/object:Gem::Requirement
16
+ requirement: &70318706609560 !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: *70233277486400
24
+ version_requirements: *70318706609560
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: highline
27
- requirement: &70233277485980 !ruby/object:Gem::Requirement
27
+ requirement: &70318706608600 !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: *70233277485980
35
+ version_requirements: *70318706608600
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: json
38
- requirement: &70233277485560 !ruby/object:Gem::Requirement
38
+ requirement: &70318706607400 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70233277485560
46
+ version_requirements: *70318706607400
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rest-client
49
- requirement: &70233277485060 !ruby/object:Gem::Requirement
49
+ requirement: &70318706606660 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.6.3
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70233277485060
57
+ version_requirements: *70318706606660
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: archive-tar-minitar
60
- requirement: &70233277484640 !ruby/object:Gem::Requirement
60
+ requirement: &70318706605940 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,18 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70233277484640
68
+ version_requirements: *70318706605940
69
+ - !ruby/object:Gem::Dependency
70
+ name: launchy
71
+ requirement: &70318706604880 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *70318706604880
69
80
  description: CLI and API client for Ubalo
70
81
  email: dev@ubalo.com
71
82
  executables:
@@ -110,4 +121,3 @@ signing_key:
110
121
  specification_version: 3
111
122
  summary: CLI and API client for Ubalo
112
123
  test_files: []
113
- has_rdoc: