vmpooler 2.3.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b65cd0483ea44e3ad8642c8c6ed8e22825601c5e707f7e277795eebb76057dd1
4
- data.tar.gz: 1244464e0d901dac2878364dcd37a0e5c67ec19ae7736064751889913e8997c8
3
+ metadata.gz: 557f2f80846f8334073ff9bf58ec145a74e0f99cea917c5416f37f5039767f88
4
+ data.tar.gz: 871ff8d1b1e9f877dd4eff3f6a69219bdf8cdba1097a75bf2442a0cf910b77ec
5
5
  SHA512:
6
- metadata.gz: cbc749d93c4da92e0009ccd8e792067b088fa024209355d7e9a71a8357dd91de05be6c3b62704adcace89da7b99328a9b282edc1be8b2e6753dc69f709625db9
7
- data.tar.gz: d7c8071069919512beb841dd3ad453f0e12020565464fc62f24beff4353cffe9c997d2b0a805dde6eddc42fe00a7784eec82a319a8b7954e56f683a1bf856c05
6
+ metadata.gz: 4313226f2acf7e2d04549a29b823ad4cda457b749277ac2d48827ee8d8e158b089374ed48356634bbce8a499d655bc980d0d4766dc221944de10ee876ba9b212
7
+ data.tar.gz: b1ff5950dfa5ce3770f464767f41930f06f8a480657a191b8f3d0d5ab76412e7380c56f991393624376f7071867a7a79c1a93c0c07a96853efc1cd1abbdbbf0e
@@ -181,14 +181,9 @@ module Vmpooler
181
181
  /^\d{4}-\d{2}-\d{2}$/ === date_str
182
182
  end
183
183
 
184
+ # NOTE: domain is not needed here, so we should update the callers of this method
184
185
  def hostname_shorten(hostname, domain=nil)
185
- if domain && hostname =~ /^[\w-]+\.#{domain}$/
186
- hostname = hostname[/[^.]+/]
187
- elsif hostname =~ /^[\w-]+\..+$/
188
- hostname = hostname[/[^.]+/]
189
- end
190
-
191
- hostname
186
+ hostname[/[^.]+/]
192
187
  end
193
188
 
194
189
  def get_task_times(backend, task, date_str)
@@ -545,17 +540,15 @@ module Vmpooler
545
540
  },
546
541
  kind: :client
547
542
  ) do
548
- Timeout.timeout(timeout) do
549
- target_host = host
550
- target_host = "#{host}.#{domain}" if domain
551
- span = OpenTelemetry::Trace.current_span
552
- span.set_attribute('net.peer.name', target_host)
553
- sock = TCPSocket.new target_host, port
554
- begin
555
- yield sock if block_given?
556
- ensure
557
- sock.close
558
- end
543
+ target_host = host
544
+ target_host = "#{host}.#{domain}" if domain
545
+ span = OpenTelemetry::Trace.current_span
546
+ span.set_attribute('net.peer.name', target_host)
547
+ sock = TCPSocket.new(target_host, port, connect_timeout: timeout)
548
+ begin
549
+ yield sock if block_given?
550
+ ensure
551
+ sock.close
559
552
  end
560
553
  end
561
554
  end
@@ -1519,7 +1519,7 @@ module Vmpooler
1519
1519
 
1520
1520
  post "#{api_prefix}/vm/:hostname/snapshot/:snapshot/?" do
1521
1521
  content_type :json
1522
- metrics.increment('http_requests_vm_total.post.vm.disksize')
1522
+ metrics.increment('http_requests_vm_total.post.vm.snapshot')
1523
1523
 
1524
1524
  need_token! if Vmpooler::API.settings.config[:auth]
1525
1525
 
@@ -258,6 +258,82 @@ module Vmpooler
258
258
  JSON.pretty_generate(result)
259
259
  end
260
260
 
261
+ get "#{api_prefix}/vm/:hostname/?" do
262
+ content_type :json
263
+ metrics.increment('http_requests_vm_total.get.vm.hostname')
264
+
265
+ result = {}
266
+
267
+ status 404
268
+ result['ok'] = false
269
+
270
+ params[:hostname] = hostname_shorten(params[:hostname], nil)
271
+
272
+ rdata = backend.hgetall("vmpooler__vm__#{params[:hostname]}")
273
+ unless rdata.empty?
274
+ status 200
275
+ result['ok'] = true
276
+
277
+ result[params[:hostname]] = {}
278
+
279
+ result[params[:hostname]]['template'] = rdata['template']
280
+ result[params[:hostname]]['lifetime'] = (rdata['lifetime'] || config['vm_lifetime']).to_i
281
+
282
+ if rdata['destroy']
283
+ result[params[:hostname]]['running'] = ((Time.parse(rdata['destroy']) - Time.parse(rdata['checkout'])) / 60 / 60).round(2) if rdata['checkout']
284
+ result[params[:hostname]]['state'] = 'destroyed'
285
+ elsif rdata['checkout']
286
+ result[params[:hostname]]['running'] = ((Time.now - Time.parse(rdata['checkout'])) / 60 / 60).round(2)
287
+ result[params[:hostname]]['remaining'] = ((Time.parse(rdata['checkout']) + rdata['lifetime'].to_i*60*60 - Time.now) / 60 / 60).round(2)
288
+ result[params[:hostname]]['start_time'] = Time.parse(rdata['checkout']).to_datetime.rfc3339
289
+ result[params[:hostname]]['end_time'] = (Time.parse(rdata['checkout']) + rdata['lifetime'].to_i*60*60).to_datetime.rfc3339
290
+ result[params[:hostname]]['state'] = 'running'
291
+ elsif rdata['check']
292
+ result[params[:hostname]]['state'] = 'ready'
293
+ else
294
+ result[params[:hostname]]['state'] = 'pending'
295
+ end
296
+
297
+ rdata.keys.each do |key|
298
+ if key.match('^tag\:(.+?)$')
299
+ result[params[:hostname]]['tags'] ||= {}
300
+ result[params[:hostname]]['tags'][$1] = rdata[key]
301
+ end
302
+
303
+ if key.match('^snapshot\:(.+?)$')
304
+ result[params[:hostname]]['snapshots'] ||= []
305
+ result[params[:hostname]]['snapshots'].push($1)
306
+ end
307
+ end
308
+
309
+ if rdata['disk']
310
+ result[params[:hostname]]['disk'] = rdata['disk'].split(':')
311
+ end
312
+
313
+ # Look up IP address of the hostname
314
+ begin
315
+ ipAddress = TCPSocket.gethostbyname(params[:hostname])[3]
316
+ rescue StandardError
317
+ ipAddress = ""
318
+ end
319
+
320
+ result[params[:hostname]]['ip'] = ipAddress
321
+
322
+ if rdata['pool']
323
+ vmdomain = Parsing.get_domain_for_pool(full_config, rdata['pool'])
324
+ if vmdomain
325
+ result[params[:hostname]]['fqdn'] = "#{params[:hostname]}.#{vmdomain}"
326
+ end
327
+ end
328
+
329
+ result[params[:hostname]]['host'] = rdata['host'] if rdata['host']
330
+ result[params[:hostname]]['migrated'] = rdata['migrated'] if rdata['migrated']
331
+
332
+ end
333
+
334
+ JSON.pretty_generate(result)
335
+ end
336
+
261
337
  post "#{api_prefix}/ondemandvm/?" do
262
338
  content_type :json
263
339
  metrics.increment('http_requests_vm_total.post.ondemand.requestid')
@@ -119,7 +119,13 @@ module Vmpooler
119
119
  pool_alias = redis.hget("vmpooler__vm__#{vm}", 'pool_alias') if request_id
120
120
  redis.multi
121
121
  redis.smove("vmpooler__pending__#{pool}", "vmpooler__completed__#{pool}", vm)
122
- redis.zadd('vmpooler__odcreate__task', 1, "#{pool_alias}:#{pool}:1:#{request_id}") if request_id
122
+ if request_id
123
+ ondemandrequest_hash = redis.hgetall("vmpooler__odrequest__#{request_id}")
124
+ if ondemandrequest_hash && ondemandrequest_hash['status'] != 'failed' && ondemandrequest_hash['status'] != 'deleted'
125
+ # will retry a VM that did not come up as vm_ready? only if it has not been market failed or deleted
126
+ redis.zadd('vmpooler__odcreate__task', 1, "#{pool_alias}:#{pool}:1:#{request_id}")
127
+ end
128
+ end
123
129
  redis.exec
124
130
  $metrics.increment("errors.markedasfailed.#{pool}")
125
131
  $logger.log('d', "[!] [#{pool}] '#{vm}' marked as 'failed' after #{timeout} minutes")
@@ -1596,19 +1602,19 @@ module Vmpooler
1596
1602
  $config[:pools].each do |pool|
1597
1603
  provider_name = pool['provider']
1598
1604
  # The provider_class parameter can be defined in the provider's data eg
1599
- #:providers:
1600
- # :vsphere:
1601
- # provider_class: 'vsphere'
1602
- # :another-vsphere:
1603
- # provider_class: 'vsphere'
1605
+ # :providers:
1606
+ # :vsphere:
1607
+ # provider_class: 'vsphere'
1608
+ # :another-vsphere:
1609
+ # provider_class: 'vsphere'
1604
1610
  # the above would create two providers/vsphere.rb class objects named 'vsphere' and 'another-vsphere'
1605
1611
  # each pools would then define which provider definition to use: vsphere or another-vsphere
1606
1612
  #
1607
1613
  # if provider_class is not defined it will try to use the provider_name as the class, this is to be
1608
1614
  # backwards compatible for example when there is only one provider listed
1609
1615
  # :providers:
1610
- # :dummy:
1611
- # filename: 'db.txs'
1616
+ # :dummy:
1617
+ # filename: 'db.txs'
1612
1618
  # the above example would create an object based on the class providers/dummy.rb
1613
1619
  if $config[:providers].nil? || $config[:providers][provider_name.to_sym].nil? || $config[:providers][provider_name.to_sym]['provider_class'].nil?
1614
1620
  provider_class = provider_name
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Vmpooler
4
- VERSION = '2.3.0'
4
+ VERSION = '2.5.0'
5
5
  end
data/lib/vmpooler.rb CHANGED
@@ -34,7 +34,7 @@ module Vmpooler
34
34
  config_string = ENV['VMPOOLER_CONFIG']
35
35
  # Parse the YAML config into a Hash
36
36
  # Allow the Symbol class
37
- parsed_config = YAML.safe_load(config_string, [Symbol])
37
+ parsed_config = YAML.safe_load(config_string, permitted_classes: [Symbol])
38
38
  else
39
39
  # Take the name of the config file either from an ENV variable or from the filepath argument
40
40
  config_file = ENV['VMPOOLER_CONFIG_FILE'] || filepath
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vmpooler
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-07 00:00:00.000000000 Z
11
+ date: 2023-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -17,8 +17,8 @@ dependencies:
17
17
  - !ruby/object:Gem::Version
18
18
  version: '1.1'
19
19
  name: concurrent-ruby
20
- type: :runtime
21
20
  prerelease: false
21
+ type: :runtime
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
@@ -31,8 +31,8 @@ dependencies:
31
31
  - !ruby/object:Gem::Version
32
32
  version: '2.2'
33
33
  name: connection_pool
34
- type: :runtime
35
34
  prerelease: false
35
+ type: :runtime
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
@@ -45,8 +45,8 @@ dependencies:
45
45
  - !ruby/object:Gem::Version
46
46
  version: '1.2'
47
47
  name: deep_merge
48
- type: :runtime
49
48
  prerelease: false
49
+ type: :runtime
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
@@ -59,27 +59,13 @@ dependencies:
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0.16'
61
61
  name: net-ldap
62
- type: :runtime
63
62
  prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '0.16'
69
- - !ruby/object:Gem::Dependency
70
- requirement: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - "~>"
73
- - !ruby/object:Gem::Version
74
- version: '1.10'
75
- name: nokogiri
76
63
  type: :runtime
77
- prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
66
  - - "~>"
81
67
  - !ruby/object:Gem::Version
82
- version: '1.10'
68
+ version: '0.16'
83
69
  - !ruby/object:Gem::Dependency
84
70
  requirement: !ruby/object:Gem::Requirement
85
71
  requirements:
@@ -87,8 +73,8 @@ dependencies:
87
73
  - !ruby/object:Gem::Version
88
74
  version: 0.20.1
89
75
  name: opentelemetry-exporter-jaeger
90
- type: :runtime
91
76
  prerelease: false
77
+ type: :runtime
92
78
  version_requirements: !ruby/object:Gem::Requirement
93
79
  requirements:
94
80
  - - '='
@@ -101,8 +87,8 @@ dependencies:
101
87
  - !ruby/object:Gem::Version
102
88
  version: 0.19.2
103
89
  name: opentelemetry-instrumentation-concurrent_ruby
104
- type: :runtime
105
90
  prerelease: false
91
+ type: :runtime
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
94
  - - '='
@@ -113,29 +99,29 @@ dependencies:
113
99
  requirements:
114
100
  - - '='
115
101
  - !ruby/object:Gem::Version
116
- version: 0.19.3
102
+ version: 0.19.4
117
103
  name: opentelemetry-instrumentation-http_client
118
- type: :runtime
119
104
  prerelease: false
105
+ type: :runtime
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
108
  - - '='
123
109
  - !ruby/object:Gem::Version
124
- version: 0.19.3
110
+ version: 0.19.4
125
111
  - !ruby/object:Gem::Dependency
126
112
  requirement: !ruby/object:Gem::Requirement
127
113
  requirements:
128
114
  - - '='
129
115
  - !ruby/object:Gem::Version
130
- version: 0.21.2
116
+ version: 0.21.3
131
117
  name: opentelemetry-instrumentation-redis
132
- type: :runtime
133
118
  prerelease: false
119
+ type: :runtime
134
120
  version_requirements: !ruby/object:Gem::Requirement
135
121
  requirements:
136
122
  - - '='
137
123
  - !ruby/object:Gem::Version
138
- version: 0.21.2
124
+ version: 0.21.3
139
125
  - !ruby/object:Gem::Dependency
140
126
  requirement: !ruby/object:Gem::Requirement
141
127
  requirements:
@@ -143,8 +129,8 @@ dependencies:
143
129
  - !ruby/object:Gem::Version
144
130
  version: 0.19.3
145
131
  name: opentelemetry-instrumentation-sinatra
146
- type: :runtime
147
132
  prerelease: false
133
+ type: :runtime
148
134
  version_requirements: !ruby/object:Gem::Requirement
149
135
  requirements:
150
136
  - - '='
@@ -157,8 +143,8 @@ dependencies:
157
143
  - !ruby/object:Gem::Version
158
144
  version: 0.19.1
159
145
  name: opentelemetry-resource_detectors
160
- type: :runtime
161
146
  prerelease: false
147
+ type: :runtime
162
148
  version_requirements: !ruby/object:Gem::Requirement
163
149
  requirements:
164
150
  - - '='
@@ -174,8 +160,8 @@ dependencies:
174
160
  - !ruby/object:Gem::Version
175
161
  version: 1.0.2
176
162
  name: opentelemetry-sdk
177
- type: :runtime
178
163
  prerelease: false
164
+ type: :runtime
179
165
  version_requirements: !ruby/object:Gem::Requirement
180
166
  requirements:
181
167
  - - "~>"
@@ -191,8 +177,8 @@ dependencies:
191
177
  - !ruby/object:Gem::Version
192
178
  version: 0.0.11
193
179
  name: pickup
194
- type: :runtime
195
180
  prerelease: false
181
+ type: :runtime
196
182
  version_requirements: !ruby/object:Gem::Requirement
197
183
  requirements:
198
184
  - - "~>"
@@ -205,8 +191,8 @@ dependencies:
205
191
  - !ruby/object:Gem::Version
206
192
  version: '2.0'
207
193
  name: prometheus-client
208
- type: :runtime
209
194
  prerelease: false
195
+ type: :runtime
210
196
  version_requirements: !ruby/object:Gem::Requirement
211
197
  requirements:
212
198
  - - "~>"
@@ -222,8 +208,8 @@ dependencies:
222
208
  - !ruby/object:Gem::Version
223
209
  version: 5.0.4
224
210
  name: puma
225
- type: :runtime
226
211
  prerelease: false
212
+ type: :runtime
227
213
  version_requirements: !ruby/object:Gem::Requirement
228
214
  requirements:
229
215
  - - "~>"
@@ -239,8 +225,8 @@ dependencies:
239
225
  - !ruby/object:Gem::Version
240
226
  version: '2.2'
241
227
  name: rack
242
- type: :runtime
243
228
  prerelease: false
229
+ type: :runtime
244
230
  version_requirements: !ruby/object:Gem::Requirement
245
231
  requirements:
246
232
  - - "~>"
@@ -253,8 +239,8 @@ dependencies:
253
239
  - !ruby/object:Gem::Version
254
240
  version: '13.0'
255
241
  name: rake
256
- type: :runtime
257
242
  prerelease: false
243
+ type: :runtime
258
244
  version_requirements: !ruby/object:Gem::Requirement
259
245
  requirements:
260
246
  - - "~>"
@@ -267,8 +253,8 @@ dependencies:
267
253
  - !ruby/object:Gem::Version
268
254
  version: '4.1'
269
255
  name: redis
270
- type: :runtime
271
256
  prerelease: false
257
+ type: :runtime
272
258
  version_requirements: !ruby/object:Gem::Requirement
273
259
  requirements:
274
260
  - - "~>"
@@ -281,8 +267,8 @@ dependencies:
281
267
  - !ruby/object:Gem::Version
282
268
  version: '2.0'
283
269
  name: sinatra
284
- type: :runtime
285
270
  prerelease: false
271
+ type: :runtime
286
272
  version_requirements: !ruby/object:Gem::Requirement
287
273
  requirements:
288
274
  - - "~>"
@@ -295,8 +281,8 @@ dependencies:
295
281
  - !ruby/object:Gem::Version
296
282
  version: '2.1'
297
283
  name: spicy-proton
298
- type: :runtime
299
284
  prerelease: false
285
+ type: :runtime
300
286
  version_requirements: !ruby/object:Gem::Requirement
301
287
  requirements:
302
288
  - - "~>"
@@ -309,8 +295,8 @@ dependencies:
309
295
  - !ruby/object:Gem::Version
310
296
  version: '1.4'
311
297
  name: statsd-ruby
312
- type: :runtime
313
298
  prerelease: false
299
+ type: :runtime
314
300
  version_requirements: !ruby/object:Gem::Requirement
315
301
  requirements:
316
302
  - - "~>"
@@ -323,8 +309,8 @@ dependencies:
323
309
  - !ruby/object:Gem::Version
324
310
  version: 0.2.0
325
311
  name: climate_control
326
- type: :development
327
312
  prerelease: false
313
+ type: :development
328
314
  version_requirements: !ruby/object:Gem::Requirement
329
315
  requirements:
330
316
  - - ">="
@@ -337,8 +323,8 @@ dependencies:
337
323
  - !ruby/object:Gem::Version
338
324
  version: 0.17.0
339
325
  name: mock_redis
340
- type: :development
341
326
  prerelease: false
327
+ type: :development
342
328
  version_requirements: !ruby/object:Gem::Requirement
343
329
  requirements:
344
330
  - - ">="
@@ -351,8 +337,8 @@ dependencies:
351
337
  - !ruby/object:Gem::Version
352
338
  version: '0'
353
339
  name: pry
354
- type: :development
355
340
  prerelease: false
341
+ type: :development
356
342
  version_requirements: !ruby/object:Gem::Requirement
357
343
  requirements:
358
344
  - - ">="
@@ -365,8 +351,8 @@ dependencies:
365
351
  - !ruby/object:Gem::Version
366
352
  version: '0.6'
367
353
  name: rack-test
368
- type: :development
369
354
  prerelease: false
355
+ type: :development
370
356
  version_requirements: !ruby/object:Gem::Requirement
371
357
  requirements:
372
358
  - - ">="
@@ -379,8 +365,8 @@ dependencies:
379
365
  - !ruby/object:Gem::Version
380
366
  version: '3.2'
381
367
  name: rspec
382
- type: :development
383
368
  prerelease: false
369
+ type: :development
384
370
  version_requirements: !ruby/object:Gem::Requirement
385
371
  requirements:
386
372
  - - ">="
@@ -391,15 +377,15 @@ dependencies:
391
377
  requirements:
392
378
  - - "~>"
393
379
  - !ruby/object:Gem::Version
394
- version: 1.1.0
380
+ version: 1.28.2
395
381
  name: rubocop
396
- type: :development
397
382
  prerelease: false
383
+ type: :development
398
384
  version_requirements: !ruby/object:Gem::Requirement
399
385
  requirements:
400
386
  - - "~>"
401
387
  - !ruby/object:Gem::Version
402
- version: 1.1.0
388
+ version: 1.28.2
403
389
  - !ruby/object:Gem::Dependency
404
390
  requirement: !ruby/object:Gem::Requirement
405
391
  requirements:
@@ -407,8 +393,8 @@ dependencies:
407
393
  - !ruby/object:Gem::Version
408
394
  version: 0.11.2
409
395
  name: simplecov
410
- type: :development
411
396
  prerelease: false
397
+ type: :development
412
398
  version_requirements: !ruby/object:Gem::Requirement
413
399
  requirements:
414
400
  - - ">="
@@ -424,8 +410,8 @@ dependencies:
424
410
  - !ruby/object:Gem::Version
425
411
  version: 1.0.1
426
412
  name: thor
427
- type: :development
428
413
  prerelease: false
414
+ type: :development
429
415
  version_requirements: !ruby/object:Gem::Requirement
430
416
  requirements:
431
417
  - - "~>"
@@ -441,8 +427,8 @@ dependencies:
441
427
  - !ruby/object:Gem::Version
442
428
  version: '2.0'
443
429
  name: yarjuf
444
- type: :development
445
430
  prerelease: false
431
+ type: :development
446
432
  version_requirements: !ruby/object:Gem::Requirement
447
433
  requirements:
448
434
  - - ">="
@@ -507,14 +493,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
507
493
  requirements:
508
494
  - - ">="
509
495
  - !ruby/object:Gem::Version
510
- version: 2.3.0
496
+ version: '0'
511
497
  required_rubygems_version: !ruby/object:Gem::Requirement
512
498
  requirements:
513
499
  - - ">="
514
500
  - !ruby/object:Gem::Version
515
501
  version: '0'
516
502
  requirements: []
517
- rubygems_version: 3.0.6
503
+ rubygems_version: 3.3.25
518
504
  signing_key:
519
505
  specification_version: 4
520
506
  summary: vmpooler provides configurable pools of instantly-available (running) virtual