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 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