vmpooler 0.12.0 → 0.14.0
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/bin/vmpooler +18 -11
- data/lib/vmpooler.rb +26 -16
- data/lib/vmpooler/api.rb +41 -34
- data/lib/vmpooler/api/helpers.rb +2 -2
- data/lib/vmpooler/api/request_logger.rb +20 -0
- data/lib/vmpooler/api/v1.rb +302 -21
- data/lib/vmpooler/generic_connection_pool.rb +12 -28
- data/lib/vmpooler/metrics.rb +24 -0
- data/lib/vmpooler/metrics/dummy_statsd.rb +24 -0
- data/lib/vmpooler/metrics/graphite.rb +47 -0
- data/lib/vmpooler/metrics/promstats.rb +380 -0
- data/lib/vmpooler/metrics/promstats/collector_middleware.rb +121 -0
- data/lib/vmpooler/metrics/statsd.rb +40 -0
- data/lib/vmpooler/pool_manager.rb +763 -409
- data/lib/vmpooler/providers/base.rb +2 -1
- data/lib/vmpooler/providers/dummy.rb +4 -3
- data/lib/vmpooler/providers/vsphere.rb +137 -54
- data/lib/vmpooler/util/parsing.rb +16 -0
- data/lib/vmpooler/version.rb +1 -1
- metadata +39 -6
- data/lib/vmpooler/dummy_statsd.rb +0 -22
- data/lib/vmpooler/graphite.rb +0 -42
- data/lib/vmpooler/statsd.rb +0 -37
@@ -14,10 +14,11 @@ module Vmpooler
|
|
14
14
|
# Provider options passed in during initialization
|
15
15
|
attr_reader :provider_options
|
16
16
|
|
17
|
-
def initialize(config, logger, metrics, name, options)
|
17
|
+
def initialize(config, logger, metrics, redis_connection_pool, name, options)
|
18
18
|
@config = config
|
19
19
|
@logger = logger
|
20
20
|
@metrics = metrics
|
21
|
+
@redis = redis_connection_pool
|
21
22
|
@provider_name = name
|
22
23
|
|
23
24
|
# Ensure that there is not a nil provider configuration
|
@@ -9,8 +9,8 @@ module Vmpooler
|
|
9
9
|
class Dummy < Vmpooler::PoolManager::Provider::Base
|
10
10
|
# Fake VM Provider for testing
|
11
11
|
|
12
|
-
def initialize(config, logger, metrics, name, options)
|
13
|
-
super(config, logger, metrics, name, options)
|
12
|
+
def initialize(config, logger, metrics, redis_connection_pool, name, options)
|
13
|
+
super(config, logger, metrics, redis_connection_pool, name, options)
|
14
14
|
dummyfilename = provider_config['filename']
|
15
15
|
|
16
16
|
# This initial_state option is only intended to be used by spec tests
|
@@ -29,7 +29,8 @@ module Vmpooler
|
|
29
29
|
logger.log('d', "[#{name}] ConnPool - Creating a connection pool of size #{connpool_size} with timeout #{connpool_timeout}")
|
30
30
|
@connection_pool = Vmpooler::PoolManager::GenericConnectionPool.new(
|
31
31
|
metrics: metrics,
|
32
|
-
|
32
|
+
connpool_type: 'provider_connection_pool',
|
33
|
+
connpool_provider: name,
|
33
34
|
size: connpool_size,
|
34
35
|
timeout: connpool_timeout
|
35
36
|
) do
|
@@ -9,8 +9,8 @@ module Vmpooler
|
|
9
9
|
# The connection_pool method is normally used only for testing
|
10
10
|
attr_reader :connection_pool
|
11
11
|
|
12
|
-
def initialize(config, logger, metrics, name, options)
|
13
|
-
super(config, logger, metrics, name, options)
|
12
|
+
def initialize(config, logger, metrics, redis_connection_pool, name, options)
|
13
|
+
super(config, logger, metrics, redis_connection_pool, name, options)
|
14
14
|
|
15
15
|
task_limit = global_config[:config].nil? || global_config[:config]['task_limit'].nil? ? 10 : global_config[:config]['task_limit'].to_i
|
16
16
|
# The default connection pool size is:
|
@@ -25,7 +25,8 @@ module Vmpooler
|
|
25
25
|
logger.log('d', "[#{name}] ConnPool - Creating a connection pool of size #{connpool_size} with timeout #{connpool_timeout}")
|
26
26
|
@connection_pool = Vmpooler::PoolManager::GenericConnectionPool.new(
|
27
27
|
metrics: metrics,
|
28
|
-
|
28
|
+
connpool_type: 'provider_connection_pool',
|
29
|
+
connpool_provider: name,
|
29
30
|
size: connpool_size,
|
30
31
|
timeout: connpool_timeout
|
31
32
|
) do
|
@@ -39,6 +40,7 @@ module Vmpooler
|
|
39
40
|
end
|
40
41
|
@provider_hosts = {}
|
41
42
|
@provider_hosts_lock = Mutex.new
|
43
|
+
@redis = redis_connection_pool
|
42
44
|
end
|
43
45
|
|
44
46
|
# name of the provider class
|
@@ -59,12 +61,16 @@ module Vmpooler
|
|
59
61
|
def destroy_vm_and_log(vm_name, vm_object, pool, data_ttl)
|
60
62
|
try = 0 if try.nil?
|
61
63
|
max_tries = 3
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
64
|
+
@redis.with_metrics do |redis|
|
65
|
+
redis.multi
|
66
|
+
redis.srem("vmpooler__completed__#{pool}", vm_name)
|
67
|
+
redis.hdel("vmpooler__active__#{pool}", vm_name)
|
68
|
+
redis.hset("vmpooler__vm__#{vm_name}", 'destroy', Time.now)
|
69
|
+
|
70
|
+
# Auto-expire metadata key
|
71
|
+
redis.expire('vmpooler__vm__' + vm_name, (data_ttl * 60 * 60))
|
72
|
+
redis.exec
|
73
|
+
end
|
68
74
|
|
69
75
|
start = Time.now
|
70
76
|
|
@@ -293,7 +299,6 @@ module Vmpooler
|
|
293
299
|
template_path = pool['template']
|
294
300
|
target_folder_path = pool['folder']
|
295
301
|
target_datastore = pool['datastore']
|
296
|
-
target_cluster_name = get_target_cluster_from_config(pool_name)
|
297
302
|
target_datacenter_name = get_target_datacenter_from_config(pool_name)
|
298
303
|
|
299
304
|
# Get the template VM object
|
@@ -315,35 +320,23 @@ module Vmpooler
|
|
315
320
|
]
|
316
321
|
)
|
317
322
|
|
318
|
-
#
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
manage_host_selection = @config[:config]['manage_host_selection'] if @config[:config].key?('manage_host_selection')
|
325
|
-
if manage_host_selection
|
326
|
-
run_select_hosts(pool_name, @provider_hosts)
|
327
|
-
target_host = select_next_host(pool_name, @provider_hosts)
|
328
|
-
host_object = find_host_by_dnsname(connection, target_host)
|
329
|
-
relocate_spec.host = host_object
|
330
|
-
else
|
331
|
-
# Choose a cluster/host to place the new VM on
|
332
|
-
target_cluster_object = find_cluster(target_cluster_name, connection, target_datacenter_name)
|
333
|
-
relocate_spec.pool = target_cluster_object.resourcePool
|
323
|
+
# Check if alternate network configuration is specified and add configuration
|
324
|
+
if pool.key?('network')
|
325
|
+
template_vm_network_device = template_vm_object.config.hardware.device.grep(RbVmomi::VIM::VirtualEthernetCard).first
|
326
|
+
network_name = pool['network']
|
327
|
+
network_device = set_network_device(target_datacenter_name, template_vm_network_device, network_name, connection)
|
328
|
+
config_spec.deviceChange = [{ operation: 'edit', device: network_device }]
|
334
329
|
end
|
335
330
|
|
331
|
+
# Put the VM in the specified folder and resource pool
|
332
|
+
relocate_spec = create_relocate_spec(target_datastore, target_datacenter_name, pool_name, connection)
|
333
|
+
|
336
334
|
# Create a clone spec
|
337
|
-
clone_spec =
|
338
|
-
location: relocate_spec,
|
339
|
-
config: config_spec,
|
340
|
-
powerOn: true,
|
341
|
-
template: false
|
342
|
-
)
|
335
|
+
clone_spec = create_clone_spec(relocate_spec, config_spec)
|
343
336
|
|
344
337
|
begin
|
345
338
|
vm_target_folder = find_vm_folder(pool_name, connection)
|
346
|
-
vm_target_folder
|
339
|
+
vm_target_folder ||= create_folder(connection, target_folder_path, target_datacenter_name) if @config[:config].key?('create_folders') && (@config[:config]['create_folders'] == true)
|
347
340
|
rescue StandardError
|
348
341
|
if @config[:config].key?('create_folders') && (@config[:config]['create_folders'] == true)
|
349
342
|
vm_target_folder = create_folder(connection, target_folder_path, target_datacenter_name)
|
@@ -351,6 +344,7 @@ module Vmpooler
|
|
351
344
|
raise
|
352
345
|
end
|
353
346
|
end
|
347
|
+
raise ArgumentError, "Cannot find the configured folder for #{pool_name} #{target_folder_path}" unless vm_target_folder
|
354
348
|
|
355
349
|
# Create the new VM
|
356
350
|
new_vm_object = template_vm_object.CloneVM_Task(
|
@@ -364,6 +358,81 @@ module Vmpooler
|
|
364
358
|
vm_hash
|
365
359
|
end
|
366
360
|
|
361
|
+
def create_relocate_spec(target_datastore, target_datacenter_name, pool_name, connection)
|
362
|
+
pool = pool_config(pool_name)
|
363
|
+
target_cluster_name = get_target_cluster_from_config(pool_name)
|
364
|
+
|
365
|
+
relocate_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(
|
366
|
+
datastore: find_datastore(target_datastore, connection, target_datacenter_name),
|
367
|
+
diskMoveType: get_disk_backing(pool)
|
368
|
+
)
|
369
|
+
manage_host_selection = @config[:config]['manage_host_selection'] if @config[:config].key?('manage_host_selection')
|
370
|
+
if manage_host_selection
|
371
|
+
run_select_hosts(pool_name, @provider_hosts)
|
372
|
+
target_host = select_next_host(pool_name, @provider_hosts)
|
373
|
+
host_object = find_host_by_dnsname(connection, target_host)
|
374
|
+
relocate_spec.host = host_object
|
375
|
+
else
|
376
|
+
# Choose a cluster/host to place the new VM on
|
377
|
+
target_cluster_object = find_cluster(target_cluster_name, connection, target_datacenter_name)
|
378
|
+
relocate_spec.pool = target_cluster_object.resourcePool
|
379
|
+
end
|
380
|
+
relocate_spec
|
381
|
+
end
|
382
|
+
|
383
|
+
def create_clone_spec(relocate_spec, config_spec)
|
384
|
+
RbVmomi::VIM.VirtualMachineCloneSpec(
|
385
|
+
location: relocate_spec,
|
386
|
+
config: config_spec,
|
387
|
+
powerOn: true,
|
388
|
+
template: false
|
389
|
+
)
|
390
|
+
end
|
391
|
+
|
392
|
+
def set_network_device(datacenter_name, template_vm_network_device, network_name, connection)
|
393
|
+
# Retrieve network object
|
394
|
+
datacenter = connection.serviceInstance.find_datacenter(datacenter_name)
|
395
|
+
new_network = datacenter.network.find { |n| n.name == network_name }
|
396
|
+
|
397
|
+
raise("Cannot find network #{network_name} in datacenter #{datacenter_name}") unless new_network
|
398
|
+
|
399
|
+
# Determine network device type
|
400
|
+
# All possible device type options here: https://vdc-download.vmware.com/vmwb-repository/dcr-public/98d63b35-d822-47fe-a87a-ddefd469df06/2e3c7b58-f2bd-486e-8bb1-a75eb0640bee/doc/vim.vm.device.VirtualEthernetCard.html
|
401
|
+
network_device =
|
402
|
+
if template_vm_network_device.is_a? RbVmomi::VIM::VirtualVmxnet2
|
403
|
+
RbVmomi::VIM.VirtualVmxnet2
|
404
|
+
elsif template_vm_network_device.is_a? RbVmomi::VIM::VirtualVmxnet3
|
405
|
+
RbVmomi::VIM.VirtualVmxnet3
|
406
|
+
elsif template_vm_network_device.is_a? RbVmomi::VIM::VirtualE1000
|
407
|
+
RbVmomi::VIM.VirtualE1000
|
408
|
+
elsif template_vm_network_device.is_a? RbVmomi::VIM::VirtualE1000e
|
409
|
+
RbVmomi::VIM.VirtualE1000e
|
410
|
+
elsif template_vm_network_device.is_a? RbVmomi::VIM::VirtualSriovEthernetCard
|
411
|
+
RbVmomi::VIM.VirtualSriovEthernetCard
|
412
|
+
else
|
413
|
+
RbVmomi::VIM.VirtualPCNet32
|
414
|
+
end
|
415
|
+
|
416
|
+
# Set up new network device attributes
|
417
|
+
network_device.key = template_vm_network_device.key
|
418
|
+
network_device.deviceInfo = RbVmomi::VIM.Description(
|
419
|
+
label: template_vm_network_device.deviceInfo.label,
|
420
|
+
summary: network_name
|
421
|
+
)
|
422
|
+
network_device.backing = RbVmomi::VIM.VirtualEthernetCardNetworkBackingInfo(
|
423
|
+
deviceName: network_name,
|
424
|
+
network: new_network,
|
425
|
+
useAutoDetect: false
|
426
|
+
)
|
427
|
+
network_device.addressType = 'assigned'
|
428
|
+
network_device.connectable = RbVmomi::VIM.VirtualDeviceConnectInfo(
|
429
|
+
allowGuestControl: true,
|
430
|
+
startConnected: true,
|
431
|
+
connected: true
|
432
|
+
)
|
433
|
+
network_device
|
434
|
+
end
|
435
|
+
|
367
436
|
def create_disk(pool_name, vm_name, disk_size)
|
368
437
|
pool = pool_config(pool_name)
|
369
438
|
raise("Pool #{pool_name} does not exist for the provider #{name}") if pool.nil?
|
@@ -968,22 +1037,24 @@ module Vmpooler
|
|
968
1037
|
begin
|
969
1038
|
connection = ensured_vsphere_connection(pool_object)
|
970
1039
|
vm_hash = get_vm_details(pool_name, vm_name, connection)
|
971
|
-
|
972
|
-
|
973
|
-
|
974
|
-
|
975
|
-
if
|
976
|
-
|
977
|
-
|
978
|
-
|
979
|
-
|
980
|
-
|
981
|
-
|
1040
|
+
@redis.with_metrics do |redis|
|
1041
|
+
redis.hset("vmpooler__vm__#{vm_name}", 'host', vm_hash['host_name'])
|
1042
|
+
migration_count = redis.scard('vmpooler__migration')
|
1043
|
+
migration_limit = @config[:config]['migration_limit'] if @config[:config].key?('migration_limit')
|
1044
|
+
if migration_enabled? @config
|
1045
|
+
if migration_count >= migration_limit
|
1046
|
+
logger.log('s', "[ ] [#{pool_name}] '#{vm_name}' is running on #{vm_hash['host_name']}. No migration will be evaluated since the migration_limit has been reached")
|
1047
|
+
break
|
1048
|
+
end
|
1049
|
+
run_select_hosts(pool_name, @provider_hosts)
|
1050
|
+
if vm_in_target?(pool_name, vm_hash['host_name'], vm_hash['architecture'], @provider_hosts)
|
1051
|
+
logger.log('s', "[ ] [#{pool_name}] No migration required for '#{vm_name}' running on #{vm_hash['host_name']}")
|
1052
|
+
else
|
1053
|
+
migrate_vm_to_new_host(pool_name, vm_name, vm_hash, connection)
|
1054
|
+
end
|
982
1055
|
else
|
983
|
-
|
1056
|
+
logger.log('s', "[ ] [#{pool_name}] '#{vm_name}' is running on #{vm_hash['host_name']}")
|
984
1057
|
end
|
985
|
-
else
|
986
|
-
logger.log('s', "[ ] [#{pool_name}] '#{vm_name}' is running on #{vm_hash['host_name']}")
|
987
1058
|
end
|
988
1059
|
rescue StandardError
|
989
1060
|
logger.log('s', "[!] [#{pool_name}] '#{vm_name}' is running on #{vm_hash['host_name']}")
|
@@ -993,15 +1064,23 @@ module Vmpooler
|
|
993
1064
|
end
|
994
1065
|
|
995
1066
|
def migrate_vm_to_new_host(pool_name, vm_name, vm_hash, connection)
|
996
|
-
|
1067
|
+
@redis.with_metrics do |redis|
|
1068
|
+
redis.sadd('vmpooler__migration', vm_name)
|
1069
|
+
end
|
997
1070
|
target_host_name = select_next_host(pool_name, @provider_hosts, vm_hash['architecture'])
|
998
1071
|
target_host_object = find_host_by_dnsname(connection, target_host_name)
|
999
1072
|
finish = migrate_vm_and_record_timing(pool_name, vm_name, vm_hash, target_host_object, target_host_name)
|
1000
|
-
|
1001
|
-
|
1073
|
+
@redis.with_metrics do |redis|
|
1074
|
+
redis.multi
|
1075
|
+
redis.hset("vmpooler__vm__#{vm_name}", 'host', target_host_name)
|
1076
|
+
redis.hset("vmpooler__vm__#{vm_name}", 'migrated', true)
|
1077
|
+
redis.exec
|
1078
|
+
end
|
1002
1079
|
logger.log('s', "[>] [#{pool_name}] '#{vm_name}' migrated from #{vm_hash['host_name']} to #{target_host_name} in #{finish} seconds")
|
1003
1080
|
ensure
|
1004
|
-
|
1081
|
+
@redis.with_metrics do |redis|
|
1082
|
+
redis.srem('vmpooler__migration', vm_name)
|
1083
|
+
end
|
1005
1084
|
end
|
1006
1085
|
|
1007
1086
|
def migrate_vm_and_record_timing(pool_name, vm_name, vm_hash, target_host_object, dest_host_name)
|
@@ -1011,9 +1090,13 @@ module Vmpooler
|
|
1011
1090
|
metrics.timing("migrate.#{pool_name}", finish)
|
1012
1091
|
metrics.increment("migrate_from.#{vm_hash['host_name']}")
|
1013
1092
|
metrics.increment("migrate_to.#{dest_host_name}")
|
1014
|
-
|
1015
|
-
|
1016
|
-
|
1093
|
+
@redis.with_metrics do |redis|
|
1094
|
+
checkout_to_migration = format('%<time>.2f', time: Time.now - Time.parse(redis.hget("vmpooler__vm__#{vm_name}", 'checkout')))
|
1095
|
+
redis.multi
|
1096
|
+
redis.hset("vmpooler__vm__#{vm_name}", 'migration_time', finish)
|
1097
|
+
redis.hset("vmpooler__vm__#{vm_name}", 'checkout_to_migration', checkout_to_migration)
|
1098
|
+
redis.exec
|
1099
|
+
end
|
1017
1100
|
finish
|
1018
1101
|
end
|
1019
1102
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# utility class shared between apps
|
4
|
+
module Vmpooler
|
5
|
+
class Parsing
|
6
|
+
def self.get_platform_pool_count(requested, &_block)
|
7
|
+
requested_platforms = requested.split(',')
|
8
|
+
requested_platforms.each do |platform|
|
9
|
+
platform_alias, pool, count = platform.split(':')
|
10
|
+
raise ArgumentError if platform_alias.nil? || pool.nil? || count.nil?
|
11
|
+
|
12
|
+
yield platform_alias, pool, count
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/vmpooler/version.rb
CHANGED
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.
|
4
|
+
version: 0.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pickup
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '2.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: prometheus-client
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2.0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '2.0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: net-ldap
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +164,20 @@ dependencies:
|
|
150
164
|
- - "~>"
|
151
165
|
- !ruby/object:Gem::Version
|
152
166
|
version: '2.2'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: concurrent-ruby
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '1.1'
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '1.1'
|
153
181
|
- !ruby/object:Gem::Dependency
|
154
182
|
name: nokogiri
|
155
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -191,13 +219,18 @@ files:
|
|
191
219
|
- lib/vmpooler/api.rb
|
192
220
|
- lib/vmpooler/api/dashboard.rb
|
193
221
|
- lib/vmpooler/api/helpers.rb
|
222
|
+
- lib/vmpooler/api/request_logger.rb
|
194
223
|
- lib/vmpooler/api/reroute.rb
|
195
224
|
- lib/vmpooler/api/v1.rb
|
196
225
|
- lib/vmpooler/dashboard.rb
|
197
|
-
- lib/vmpooler/dummy_statsd.rb
|
198
226
|
- lib/vmpooler/generic_connection_pool.rb
|
199
|
-
- lib/vmpooler/graphite.rb
|
200
227
|
- lib/vmpooler/logger.rb
|
228
|
+
- lib/vmpooler/metrics.rb
|
229
|
+
- lib/vmpooler/metrics/dummy_statsd.rb
|
230
|
+
- lib/vmpooler/metrics/graphite.rb
|
231
|
+
- lib/vmpooler/metrics/promstats.rb
|
232
|
+
- lib/vmpooler/metrics/promstats/collector_middleware.rb
|
233
|
+
- lib/vmpooler/metrics/statsd.rb
|
201
234
|
- lib/vmpooler/pool_manager.rb
|
202
235
|
- lib/vmpooler/providers.rb
|
203
236
|
- lib/vmpooler/providers/base.rb
|
@@ -214,7 +247,7 @@ files:
|
|
214
247
|
- lib/vmpooler/public/lib/dashboard.js
|
215
248
|
- lib/vmpooler/public/lib/jquery.min.js
|
216
249
|
- lib/vmpooler/public/vmpooler.css
|
217
|
-
- lib/vmpooler/
|
250
|
+
- lib/vmpooler/util/parsing.rb
|
218
251
|
- lib/vmpooler/version.rb
|
219
252
|
- lib/vmpooler/views/dashboard.erb
|
220
253
|
- lib/vmpooler/views/layout.erb
|
@@ -237,7 +270,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
237
270
|
- !ruby/object:Gem::Version
|
238
271
|
version: '0'
|
239
272
|
requirements: []
|
240
|
-
rubygems_version: 3.0.
|
273
|
+
rubygems_version: 3.0.8
|
241
274
|
signing_key:
|
242
275
|
specification_version: 4
|
243
276
|
summary: vmpooler provides configurable pools of instantly-available (running) virtual
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Vmpooler
|
4
|
-
class DummyStatsd
|
5
|
-
attr_reader :server, :port, :prefix
|
6
|
-
|
7
|
-
def initialize(*)
|
8
|
-
end
|
9
|
-
|
10
|
-
def increment(*)
|
11
|
-
true
|
12
|
-
end
|
13
|
-
|
14
|
-
def gauge(*)
|
15
|
-
true
|
16
|
-
end
|
17
|
-
|
18
|
-
def timing(*)
|
19
|
-
true
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|