ubalo 0.5 → 0.6

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
@@ -19,7 +19,10 @@ end
19
19
 
20
20
  use_openstruct true
21
21
 
22
- logger = Ubalo::Util::Logger.new
22
+
23
+ def logger
24
+ @logger ||= Ubalo::Util::Logger.new
25
+ end
23
26
 
24
27
  def connect_url
25
28
  @connect_url
@@ -61,6 +64,7 @@ end
61
64
  desc 'Display authentication information'
62
65
  command :whoami do |c|
63
66
  c.action do |global_options,options,args|
67
+ account.refresh!
64
68
  puts "You are logged in as #{account.username}."
65
69
  end
66
70
  end
@@ -120,13 +124,10 @@ command :clone do |c|
120
124
  end
121
125
 
122
126
  desc 'Delete a pod'
123
- arg_name '<pod name>'
124
- command :delete do |c|
127
+ command 'pod:delete' do |c|
125
128
  c.switch :force
126
129
 
127
130
  c.action do |global_options,options,args|
128
- pod = account.pod_by_name!(args.shift)
129
-
130
131
  if options.force
131
132
  pod.delete!
132
133
  else
@@ -154,7 +155,7 @@ command :init do |c|
154
155
  c.action do |global_options,options,args|
155
156
  name = options[:name] || hl.ask(" pod name: "){|q| q.echo = true}
156
157
  pod = account.pod_or_create_by_name!(name)
157
- pod_dir.write_name(pod.fullname)
158
+ pod_dir.init(pod.fullname, logger)
158
159
  logger.puts "Success! Next, run ubalo push."
159
160
  end
160
161
  end
@@ -172,6 +173,13 @@ command :run do |c|
172
173
  end
173
174
  end
174
175
 
176
+ desc 'Show information about a pod'
177
+ command :pod do |c|
178
+ c.action do |global_options,options,args|
179
+ puts pod.printable_result
180
+ end
181
+ end
182
+
175
183
  desc 'Run a pod in the background'
176
184
  command :submit do |c|
177
185
  c.action do |global_options,options,args|
@@ -186,13 +194,12 @@ desc 'Get the status of a task'
186
194
  arg_name '<task label>'
187
195
  command :task do |c|
188
196
  c.action do |global_options,options,args|
189
- unless label = args.shift
190
- raise Ubalo::Error, "please specify a task label"
197
+ if label = args.shift
198
+ task = account.task_by_label!(label)
199
+ else
200
+ task = pod.latest_task
191
201
  end
192
- task = account.task_by_label!(label)
193
- logger.print "Getting the status for task #{task.label.inspect}..."
194
- task.refresh!
195
- logger.puts " found."
202
+
196
203
  puts task.printable_result
197
204
  end
198
205
  end
@@ -207,6 +214,7 @@ command :push do |c|
207
214
  pod.refresh!
208
215
  pod.compiled?
209
216
  end
217
+ puts pod.printable_result
210
218
  end
211
219
  end
212
220
 
@@ -234,16 +242,14 @@ end
234
242
  on_error do |exception|
235
243
  logger.complete_line
236
244
  case exception
237
- when Ubalo::Error, GLI::UnknownCommand
245
+ when Ubalo::Error, GLI::BadCommandLine
238
246
  logger.complete_line
239
- logger.puts "Error: #{exception.message}"
240
- exit 1
247
+ abort("Error: #{exception.message}")
241
248
  when Interrupt
242
249
  logger.complete_line
243
- logger.puts "Cancelled!"
244
- exit 1
250
+ abort("Cancelled!")
245
251
  else
246
- raise
252
+ raise exception
247
253
  end
248
254
  end
249
255
 
data/lib/ubalo/account.rb CHANGED
@@ -12,20 +12,26 @@ module Ubalo
12
12
  end
13
13
 
14
14
  def request method, path = nil, options = {}
15
- if authorization
15
+ if authorization and !options[:skip_authorization]
16
16
  options[:authorization] = authorization
17
17
  end
18
18
  Util.http_request(method, "#{@base_url}#{path}", options)
19
19
  end
20
20
 
21
21
  def authorize(login, password)
22
- response = request(:post, "/user/authorization", :params => {:user => {:login => login, :password => password}})
22
+ response = request(:post, "/user/authorization", :params => {:user => {:login => login, :password => password}}, :skip_authorization => true)
23
23
  @username = response.fetch("username")
24
24
  @authorization = response.fetch("authorization")
25
25
  rescue RestClient::BadRequest
26
26
  raise Ubalo::Error, "Incorrect login or password"
27
27
  end
28
28
 
29
+ def refresh!
30
+ update_attributes(request(:get, "/users/#{username}"))
31
+ rescue RestClient::ResourceNotFound
32
+ raise Ubalo::Error, "Your credentials for #{username} are invalid"
33
+ end
34
+
29
35
  def pod_from_json(pod_json)
30
36
  Pod.create_with_json(self, pod_json)
31
37
  end
@@ -74,5 +80,10 @@ module Ubalo
74
80
  def ==(other)
75
81
  [base_url, username, authorization] == [base_url, other.username, other.authorization]
76
82
  end
83
+
84
+ private
85
+ def update_attributes(attributes)
86
+ @username = attributes['username']
87
+ end
77
88
  end
78
89
  end
data/lib/ubalo/pod.rb CHANGED
@@ -6,7 +6,7 @@ module Ubalo
6
6
  new(account, json.fetch('user').fetch('username'), json.fetch('name'), json)
7
7
  end
8
8
 
9
- attr_reader :username, :name, :state, :archive, :updated_at
9
+ attr_reader :username, :name, :state, :archive, :updated_at, :compilation_run
10
10
 
11
11
  def initialize(account, username, name, attributes)
12
12
  @account = account
@@ -45,6 +45,14 @@ module Ubalo
45
45
  @account.task_from_json(request(:post, "/tasks", :params => params))
46
46
  end
47
47
 
48
+ def latest_task
49
+ if task_json = request(:get, "/tasks").first
50
+ @account.task_from_json(task_json)
51
+ else
52
+ raise Ubalo::Error, "Could not find latest task for #{fullname.inspect}"
53
+ end
54
+ end
55
+
48
56
  def push_from(pod_dir)
49
57
  new_archive.activate_from(pod_dir)
50
58
  refresh!
@@ -69,6 +77,27 @@ module Ubalo
69
77
  !!@deleted
70
78
  end
71
79
 
80
+ def printable_result
81
+ s = ""
82
+ s << " name: #{fullname}\n"
83
+ s << " state: #{state}\n"
84
+
85
+ if compilation_run
86
+ s << "status: #{compilation_run.fetch('exit_result')}\n"
87
+
88
+ if stdout = compilation_run.fetch('stdout') and stdout.length > 0
89
+ s << "stdout:\n"
90
+ s << Util.indent(stdout)
91
+ end
92
+
93
+ if stderr = compilation_run.fetch('stderr') and stderr.length > 0
94
+ s << "stderr:\n"
95
+ s << Util.indent(stderr)
96
+ end
97
+ end
98
+ s
99
+ end
100
+
72
101
  def inspect
73
102
  "#<Pod #{fullname.inspect} state=#{state.inspect}>"
74
103
  end
@@ -80,6 +109,7 @@ module Ubalo
80
109
  private
81
110
  def update_attributes(attributes)
82
111
  @state = attributes['state']
112
+ @compilation_run = attributes['compilation_run']
83
113
  if archive_attr = attributes['archive']
84
114
  @archive = @account.archive_from_json(archive_attr)
85
115
  end
data/lib/ubalo/pod_dir.rb CHANGED
@@ -26,6 +26,30 @@ module Ubalo
26
26
  end
27
27
  end
28
28
 
29
+ def init(name, logger)
30
+ write_name(name)
31
+ in_path do
32
+ default_files.each do |filename,content|
33
+ if File.exist?(filename)
34
+ logger.puts "Using existing #{filename.inspect}"
35
+ else
36
+ logger.puts "Writing an example #{filename.inspect}"
37
+ File.open(filename, "w"){|f| f.write(content)}
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ def default_files
44
+ gem_root = File.expand_path("../../..", __FILE__)
45
+ files_root = File.join(gem_root, "resources/init_files")
46
+ files = {}
47
+ %w{.ubaloignore run.sh}.each do |filename|
48
+ files[filename] = File.read(File.join(files_root, filename))
49
+ end
50
+ files
51
+ end
52
+
29
53
  def manifest
30
54
  in_path do
31
55
  Dir.glob('{.**,**}').map do |path|
data/lib/ubalo/task.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Ubalo
2
2
  class Task
3
- attr_reader :label, :state, :pod_name, :arg, :output, :submitted_at
3
+ attr_reader :label, :state, :pod_name, :arg, :output, :submitted_at, :elapsed_time
4
4
 
5
5
  def self.create_with_json(account, json)
6
6
  new(account, json.fetch('label'), json)
@@ -46,7 +46,11 @@ module Ubalo
46
46
 
47
47
  if container_process
48
48
  s << "status: #{container_process.fetch('exit_result')}\n"
49
+ end
50
+
51
+ s << " time: #{'%.1f' % elapsed_time} s\n"
49
52
 
53
+ if container_process
50
54
  if stdout = container_process.fetch('stdout') and stdout.length > 0
51
55
  s << "stdout:\n"
52
56
  s << Util.indent(stdout)
@@ -74,6 +78,7 @@ module Ubalo
74
78
  @pod_name = attributes['pod_name']
75
79
  @container_process = attributes['container_process']
76
80
  @submitted_at = attributes['submitted_at']
81
+ @elapsed_time = attributes['elapsed_time']
77
82
 
78
83
  @arg = Util.decode_content(attributes['arg']) if attributes['arg']
79
84
  @output = Util.decode_content(attributes['outputs']) if attributes['outputs']
data/lib/ubalo/util.rb CHANGED
@@ -86,7 +86,7 @@ module Ubalo
86
86
  def http_request(method, url, options)
87
87
  params = options.delete(:params) || {}
88
88
 
89
- headers = {:accept => :json, 'X-Ubalo-Version' => Ubalo::VERSION}
89
+ headers = {:accept => :json, 'X-Ubalo-Version' => Ubalo.version}
90
90
 
91
91
  if authorization = options.delete(:authorization)
92
92
  headers.merge!(:authorization => authorization)
@@ -115,6 +115,12 @@ module Ubalo
115
115
  else
116
116
  JSON.load(response)
117
117
  end
118
+ rescue RestClient::BadRequest => e
119
+ if message = JSON.load(e.response.to_s)["upgrade_message"]
120
+ raise Ubalo::Error, message
121
+ else
122
+ raise e
123
+ end
118
124
  end
119
125
 
120
126
  def pluralize count, word
data/lib/ubalo/version.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  module Ubalo
2
2
  unless const_defined?('VERSION')
3
- VERSION = "0.5"
3
+ VERSION = "0.6"
4
+ end
5
+
6
+ def self.version
7
+ ENV['UBALO_VERSION'] || VERSION
4
8
  end
5
9
  end
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.5'
4
+ version: '0.6'
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-04-04 00:00:00.000000000 Z
12
+ date: 2012-04-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: gli
16
- requirement: &70233084564080 !ruby/object:Gem::Requirement
16
+ requirement: &70257222461780 !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: *70233084564080
24
+ version_requirements: *70257222461780
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: highline
27
- requirement: &70233084571080 !ruby/object:Gem::Requirement
27
+ requirement: &70257222459400 !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: *70233084571080
35
+ version_requirements: *70257222459400
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: json
38
- requirement: &70233075286720 !ruby/object:Gem::Requirement
38
+ requirement: &70257222473120 !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: *70233075286720
46
+ version_requirements: *70257222473120
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rest-client
49
- requirement: &70233075285840 !ruby/object:Gem::Requirement
49
+ requirement: &70257222468340 !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: *70233075285840
57
+ version_requirements: *70257222468340
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: archive-tar-minitar
60
- requirement: &70233075285220 !ruby/object:Gem::Requirement
60
+ requirement: &70257222746760 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70233075285220
68
+ version_requirements: *70257222746760
69
69
  description: CLI and API client for Ubalo
70
70
  email: dev@ubalo.com
71
71
  executables:
@@ -94,18 +94,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
94
94
  - - ! '>='
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
- segments:
98
- - 0
99
- hash: -1754747755012050403
100
97
  required_rubygems_version: !ruby/object:Gem::Requirement
101
98
  none: false
102
99
  requirements:
103
100
  - - ! '>='
104
101
  - !ruby/object:Gem::Version
105
102
  version: '0'
106
- segments:
107
- - 0
108
- hash: -1754747755012050403
109
103
  requirements: []
110
104
  rubyforge_project:
111
105
  rubygems_version: 1.8.11
@@ -113,3 +107,4 @@ signing_key:
113
107
  specification_version: 3
114
108
  summary: CLI and API client for Ubalo
115
109
  test_files: []
110
+ has_rdoc: