vmpooler 0.2.2 → 0.2.31
Sign up to get free protection for your applications and to get access to all the features.
- 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
|