ubalo 0.0.27 → 0.0.28
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 +24 -89
- data/lib/ubalo.rb +83 -17
- data/lib/ubalo/version.rb +1 -1
- metadata +21 -10
data/bin/ubalo
CHANGED
@@ -55,6 +55,8 @@ def normalize_pod_name(pod_name)
|
|
55
55
|
else
|
56
56
|
"#{local_username}/#{pod_name}"
|
57
57
|
end
|
58
|
+
else
|
59
|
+
raise UbaloMessage, "Please specify a pod name"
|
58
60
|
end
|
59
61
|
end
|
60
62
|
|
@@ -123,8 +125,8 @@ end
|
|
123
125
|
def process_download pod_response, destination_path=nil
|
124
126
|
name = pod_response.fetch('name')
|
125
127
|
fullname = pod_response.fetch('fullname')
|
126
|
-
|
127
|
-
|
128
|
+
pod_url = pod_response.fetch('url')
|
129
|
+
files_url = pod_response.fetch('archive').fetch('get_url')
|
128
130
|
|
129
131
|
destination_path ||= name
|
130
132
|
|
@@ -135,16 +137,10 @@ def process_download pod_response, destination_path=nil
|
|
135
137
|
FileUtils.mkdir(destination_path)
|
136
138
|
FileUtils.mkdir(File.join(destination_path, ".ubalo"))
|
137
139
|
|
138
|
-
|
139
|
-
f.puts(YAML.dump("pod_url" => url))
|
140
|
-
end
|
140
|
+
ubalo.retrieve_files(destination_path, files_url)
|
141
141
|
|
142
|
-
|
143
|
-
|
144
|
-
FileUtils.mkdir_p(File.dirname(local_filename))
|
145
|
-
File.open(local_filename, "w") do |f|
|
146
|
-
f.write content
|
147
|
-
end
|
142
|
+
File.open(File.join(destination_path, ".ubalo", "config"), "w") do |f|
|
143
|
+
f.puts(YAML.dump("pod_url" => pod_url))
|
148
144
|
end
|
149
145
|
|
150
146
|
[fullname, destination_path]
|
@@ -158,62 +154,10 @@ command :clone do |c|
|
|
158
154
|
destination_path = args.shift
|
159
155
|
|
160
156
|
$stderr.print "Fetching #{pod_name}..."
|
161
|
-
pod_response = ubalo.
|
162
|
-
|
163
|
-
fullname, destination_path = process_download(pod_response)
|
164
|
-
$stderr.puts " done."
|
165
|
-
$stderr.puts "Retrieved #{fullname} into #{destination_path}."
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
desc 'Create a new pod'
|
170
|
-
arg_name '<pod name>'
|
171
|
-
command :create do |c|
|
172
|
-
|
173
|
-
c.desc "Pod name"
|
174
|
-
c.flag :name
|
175
|
-
c.desc "Pod template"
|
176
|
-
c.flag :template
|
177
|
-
|
178
|
-
c.action do |global_options,options,args|
|
179
|
-
# Request available templates first to provoke 403 if not logged-in
|
180
|
-
# properly.
|
181
|
-
templates = ubalo.available_templates
|
182
|
-
template_names = templates.map{|t| t['name']}.sort
|
183
|
-
|
184
|
-
if options.name
|
185
|
-
pod_name = options.name
|
186
|
-
else
|
187
|
-
pod_name = hl.ask("New pod name: ")
|
188
|
-
if pod_name.empty?
|
189
|
-
raise UbaloMessage, "No pod name given"
|
190
|
-
end
|
191
|
-
end
|
192
|
-
destination_path = pod_name
|
193
|
-
|
194
|
-
if File.exists?(pod_name)
|
195
|
-
raise UbaloMessage, "directory #{destination_path} already exists, giving up."
|
196
|
-
end
|
197
|
-
|
198
|
-
if options['template']
|
199
|
-
template_name = options['template']
|
200
|
-
unless template_names.include? template_name
|
201
|
-
raise UbaloMessage, "Invalid template name"
|
202
|
-
end
|
203
|
-
else
|
204
|
-
template_name = hl.choose do |menu|
|
205
|
-
menu.prompt = "Template for your new pod: "
|
206
|
-
menu.choices(*template_names)
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
$stderr.print "Creating a new #{template_name} pod called #{pod_name}..."
|
211
|
-
pod_response, files_response = ubalo.create_pod(pod_name, template_name)
|
157
|
+
pod_response = ubalo.clone(pod_name)
|
212
158
|
|
213
159
|
fullname, destination_path = process_download(pod_response)
|
214
|
-
|
215
|
-
$stderr.puts " done."
|
216
|
-
$stderr.puts "Created #{fullname} and placed in #{destination_path}/."
|
160
|
+
$stderr.puts " saved to #{destination_path}."
|
217
161
|
end
|
218
162
|
end
|
219
163
|
|
@@ -286,34 +230,25 @@ command :check do |c|
|
|
286
230
|
end
|
287
231
|
end
|
288
232
|
|
289
|
-
desc '
|
290
|
-
command :
|
233
|
+
desc 'Pushes a pod directory directly to Ubalo'
|
234
|
+
command :push_to do |c|
|
291
235
|
c.action do |global_options,options,args|
|
292
|
-
|
293
|
-
|
294
|
-
if File.exist?(".ubaloignore")
|
295
|
-
ignore_patterns = File.read(".ubaloignore").each_line.map(&:strip)
|
296
|
-
else
|
297
|
-
ignore_patterns = []
|
298
|
-
end
|
299
|
-
|
300
|
-
ignore_patterns += %w{. .. .ubalo}
|
301
|
-
|
302
|
-
filenames = []
|
303
|
-
Dir.glob('{.**,**}').each do |path|
|
304
|
-
next if ignore_patterns.any?{|pattern| File.fnmatch?(pattern, path, File::FNM_DOTMATCH)}
|
236
|
+
pod_name = normalize_pod_name(args.shift)
|
305
237
|
|
306
|
-
|
307
|
-
|
238
|
+
# First ensure that the pod exists.
|
239
|
+
pod_url = "#{ubalo.base_url}/pods/#{pod_name}"
|
240
|
+
pod = ubalo.create_or_update(pod_url)
|
308
241
|
|
309
|
-
files
|
310
|
-
|
311
|
-
|
312
|
-
|
242
|
+
# Now push the files archive.
|
243
|
+
ubalo.push_files(pod_url)
|
244
|
+
end
|
245
|
+
end
|
313
246
|
|
314
|
-
|
315
|
-
|
316
|
-
|
247
|
+
desc 'Push files to Ubalo'
|
248
|
+
command :push do |c|
|
249
|
+
c.action do |global_options,options,args|
|
250
|
+
pod_url = local_config.fetch('pod_url')
|
251
|
+
ubalo.push_files(pod_url)
|
317
252
|
end
|
318
253
|
end
|
319
254
|
|
data/lib/ubalo.rb
CHANGED
@@ -4,6 +4,10 @@ require 'json'
|
|
4
4
|
require 'open3'
|
5
5
|
require 'pp'
|
6
6
|
|
7
|
+
require 'zlib'
|
8
|
+
require 'archive/tar/minitar'
|
9
|
+
include Archive::Tar
|
10
|
+
|
7
11
|
class String
|
8
12
|
def lfit max_length
|
9
13
|
if length - 3 <= max_length
|
@@ -69,6 +73,23 @@ class Ubalo
|
|
69
73
|
end
|
70
74
|
|
71
75
|
class << self
|
76
|
+
def tgz_filename
|
77
|
+
"ubalo-files.tar.gz"
|
78
|
+
end
|
79
|
+
|
80
|
+
def make_tgz file_list, tgz_name
|
81
|
+
tgz = Zlib::GzipWriter.new(File.open(tgz_name, 'wb'))
|
82
|
+
Minitar.pack(file_list, tgz)
|
83
|
+
tgz_name
|
84
|
+
end
|
85
|
+
|
86
|
+
def extract_tgz destination_dir, tgz_name
|
87
|
+
Dir.chdir(destination_dir) do
|
88
|
+
tgz = Zlib::GzipReader.new(File.open(tgz_name, 'rb'))
|
89
|
+
Minitar.unpack(tgz, '.')
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
72
93
|
def print_content name, content
|
73
94
|
data = content.fetch('data')
|
74
95
|
content_type = content.fetch('content_type')
|
@@ -116,7 +137,6 @@ class Ubalo
|
|
116
137
|
"#{pluralize((seconds/60/60/24).floor, "day")} ago"
|
117
138
|
end
|
118
139
|
end
|
119
|
-
|
120
140
|
end
|
121
141
|
|
122
142
|
attr_reader :base_url
|
@@ -132,14 +152,15 @@ class Ubalo
|
|
132
152
|
end
|
133
153
|
|
134
154
|
def raw_request(method, url, params)
|
155
|
+
resource = RestClient::Resource.new url, timeout: 60
|
135
156
|
if method == :get
|
136
|
-
|
157
|
+
resource.get add_headers(:params => params, :accept => :json)
|
137
158
|
elsif method == :post
|
138
|
-
|
159
|
+
resource.post params, add_headers(:accept => :json)
|
139
160
|
elsif method == :put
|
140
|
-
|
161
|
+
resource.put params, add_headers(:accept => :json)
|
141
162
|
elsif method == :delete
|
142
|
-
|
163
|
+
resource.delete add_headers(:accept => :json)
|
143
164
|
else
|
144
165
|
raise "don't understand request method #{method.inspect}"
|
145
166
|
end
|
@@ -158,11 +179,11 @@ class Ubalo
|
|
158
179
|
end
|
159
180
|
|
160
181
|
def put(url, params={})
|
161
|
-
|
182
|
+
raw_request(:put, url, params)
|
162
183
|
end
|
163
184
|
|
164
185
|
def delete(url)
|
165
|
-
|
186
|
+
raw_request(:delete, url, {})
|
166
187
|
end
|
167
188
|
|
168
189
|
def whoami
|
@@ -183,7 +204,7 @@ class Ubalo
|
|
183
204
|
end
|
184
205
|
|
185
206
|
def wait_task(label, silent=false)
|
186
|
-
|
207
|
+
600.times do
|
187
208
|
h = check_task(label)
|
188
209
|
if h['state'] == 'exited'
|
189
210
|
unless silent
|
@@ -201,7 +222,7 @@ class Ubalo
|
|
201
222
|
raise "timed-out waiting for task #{label}"
|
202
223
|
end
|
203
224
|
|
204
|
-
def
|
225
|
+
def clone(pod_name)
|
205
226
|
get("#{base_url}/pods/#{pod_name}")
|
206
227
|
rescue RestClient::ResourceNotFound
|
207
228
|
raise UbaloMessage, "could not find #{pod_name}"
|
@@ -243,20 +264,65 @@ class Ubalo
|
|
243
264
|
post("#{base_url}/user/authorization", :user => {:login => login, :password => password})
|
244
265
|
end
|
245
266
|
|
246
|
-
def
|
247
|
-
|
267
|
+
def create_or_update pod_url, params={}
|
268
|
+
put(pod_url, :pod => params)
|
248
269
|
end
|
249
270
|
|
250
|
-
def
|
251
|
-
|
271
|
+
def check_task label
|
272
|
+
get("#{base_url}/tasks/#{label}")
|
252
273
|
end
|
253
274
|
|
254
|
-
def
|
255
|
-
|
275
|
+
def upload_tgz pod_url, tgz_name
|
276
|
+
# Create the new archive in rails.
|
277
|
+
response = post("#{pod_url}/archives")
|
278
|
+
label = response.fetch('label')
|
279
|
+
put_url = response.fetch('put_url')
|
280
|
+
archive_location = response.fetch('url')
|
281
|
+
|
282
|
+
print "Uploading files... "
|
283
|
+
RestClient.put put_url, File.open(tgz_name, 'rb'), content_type: 'application/x-tar', content_encoding: 'x-gzip'
|
284
|
+
put("#{archive_location}/activate")
|
285
|
+
|
286
|
+
puts "done."
|
256
287
|
end
|
257
288
|
|
258
|
-
def
|
259
|
-
|
289
|
+
def push_files(pod_url)
|
290
|
+
ignore_filename = ".ubaloignore"
|
291
|
+
if File.exist?(ignore_filename)
|
292
|
+
ignore_patterns = File.read(ignore_filename).each_line.map(&:strip)
|
293
|
+
else
|
294
|
+
ignore_patterns = []
|
295
|
+
end
|
296
|
+
|
297
|
+
ignore_patterns += %w{. .. .ubalo ubalo-files.tar.gz}
|
298
|
+
|
299
|
+
filenames = []
|
300
|
+
Dir.glob('{.**,**}').each do |path|
|
301
|
+
next if ignore_patterns.any?{|pattern| File.fnmatch?(pattern, path, File::FNM_DOTMATCH)}
|
302
|
+
|
303
|
+
filenames << path
|
304
|
+
end
|
305
|
+
|
306
|
+
begin
|
307
|
+
Ubalo.make_tgz(filenames, Ubalo.tgz_filename)
|
308
|
+
upload_tgz(pod_url, Ubalo.tgz_filename)
|
309
|
+
ensure
|
310
|
+
FileUtils.rm_f(Ubalo.tgz_filename)
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
def retrieve_files(destination_path, files_url)
|
315
|
+
# First retrieve the S3 URL.
|
316
|
+
RestClient.get(files_url) do |response|
|
317
|
+
if response.code == 200
|
318
|
+
File.open(File.join(destination_path, Ubalo.tgz_filename), "wb") do |f|
|
319
|
+
f.write response
|
320
|
+
end
|
321
|
+
Ubalo.extract_tgz(destination_path, Ubalo.tgz_filename)
|
322
|
+
else
|
323
|
+
raise UbaloMessage, "failed to download pod files"
|
324
|
+
end
|
325
|
+
end
|
260
326
|
end
|
261
327
|
|
262
328
|
def publish pod_name
|
data/lib/ubalo/version.rb
CHANGED
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.28
|
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-03-
|
12
|
+
date: 2012-03-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: gli
|
16
|
-
requirement: &
|
16
|
+
requirement: &70105707914620 !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: *70105707914620
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: highline
|
27
|
-
requirement: &
|
27
|
+
requirement: &70105707914160 !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: *70105707914160
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: json
|
38
|
-
requirement: &
|
38
|
+
requirement: &70105707827700 !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: *
|
46
|
+
version_requirements: *70105707827700
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rest-client
|
49
|
-
requirement: &
|
49
|
+
requirement: &70105707826560 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,7 +54,18 @@ dependencies:
|
|
54
54
|
version: 1.6.3
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70105707826560
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: archive-tar-minitar
|
60
|
+
requirement: &70105707825660 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70105707825660
|
58
69
|
description: CLI and API client for Ubalo
|
59
70
|
email: dev@ubalo.com
|
60
71
|
executables:
|