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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fac55ca73f864661e71a9e8d8af43f747193807d
4
- data.tar.gz: ed7b26990937da7030df493d36be4ad0e067d719
3
+ metadata.gz: 05bc93e150d9cd63aa66fe433b5698bc2eeca02a
4
+ data.tar.gz: 344b1c64b1f6b8b3ee8661b2d7d3fe09d1a9c45b
5
5
  SHA512:
6
- metadata.gz: ffd7935fb89be6df345bb8514d7c61dacb2ea9b87d6c7015471af31936553a574556908e14cd36ad7151fd22c8888170d358bcb1ba5878c3881e2b46f75c5f6b
7
- data.tar.gz: e17bf98032ee7b939c52a94eb7d6cf7f058e621f82045dc73c38e9b130d62db90874900d01e4410458232de33943f0d96eaec2d22a0eb5075b36d11e6a97e9fc
6
+ metadata.gz: 96adb9c998587256097f87d88405d5118256f42ee7bec576962c275f32ac3b1fe493cad1c03c853f4dae004b5aa578aa71c2b9dd5aa6a1516d35b6600bd590b0
7
+ data.tar.gz: 01b014f48a9e5cd8b755367a3c448adee4f8c19610f5330649501c39039d7fa304cb66561fc099ed681ea239e54c4a30dd710aa4dd8c7f66325a492a9d84fa8c
@@ -211,6 +211,11 @@ module Vmpooler
211
211
  end
212
212
  end
213
213
 
214
+ get '/' do
215
+ sync_pool_sizes
216
+ redirect to('/dashboard/')
217
+ end
218
+
214
219
  # Provide run-time statistics
215
220
  #
216
221
  # Example:
data/lib/vmpooler/api.rb CHANGED
@@ -14,10 +14,6 @@ module Vmpooler
14
14
  JSON.pretty_generate(result)
15
15
  end
16
16
 
17
- get '/' do
18
- redirect to('/dashboard/')
19
- end
20
-
21
17
  # Load dashboard components
22
18
  begin
23
19
  require 'dashboard'
@@ -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, pool, ttl, provider)
137
+ def check_ready_vm(vm, pool_name, ttl, provider)
138
138
  Thread.new do
139
139
  begin
140
- _check_ready_vm(vm, pool, ttl, provider)
140
+ _check_ready_vm(vm, pool_name, ttl, provider)
141
141
  rescue => err
142
- $logger.log('s', "[!] [#{pool['name']}] '#{vm}' failed while checking a ready vm : #{err}")
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, pool, ttl, provider)
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__' + pool['name'], 'vmpooler__completed__' + pool['name'], vm)
161
+ $redis.smove('vmpooler__ready__' + pool_name, 'vmpooler__completed__' + pool_name, vm)
162
162
 
163
- $logger.log('d', "[!] [#{pool['name']}] '#{vm}' reached end of TTL after #{ttl} minutes, removed from 'ready' queue")
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, pool, provider)
168
+ return if has_mismatched_hostname?(vm, pool_name, provider)
169
169
 
170
- vm_still_ready?(pool['name'], vm, provider)
170
+ vm_still_ready?(pool_name, vm, provider)
171
171
  end
172
172
  end
173
173
 
174
- def has_mismatched_hostname?(vm, pool, provider)
175
- check_hostname = pool['check_hostname_for_mismatch']
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(pool['name'], 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__' + pool['name'], 'vmpooler__completed__' + pool['name'], vm)
198
- $logger.log('d', "[!] [#{pool['name']}] '#{vm}' has mismatched hostname #{hostname}, removed from 'ready' queue")
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
@@ -1,3 +1,3 @@
1
1
  module Vmpooler
2
- VERSION = '0.2.2'.freeze
2
+ VERSION = '0.2.31'.freeze
3
3
  end
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'] || 15
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.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-01 00:00:00.000000000 Z
11
+ date: 2018-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pickup