vmpooler 0.2.2 → 0.2.31
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.
- checksums.yaml +4 -4
- data/lib/vmpooler/api/v1.rb +5 -0
- data/lib/vmpooler/api.rb +0 -4
- data/lib/vmpooler/pool_manager.rb +70 -13
- data/lib/vmpooler/version.rb +1 -1
- data/lib/vmpooler.rb +15 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 05bc93e150d9cd63aa66fe433b5698bc2eeca02a
|
4
|
+
data.tar.gz: 344b1c64b1f6b8b3ee8661b2d7d3fe09d1a9c45b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96adb9c998587256097f87d88405d5118256f42ee7bec576962c275f32ac3b1fe493cad1c03c853f4dae004b5aa578aa71c2b9dd5aa6a1516d35b6600bd590b0
|
7
|
+
data.tar.gz: 01b014f48a9e5cd8b755367a3c448adee4f8c19610f5330649501c39039d7fa304cb66561fc099ed681ea239e54c4a30dd710aa4dd8c7f66325a492a9d84fa8c
|
data/lib/vmpooler/api/v1.rb
CHANGED
data/lib/vmpooler/api.rb
CHANGED
@@ -134,18 +134,18 @@ module Vmpooler
|
|
134
134
|
move_vm_queue(pool_name, vm_name, 'ready', 'completed', "is unreachable, removed from 'ready' queue")
|
135
135
|
end
|
136
136
|
|
137
|
-
def check_ready_vm(vm,
|
137
|
+
def check_ready_vm(vm, pool_name, ttl, provider)
|
138
138
|
Thread.new do
|
139
139
|
begin
|
140
|
-
_check_ready_vm(vm,
|
140
|
+
_check_ready_vm(vm, pool_name, ttl, provider)
|
141
141
|
rescue => err
|
142
|
-
$logger.log('s', "[!] [#{
|
142
|
+
$logger.log('s', "[!] [#{pool_name}] '#{vm}' failed while checking a ready vm : #{err}")
|
143
143
|
raise
|
144
144
|
end
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
148
|
-
def _check_ready_vm(vm,
|
148
|
+
def _check_ready_vm(vm, pool_name, ttl, provider)
|
149
149
|
# Periodically check that the VM is available
|
150
150
|
mutex = vm_mutex(vm)
|
151
151
|
return if mutex.locked?
|
@@ -158,21 +158,22 @@ module Vmpooler
|
|
158
158
|
if ttl > 0
|
159
159
|
# host['boottime'] may be nil if host is not powered on
|
160
160
|
if ((Time.now - host['boottime']) / 60).to_s[/^\d+\.\d{1}/].to_f > ttl
|
161
|
-
$redis.smove('vmpooler__ready__' +
|
161
|
+
$redis.smove('vmpooler__ready__' + pool_name, 'vmpooler__completed__' + pool_name, vm)
|
162
162
|
|
163
|
-
$logger.log('d', "[!] [#{
|
163
|
+
$logger.log('d', "[!] [#{pool_name}] '#{vm}' reached end of TTL after #{ttl} minutes, removed from 'ready' queue")
|
164
164
|
return
|
165
165
|
end
|
166
166
|
end
|
167
167
|
|
168
|
-
return if has_mismatched_hostname?(vm,
|
168
|
+
return if has_mismatched_hostname?(vm, pool_name, provider)
|
169
169
|
|
170
|
-
vm_still_ready?(
|
170
|
+
vm_still_ready?(pool_name, vm, provider)
|
171
171
|
end
|
172
172
|
end
|
173
173
|
|
174
|
-
def has_mismatched_hostname?(vm,
|
175
|
-
|
174
|
+
def has_mismatched_hostname?(vm, pool_name, provider)
|
175
|
+
pool_config = $config[:pools][$config[:pool_index][pool_name]]
|
176
|
+
check_hostname = pool_config['check_hostname_for_mismatch']
|
176
177
|
check_hostname = $config[:config]['check_ready_vm_hostname_for_mismatch'] if check_hostname.nil?
|
177
178
|
return if check_hostname == false
|
178
179
|
|
@@ -187,15 +188,15 @@ module Vmpooler
|
|
187
188
|
end
|
188
189
|
|
189
190
|
# Check if the hostname has magically changed from underneath Pooler
|
190
|
-
vm_hash = provider.get_vm(
|
191
|
+
vm_hash = provider.get_vm(pool_name, vm)
|
191
192
|
return unless vm_hash.is_a? Hash
|
192
193
|
hostname = vm_hash['hostname']
|
193
194
|
|
194
195
|
return if hostname.nil?
|
195
196
|
return if hostname.empty?
|
196
197
|
return if hostname == vm
|
197
|
-
$redis.smove('vmpooler__ready__' +
|
198
|
-
$logger.log('d', "[!] [#{
|
198
|
+
$redis.smove('vmpooler__ready__' + pool_name, 'vmpooler__completed__' + pool_name, vm)
|
199
|
+
$logger.log('d', "[!] [#{pool_name}] '#{vm}' has mismatched hostname #{hostname}, removed from 'ready' queue")
|
199
200
|
return true
|
200
201
|
end
|
201
202
|
|
@@ -318,10 +319,66 @@ module Vmpooler
|
|
318
319
|
finish = format('%.2f', Time.now - start)
|
319
320
|
$logger.log('s', "[-] [#{pool}] '#{vm}' destroyed in #{finish} seconds")
|
320
321
|
$metrics.timing("destroy.#{pool}", finish)
|
322
|
+
get_vm_usage_labels(vm)
|
321
323
|
end
|
322
324
|
dereference_mutex(vm)
|
323
325
|
end
|
324
326
|
|
327
|
+
def get_vm_usage_labels(vm)
|
328
|
+
return unless $config[:config]['usage_stats']
|
329
|
+
checkout = $redis.hget("vmpooler__vm__#{vm}", 'checkout')
|
330
|
+
return if checkout.nil?
|
331
|
+
jenkins_build_url = $redis.hget("vmpooler__vm__#{vm}", 'tag:jenkins_build_url')
|
332
|
+
user = $redis.hget("vmpooler__vm__#{vm}", 'token:user') || 'unauthenticated'
|
333
|
+
poolname = $redis.hget("vmpooler__vm__#{vm}", "template")
|
334
|
+
|
335
|
+
unless jenkins_build_url
|
336
|
+
$metrics.increment("usage.#{user}.#{poolname}")
|
337
|
+
return
|
338
|
+
end
|
339
|
+
|
340
|
+
url_parts = jenkins_build_url.split('/')[2..-1]
|
341
|
+
instance = url_parts[0].gsub('.', '_')
|
342
|
+
value_stream_parts = url_parts[2].split('_')
|
343
|
+
value_stream = value_stream_parts.shift
|
344
|
+
branch = value_stream_parts.pop
|
345
|
+
project = value_stream_parts.shift
|
346
|
+
job_name = value_stream_parts.join('_')
|
347
|
+
build_metadata_parts = url_parts[3]
|
348
|
+
component_to_test = component_to_test('RMM_COMPONENT_TO_TEST_NAME', build_metadata_parts)
|
349
|
+
|
350
|
+
metric_parts = [
|
351
|
+
'usage',
|
352
|
+
user,
|
353
|
+
instance,
|
354
|
+
value_stream,
|
355
|
+
branch,
|
356
|
+
project,
|
357
|
+
job_name,
|
358
|
+
component_to_test,
|
359
|
+
poolname
|
360
|
+
]
|
361
|
+
|
362
|
+
metric_parts = metric_parts.reject { |s| s.nil? }
|
363
|
+
|
364
|
+
$metrics.increment(metric_parts.join('.'))
|
365
|
+
rescue => err
|
366
|
+
logger.log('d', "[!] [#{poolname}] failed while evaluating usage labels on '#{vm}' with an error: #{err}")
|
367
|
+
end
|
368
|
+
|
369
|
+
def component_to_test(match, labels_string)
|
370
|
+
return if labels_string.nil?
|
371
|
+
labels_string_parts = labels_string.split(',')
|
372
|
+
labels_string_parts.each do |part|
|
373
|
+
key, value = part.split('=')
|
374
|
+
next if value.nil?
|
375
|
+
if key == match
|
376
|
+
return value
|
377
|
+
end
|
378
|
+
end
|
379
|
+
return
|
380
|
+
end
|
381
|
+
|
325
382
|
def purge_unused_vms_and_folders
|
326
383
|
global_purge = $config[:config]['purge_unconfigured_folders']
|
327
384
|
providers = $config[:providers].keys
|
data/lib/vmpooler/version.rb
CHANGED
data/lib/vmpooler.rb
CHANGED
@@ -49,7 +49,7 @@ module Vmpooler
|
|
49
49
|
# Set some configuration defaults
|
50
50
|
parsed_config[:config]['task_limit'] = ENV['TASK_LIMIT'] || parsed_config[:config]['task_limit'] || 10
|
51
51
|
parsed_config[:config]['migration_limit'] = ENV['MIGRATION_LIMIT'] if ENV['MIGRATION_LIMIT']
|
52
|
-
parsed_config[:config]['vm_checktime'] = ENV['VM_CHECKTIME'] || parsed_config[:config]['vm_checktime'] ||
|
52
|
+
parsed_config[:config]['vm_checktime'] = ENV['VM_CHECKTIME'] || parsed_config[:config]['vm_checktime'] || 1
|
53
53
|
parsed_config[:config]['vm_lifetime'] = ENV['VM_LIFETIME'] || parsed_config[:config]['vm_lifetime'] || 24
|
54
54
|
parsed_config[:config]['prefix'] = ENV['VM_PREFIX'] || parsed_config[:config]['prefix'] || ''
|
55
55
|
|
@@ -66,6 +66,7 @@ module Vmpooler
|
|
66
66
|
parsed_config[:config]['create_template_delta_disks'] = ENV['CREATE_TEMPLATE_DELTA_DISKS'] if ENV['CREATE_TEMPLATE_DELTA_DISKS']
|
67
67
|
parsed_config[:config]['experimental_features'] = ENV['EXPERIMENTAL_FEATURES'] if ENV['EXPERIMENTAL_FEATURES']
|
68
68
|
parsed_config[:config]['purge_unconfigured_folders'] = ENV['PURGE_UNCONFIGURED_FOLDERS'] if ENV['PURGE_UNCONFIGURED_FOLDERS']
|
69
|
+
parsed_config[:config]['usage_stats'] = ENV['USAGE_STATS'] if ENV['USAGE_STATS']
|
69
70
|
|
70
71
|
parsed_config[:redis] = parsed_config[:redis] || {}
|
71
72
|
parsed_config[:redis]['server'] = ENV['REDIS_SERVER'] || parsed_config[:redis]['server'] || 'localhost'
|
@@ -100,6 +101,9 @@ module Vmpooler
|
|
100
101
|
parsed_config[:pools] = load_pools_from_redis(redis)
|
101
102
|
end
|
102
103
|
|
104
|
+
# Create an index of pools by title
|
105
|
+
parsed_config[:pool_index] = pool_index(parsed_config[:pools])
|
106
|
+
|
103
107
|
parsed_config[:pools].each do |pool|
|
104
108
|
parsed_config[:pool_names] << pool['name']
|
105
109
|
if pool['alias']
|
@@ -161,4 +165,14 @@ module Vmpooler
|
|
161
165
|
def self.pools(conf)
|
162
166
|
conf[:pools]
|
163
167
|
end
|
168
|
+
|
169
|
+
def self.pool_index(pools)
|
170
|
+
pools_hash = {}
|
171
|
+
index = 0
|
172
|
+
for pool in pools
|
173
|
+
pools_hash[pool['name']] = index
|
174
|
+
index += 1
|
175
|
+
end
|
176
|
+
pools_hash
|
177
|
+
end
|
164
178
|
end
|
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: 0.2.
|
4
|
+
version: 0.2.31
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-10
|
11
|
+
date: 2018-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pickup
|