vmfloaty 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/vmfloaty.rb +24 -6
- data/lib/vmfloaty/abs.rb +18 -20
- data/lib/vmfloaty/logger.rb +13 -0
- data/lib/vmfloaty/nonstandard_pooler.rb +1 -1
- data/lib/vmfloaty/pooler.rb +1 -1
- data/lib/vmfloaty/service.rb +2 -2
- data/lib/vmfloaty/utils.rb +1 -1
- data/lib/vmfloaty/version.rb +1 -1
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d229737ed9cb959ec725227d7c344ad56c1af7fcd7a53a59502fdb5bf7c0c696
|
4
|
+
data.tar.gz: 4625d46bc08dc61e806beff43237adac120d509ae704c437b47d56a4ef5413bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8763f1c3849bfa0ab7ad2f45cae9737ab16c4f96c7aa9ff9545126979bc7ab611cc40db1c5ace88d812a1dc7004eafa8b27210df92cbe316aff07480db9fe80a
|
7
|
+
data.tar.gz: eb5691d5fc84dc667abb0609c6ed9ce1222838e07cc3a5818c5d7294c888e869d28b8fd89300787e4691cfbf691b12356d01c2528d6c2235d832e7245b220dc3
|
data/lib/vmfloaty.rb
CHANGED
@@ -39,8 +39,13 @@ class Vmfloaty
|
|
39
39
|
c.option '--force', 'Forces vmfloaty to get requested vms'
|
40
40
|
c.option '--json', 'Prints retrieved vms in JSON format'
|
41
41
|
c.option '--ondemand', 'Requested vms are provisioned upon receival of the request, tracked by a request ID'
|
42
|
+
c.option '--continue STRING', String, 'resume polling ABS for job_id, for use when the cli was interrupted'
|
43
|
+
c.option '--loglevel STRING', String, 'the log level to use (debug, info, error)'
|
42
44
|
c.action do |args, options|
|
43
45
|
verbose = options.verbose || config['verbose']
|
46
|
+
if options.loglevel
|
47
|
+
FloatyLogger.setlevel = options.loglevel
|
48
|
+
end
|
44
49
|
service = Service.new(options, config)
|
45
50
|
use_token = !options.notoken
|
46
51
|
force = options.force
|
@@ -52,6 +57,11 @@ class Vmfloaty
|
|
52
57
|
|
53
58
|
os_types = Utils.generate_os_hash(args)
|
54
59
|
|
60
|
+
if os_types.empty?
|
61
|
+
FloatyLogger.error 'No operating systems provided to obtain. See `floaty get --help` for more information on how to get VMs.'
|
62
|
+
exit 1
|
63
|
+
end
|
64
|
+
|
55
65
|
max_pool_request = 5
|
56
66
|
large_pool_requests = os_types.select { |_, v| v > max_pool_request }
|
57
67
|
if !large_pool_requests.empty? && !force
|
@@ -60,12 +70,7 @@ class Vmfloaty
|
|
60
70
|
exit 1
|
61
71
|
end
|
62
72
|
|
63
|
-
|
64
|
-
FloatyLogger.error 'No operating systems provided to obtain. See `floaty get --help` for more information on how to get VMs.'
|
65
|
-
exit 1
|
66
|
-
end
|
67
|
-
|
68
|
-
response = service.retrieve(verbose, os_types, use_token, options.ondemand)
|
73
|
+
response = service.retrieve(verbose, os_types, use_token, options.ondemand, options.continue)
|
69
74
|
request_id = response['request_id'] if options.ondemand
|
70
75
|
response = service.wait_for_request(verbose, request_id) if options.ondemand
|
71
76
|
|
@@ -92,8 +97,12 @@ class Vmfloaty
|
|
92
97
|
c.option '--token STRING', String, 'Token for pooler service'
|
93
98
|
c.option '--url STRING', String, 'URL of pooler service'
|
94
99
|
c.option '--user STRING', String, 'User to authenticate with'
|
100
|
+
c.option '--loglevel STRING', String, 'the log level to use (debug, info, error)'
|
95
101
|
c.action do |args, options|
|
96
102
|
verbose = options.verbose || config['verbose']
|
103
|
+
if options.loglevel
|
104
|
+
FloatyLogger.setlevel = options.loglevel
|
105
|
+
end
|
97
106
|
|
98
107
|
service = Service.new(options, config)
|
99
108
|
filter = args[0]
|
@@ -229,8 +238,13 @@ class Vmfloaty
|
|
229
238
|
c.option '--token STRING', String, 'Token for pooler service'
|
230
239
|
c.option '--url STRING', String, 'URL of pooler service'
|
231
240
|
c.option '--user STRING', String, 'User to authenticate with'
|
241
|
+
c.option '--loglevel STRING', String, 'the log level to use (debug, info, error)'
|
232
242
|
c.action do |args, options|
|
233
243
|
verbose = options.verbose || config['verbose']
|
244
|
+
if options.loglevel
|
245
|
+
FloatyLogger.setlevel = options.loglevel
|
246
|
+
end
|
247
|
+
|
234
248
|
service = Service.new(options, config)
|
235
249
|
hostnames = args[0]
|
236
250
|
delete_all = options.all
|
@@ -374,8 +388,12 @@ class Vmfloaty
|
|
374
388
|
c.option '--service STRING', String, 'Configured pooler service name'
|
375
389
|
c.option '--url STRING', String, 'URL of pooler service'
|
376
390
|
c.option '--json', 'Prints status in JSON format'
|
391
|
+
c.option '--loglevel STRING', String, 'the log level to use (debug, info, error)'
|
377
392
|
c.action do |_, options|
|
378
393
|
verbose = options.verbose || config['verbose']
|
394
|
+
if options.loglevel
|
395
|
+
FloatyLogger.setlevel = options.loglevel
|
396
|
+
end
|
379
397
|
service = Service.new(options, config)
|
380
398
|
if options.json
|
381
399
|
pp service.status(verbose)
|
data/lib/vmfloaty/abs.rb
CHANGED
@@ -228,7 +228,7 @@ class ABS
|
|
228
228
|
end
|
229
229
|
|
230
230
|
# Retrieve an OS from ABS.
|
231
|
-
def self.retrieve(verbose, os_types, token, url, user, config, _ondemand = nil)
|
231
|
+
def self.retrieve(verbose, os_types, token, url, user, config, _ondemand = nil, continue = nil)
|
232
232
|
#
|
233
233
|
# Contents of post must be like:
|
234
234
|
#
|
@@ -248,7 +248,12 @@ class ABS
|
|
248
248
|
conn = Http.get_conn(verbose, supported_abs_url(url))
|
249
249
|
conn.headers['X-AUTH-TOKEN'] = token if token
|
250
250
|
|
251
|
-
|
251
|
+
if continue.nil?
|
252
|
+
saved_job_id = user + "-" + DateTime.now.strftime('%Q')
|
253
|
+
else
|
254
|
+
saved_job_id = continue
|
255
|
+
end
|
256
|
+
|
252
257
|
req_obj = {
|
253
258
|
:resources => os_types,
|
254
259
|
:job => {
|
@@ -281,26 +286,28 @@ class ABS
|
|
281
286
|
|
282
287
|
# os_string = os_type.map { |os, num| Array(os) * num }.flatten.join('+')
|
283
288
|
# raise MissingParamError, 'No operating systems provided to obtain.' if os_string.empty?
|
284
|
-
FloatyLogger.info "Requesting VMs with job_id: #{saved_job_id}
|
289
|
+
FloatyLogger.info "Requesting VMs with job_id: #{saved_job_id} Will retry for up to an hour."
|
285
290
|
res = conn.post 'request', req_obj.to_json
|
286
291
|
|
287
292
|
retries = 360
|
288
293
|
|
289
|
-
validate_queue_status_response(res.status, res.body, "Initial request", verbose)
|
294
|
+
status = validate_queue_status_response(res.status, res.body, "Initial request", verbose)
|
290
295
|
|
291
296
|
begin
|
292
297
|
(1..retries).each do |i|
|
293
|
-
|
294
|
-
|
298
|
+
res_body = check_queue(conn, saved_job_id, req_obj, verbose)
|
299
|
+
if res_body && res_body.is_a?(Array) # when we get a response with hostnames
|
300
|
+
return translated(res_body, saved_job_id)
|
301
|
+
end
|
295
302
|
|
296
303
|
sleep_seconds = 10 if i >= 10
|
297
304
|
sleep_seconds = i if i < 10
|
298
|
-
FloatyLogger.info "Waiting #{sleep_seconds}
|
305
|
+
FloatyLogger.info "Waiting #{sleep_seconds}s (x#{i}) #{res_body.strip}"
|
299
306
|
|
300
307
|
sleep(sleep_seconds)
|
301
308
|
end
|
302
309
|
rescue SystemExit, Interrupt
|
303
|
-
FloatyLogger.info "\n\nFloaty interrupted, you can query the state of
|
310
|
+
FloatyLogger.info "\n\nFloaty interrupted, you can resume polling with\n1) `floaty get [same arguments] and adding the flag --continue #{saved_job_id}` or query the state of the queue via\n2) `floaty query #{saved_job_id}` or delete it via\n3) `floaty delete #{saved_job_id}`"
|
304
311
|
exit 1
|
305
312
|
end
|
306
313
|
nil
|
@@ -325,22 +332,13 @@ class ABS
|
|
325
332
|
end
|
326
333
|
|
327
334
|
def self.check_queue(conn, job_id, req_obj, verbose)
|
328
|
-
queue_info_res = conn.get "status/queue/info/#{job_id}"
|
329
|
-
if valid_json?(queue_info_res.body)
|
330
|
-
queue_info = JSON.parse(queue_info_res.body)
|
331
|
-
else
|
332
|
-
FloatyLogger.warn "Could not parse the status/queue/info/#{job_id}"
|
333
|
-
return [nil, nil]
|
334
|
-
end
|
335
|
-
|
336
335
|
res = conn.post 'request', req_obj.to_json
|
337
|
-
validate_queue_status_response(res.status, res.body, "Check queue request", verbose)
|
338
|
-
|
336
|
+
status = validate_queue_status_response(res.status, res.body, "Check queue request", verbose)
|
339
337
|
unless res.body.empty? || !valid_json?(res.body)
|
340
338
|
res_body = JSON.parse(res.body)
|
341
|
-
return
|
339
|
+
return res_body
|
342
340
|
end
|
343
|
-
|
341
|
+
res.body
|
344
342
|
end
|
345
343
|
|
346
344
|
def self.snapshot(_verbose, _url, _hostname, _token)
|
data/lib/vmfloaty/logger.rb
CHANGED
@@ -17,6 +17,19 @@ class FloatyLogger < ::Logger
|
|
17
17
|
FloatyLogger.logger.error msg
|
18
18
|
end
|
19
19
|
|
20
|
+
def self.setlevel=(level)
|
21
|
+
level = level.downcase
|
22
|
+
if level == "debug"
|
23
|
+
self.logger.level = ::Logger::DEBUG
|
24
|
+
elsif level == "info"
|
25
|
+
self.logger.level = ::Logger::INFO
|
26
|
+
elsif level == "error"
|
27
|
+
self.logger.level = ::Logger::ERROR
|
28
|
+
else
|
29
|
+
error("set loglevel to debug, info or error")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
20
33
|
def initialize
|
21
34
|
super(STDERR)
|
22
35
|
self.level = ::Logger::INFO
|
@@ -22,7 +22,7 @@ class NonstandardPooler
|
|
22
22
|
status['reserved_hosts'] || []
|
23
23
|
end
|
24
24
|
|
25
|
-
def self.retrieve(verbose, os_type, token, url, _user, _options, ondemand = nil)
|
25
|
+
def self.retrieve(verbose, os_type, token, url, _user, _options, ondemand = nil, _continue = nil)
|
26
26
|
conn = Http.get_conn(verbose, url)
|
27
27
|
conn.headers['X-AUTH-TOKEN'] = token if token
|
28
28
|
|
data/lib/vmfloaty/pooler.rb
CHANGED
@@ -28,7 +28,7 @@ class Pooler
|
|
28
28
|
vms
|
29
29
|
end
|
30
30
|
|
31
|
-
def self.retrieve(verbose, os_type, token, url, _user, _options, ondemand = nil)
|
31
|
+
def self.retrieve(verbose, os_type, token, url, _user, _options, ondemand = nil, _continue = nil)
|
32
32
|
# NOTE:
|
33
33
|
# Developers can use `Utils.generate_os_hash` to
|
34
34
|
# generate the os_type param.
|
data/lib/vmfloaty/service.rb
CHANGED
@@ -77,10 +77,10 @@ class Service
|
|
77
77
|
@service_object.list_active verbose, url, token, user
|
78
78
|
end
|
79
79
|
|
80
|
-
def retrieve(verbose, os_types, use_token = true, ondemand = nil)
|
80
|
+
def retrieve(verbose, os_types, use_token = true, ondemand = nil, continue = nil)
|
81
81
|
FloatyLogger.info 'Requesting a vm without a token...' unless use_token
|
82
82
|
token_value = use_token ? token : nil
|
83
|
-
@service_object.retrieve verbose, os_types, token_value, url, user, @config, ondemand
|
83
|
+
@service_object.retrieve verbose, os_types, token_value, url, user, @config, ondemand, continue
|
84
84
|
end
|
85
85
|
|
86
86
|
def wait_for_request(verbose, requestid)
|
data/lib/vmfloaty/utils.rb
CHANGED
@@ -116,7 +116,7 @@ class Utils
|
|
116
116
|
|
117
117
|
output_target.puts "- [JobID:#{host_data['request']['job']['id']}] <#{host_data['state']}>"
|
118
118
|
host_data['allocated_resources'].each do |allocated_resources, _i|
|
119
|
-
if allocated_resources['engine'] == "vmpooler" && service.config["vmpooler_fallback"]
|
119
|
+
if (allocated_resources['engine'] == "vmpooler" || allocated_resources['engine'] == 'ondemand') && service.config["vmpooler_fallback"]
|
120
120
|
vmpooler_service = service.clone
|
121
121
|
vmpooler_service.silent = true
|
122
122
|
vmpooler_service.maybe_use_vmpooler
|
data/lib/vmfloaty/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vmfloaty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Cain
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-02-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: colorize
|
@@ -115,18 +115,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
115
|
- !ruby/object:Gem::Version
|
116
116
|
version: '0'
|
117
117
|
requirements: []
|
118
|
-
rubygems_version: 3.
|
118
|
+
rubygems_version: 3.2.3
|
119
119
|
signing_key:
|
120
120
|
specification_version: 4
|
121
121
|
summary: CLI application to interface with vmpooler
|
122
122
|
test_files:
|
123
|
-
- spec/
|
124
|
-
- spec/vmfloaty/utils_spec.rb
|
123
|
+
- spec/spec_helper.rb
|
125
124
|
- spec/vmfloaty/abs/auth_spec.rb
|
126
125
|
- spec/vmfloaty/abs_spec.rb
|
126
|
+
- spec/vmfloaty/auth_spec.rb
|
127
|
+
- spec/vmfloaty/nonstandard_pooler_spec.rb
|
127
128
|
- spec/vmfloaty/pooler_spec.rb
|
128
|
-
- spec/vmfloaty/ssh_spec.rb
|
129
129
|
- spec/vmfloaty/service_spec.rb
|
130
|
-
- spec/vmfloaty/
|
131
|
-
- spec/vmfloaty/
|
132
|
-
- spec/
|
130
|
+
- spec/vmfloaty/ssh_spec.rb
|
131
|
+
- spec/vmfloaty/utils_spec.rb
|
132
|
+
- spec/vmfloaty/vmfloaty_services_spec.rb
|