vmpooler 0.16.3 → 1.0.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/lib/vmpooler.rb +9 -14
- data/lib/vmpooler/api/dashboard.rb +18 -20
- data/lib/vmpooler/api/helpers.rb +15 -15
- data/lib/vmpooler/api/v1.rb +51 -52
- data/lib/vmpooler/metrics/dummy_statsd.rb +0 -3
- data/lib/vmpooler/metrics/graphite.rb +2 -0
- data/lib/vmpooler/metrics/promstats.rb +2 -0
- data/lib/vmpooler/metrics/promstats/collector_middleware.rb +1 -1
- data/lib/vmpooler/metrics/statsd.rb +5 -3
- data/lib/vmpooler/pool_manager.rb +48 -55
- data/lib/vmpooler/providers/dummy.rb +20 -38
- data/lib/vmpooler/providers/vsphere.rb +48 -38
- data/lib/vmpooler/version.rb +1 -1
- metadata +38 -46
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'vmpooler/providers/base'
|
4
|
+
require 'bigdecimal'
|
5
|
+
require 'bigdecimal/util'
|
4
6
|
|
5
7
|
module Vmpooler
|
6
8
|
class PoolManager
|
@@ -49,9 +51,7 @@ module Vmpooler
|
|
49
51
|
end
|
50
52
|
|
51
53
|
def folder_configured?(folder_title, base_folder, configured_folders, whitelist)
|
52
|
-
if whitelist
|
53
|
-
return true if whitelist.include?(folder_title)
|
54
|
-
end
|
54
|
+
return true if whitelist&.include?(folder_title)
|
55
55
|
return false unless configured_folders.keys.include?(folder_title)
|
56
56
|
return false unless configured_folders[folder_title] == base_folder
|
57
57
|
|
@@ -68,7 +68,7 @@ module Vmpooler
|
|
68
68
|
redis.hset("vmpooler__vm__#{vm_name}", 'destroy', Time.now)
|
69
69
|
|
70
70
|
# Auto-expire metadata key
|
71
|
-
redis.expire(
|
71
|
+
redis.expire("vmpooler__vm__#{vm_name}", (data_ttl * 60 * 60))
|
72
72
|
redis.exec
|
73
73
|
end
|
74
74
|
|
@@ -203,9 +203,7 @@ module Vmpooler
|
|
203
203
|
return
|
204
204
|
end
|
205
205
|
wait_for_host_selection(dc, target, loop_delay, max_age) if target[dc].key?('checking')
|
206
|
-
if target[dc].key?('check_time_finished')
|
207
|
-
select_target_hosts(target, cluster, datacenter) if now - target[dc]['check_time_finished'] > max_age
|
208
|
-
end
|
206
|
+
select_target_hosts(target, cluster, datacenter) if target[dc].key?('check_time_finished') && now - target[dc]['check_time_finished'] > max_age
|
209
207
|
end
|
210
208
|
|
211
209
|
def wait_for_host_selection(dc, target, maxloop = 0, loop_delay = 1, max_age = 60)
|
@@ -306,19 +304,26 @@ module Vmpooler
|
|
306
304
|
|
307
305
|
template_vm_object = find_template_vm(pool, connection)
|
308
306
|
|
307
|
+
extra_config = [
|
308
|
+
{ key: 'guestinfo.hostname', value: new_vmname }
|
309
|
+
]
|
310
|
+
|
311
|
+
if pool.key?('snapshot_mainMem_ioBlockPages')
|
312
|
+
ioblockpages = pool['snapshot_mainMem_ioBlockPages']
|
313
|
+
extra_config.push(
|
314
|
+
{ key: 'mainMem.ioBlockPages', value: ioblockpages }
|
315
|
+
)
|
316
|
+
end
|
317
|
+
if pool.key?('snapshot_mainMem_iowait')
|
318
|
+
iowait = pool['snapshot_mainMem_iowait']
|
319
|
+
extra_config.push(
|
320
|
+
{ key: 'mainMem.iowait', value: iowait }
|
321
|
+
)
|
322
|
+
end
|
323
|
+
|
309
324
|
# Annotate with creation time, origin template, etc.
|
310
325
|
# Add extraconfig options that can be queried by vmtools
|
311
|
-
config_spec =
|
312
|
-
annotation: JSON.pretty_generate(
|
313
|
-
name: new_vmname,
|
314
|
-
created_by: provider_config['username'],
|
315
|
-
base_template: template_path,
|
316
|
-
creation_timestamp: Time.now.utc
|
317
|
-
),
|
318
|
-
extraConfig: [
|
319
|
-
{ key: 'guestinfo.hostname', value: new_vmname }
|
320
|
-
]
|
321
|
-
)
|
326
|
+
config_spec = create_config_spec(new_vmname, template_path, extra_config)
|
322
327
|
|
323
328
|
# Check if alternate network configuration is specified and add configuration
|
324
329
|
if pool.key?('network')
|
@@ -358,6 +363,18 @@ module Vmpooler
|
|
358
363
|
vm_hash
|
359
364
|
end
|
360
365
|
|
366
|
+
def create_config_spec(vm_name, template_name, extra_config)
|
367
|
+
RbVmomi::VIM.VirtualMachineConfigSpec(
|
368
|
+
annotation: JSON.pretty_generate(
|
369
|
+
name: vm_name,
|
370
|
+
created_by: provider_config['username'],
|
371
|
+
base_template: template_name,
|
372
|
+
creation_timestamp: Time.now.utc
|
373
|
+
),
|
374
|
+
extraConfig: extra_config
|
375
|
+
)
|
376
|
+
end
|
377
|
+
|
361
378
|
def create_relocate_spec(target_datastore, target_datacenter_name, pool_name, connection)
|
362
379
|
pool = pool_config(pool_name)
|
363
380
|
target_cluster_name = get_target_cluster_from_config(pool_name)
|
@@ -399,15 +416,15 @@ module Vmpooler
|
|
399
416
|
# Determine network device type
|
400
417
|
# 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
418
|
network_device =
|
402
|
-
if template_vm_network_device.
|
419
|
+
if template_vm_network_device.instance_of? RbVmomi::VIM::VirtualVmxnet2
|
403
420
|
RbVmomi::VIM.VirtualVmxnet2
|
404
|
-
elsif template_vm_network_device.
|
421
|
+
elsif template_vm_network_device.instance_of? RbVmomi::VIM::VirtualVmxnet3
|
405
422
|
RbVmomi::VIM.VirtualVmxnet3
|
406
|
-
elsif template_vm_network_device.
|
423
|
+
elsif template_vm_network_device.instance_of? RbVmomi::VIM::VirtualE1000
|
407
424
|
RbVmomi::VIM.VirtualE1000
|
408
|
-
elsif template_vm_network_device.
|
425
|
+
elsif template_vm_network_device.instance_of? RbVmomi::VIM::VirtualE1000e
|
409
426
|
RbVmomi::VIM.VirtualE1000e
|
410
|
-
elsif template_vm_network_device.
|
427
|
+
elsif template_vm_network_device.instance_of? RbVmomi::VIM::VirtualSriovEthernetCard
|
411
428
|
RbVmomi::VIM.VirtualSriovEthernetCard
|
412
429
|
else
|
413
430
|
RbVmomi::VIM.VirtualPCNet32
|
@@ -541,7 +558,7 @@ module Vmpooler
|
|
541
558
|
boottime = vm_object.runtime.bootTime if vm_object.runtime&.bootTime
|
542
559
|
powerstate = vm_object.runtime.powerState if vm_object.runtime&.powerState
|
543
560
|
|
544
|
-
|
561
|
+
{
|
545
562
|
'name' => vm_object.name,
|
546
563
|
'hostname' => hostname,
|
547
564
|
'template' => pool_configuration['template'],
|
@@ -549,8 +566,6 @@ module Vmpooler
|
|
549
566
|
'boottime' => boottime,
|
550
567
|
'powerstate' => powerstate
|
551
568
|
}
|
552
|
-
|
553
|
-
hash
|
554
569
|
end
|
555
570
|
|
556
571
|
# vSphere helper methods
|
@@ -775,7 +790,7 @@ module Vmpooler
|
|
775
790
|
}
|
776
791
|
|
777
792
|
folder_object = connection.searchIndex.FindByInventoryPath(propSpecs) # rubocop:disable Naming/VariableName
|
778
|
-
return nil unless folder_object.
|
793
|
+
return nil unless folder_object.instance_of? RbVmomi::VIM::Folder
|
779
794
|
|
780
795
|
folder_object
|
781
796
|
end
|
@@ -791,9 +806,7 @@ module Vmpooler
|
|
791
806
|
# the cpu or memory utilization is bigger than the limit param
|
792
807
|
def get_host_utilization(host, model = nil, limit = 90)
|
793
808
|
limit = @config[:config]['utilization_limit'] if @config[:config].key?('utilization_limit')
|
794
|
-
if model
|
795
|
-
return nil unless host_has_cpu_model?(host, model)
|
796
|
-
end
|
809
|
+
return nil if model && !host_has_cpu_model?(host, model)
|
797
810
|
return nil if host.runtime.inMaintenanceMode
|
798
811
|
return nil unless host.overallStatus == 'green'
|
799
812
|
return nil unless host.configIssue.empty?
|
@@ -802,9 +815,9 @@ module Vmpooler
|
|
802
815
|
memory_utilization = memory_utilization_for host
|
803
816
|
|
804
817
|
return nil if cpu_utilization.nil?
|
805
|
-
return nil if cpu_utilization == 0.0
|
818
|
+
return nil if cpu_utilization.to_d == 0.0.to_d
|
806
819
|
return nil if memory_utilization.nil?
|
807
|
-
return nil if memory_utilization == 0.0
|
820
|
+
return nil if memory_utilization.to_d == 0.0.to_d
|
808
821
|
|
809
822
|
return nil if cpu_utilization > limit
|
810
823
|
return nil if memory_utilization > limit
|
@@ -819,8 +832,7 @@ module Vmpooler
|
|
819
832
|
def get_host_cpu_arch_version(host)
|
820
833
|
cpu_model = host.hardware.cpuPkg[0].description
|
821
834
|
cpu_model_parts = cpu_model.split
|
822
|
-
|
823
|
-
arch_version
|
835
|
+
cpu_model_parts[4]
|
824
836
|
end
|
825
837
|
|
826
838
|
def cpu_utilization_for(host)
|
@@ -912,8 +924,7 @@ module Vmpooler
|
|
912
924
|
target_hosts = get_cluster_host_utilization(cluster_object)
|
913
925
|
raise("There is no host candidate in vcenter that meets all the required conditions, check that the cluster has available hosts in a 'green' status, not in maintenance mode and not overloaded CPU and memory'") if target_hosts.empty?
|
914
926
|
|
915
|
-
|
916
|
-
least_used_host
|
927
|
+
target_hosts.min[1]
|
917
928
|
end
|
918
929
|
|
919
930
|
def find_cluster(cluster, connection, datacentername)
|
@@ -960,11 +971,10 @@ module Vmpooler
|
|
960
971
|
end
|
961
972
|
|
962
973
|
def build_propSpecs(datacenter, folder, vmname) # rubocop:disable Naming/MethodName
|
963
|
-
|
974
|
+
{
|
964
975
|
entity => self,
|
965
976
|
:inventoryPath => "#{datacenter}/vm/#{folder}/#{vmname}"
|
966
977
|
}
|
967
|
-
propSpecs # rubocop:disable Naming/VariableName
|
968
978
|
end
|
969
979
|
|
970
980
|
def find_vm(pool_name, vmname, connection)
|
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: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -66,104 +66,90 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.10'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: opentelemetry-api
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 0.7.0
|
76
|
-
type: :runtime
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: 0.7.0
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: opentelemetry-exporter-jaeger
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
86
72
|
requirements:
|
87
|
-
- -
|
73
|
+
- - '='
|
88
74
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.
|
75
|
+
version: 0.13.0
|
90
76
|
type: :runtime
|
91
77
|
prerelease: false
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
|
-
- -
|
80
|
+
- - '='
|
95
81
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.
|
82
|
+
version: 0.13.0
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: opentelemetry-instrumentation-concurrent_ruby
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
100
86
|
requirements:
|
101
|
-
- -
|
87
|
+
- - '='
|
102
88
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.
|
89
|
+
version: 0.13.0
|
104
90
|
type: :runtime
|
105
91
|
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
|
-
- -
|
94
|
+
- - '='
|
109
95
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.
|
96
|
+
version: 0.13.0
|
111
97
|
- !ruby/object:Gem::Dependency
|
112
98
|
name: opentelemetry-instrumentation-redis
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
114
100
|
requirements:
|
115
|
-
- -
|
101
|
+
- - '='
|
116
102
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.
|
103
|
+
version: 0.13.0
|
118
104
|
type: :runtime
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
107
|
requirements:
|
122
|
-
- -
|
108
|
+
- - '='
|
123
109
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.
|
110
|
+
version: 0.13.0
|
125
111
|
- !ruby/object:Gem::Dependency
|
126
112
|
name: opentelemetry-instrumentation-sinatra
|
127
113
|
requirement: !ruby/object:Gem::Requirement
|
128
114
|
requirements:
|
129
|
-
- -
|
115
|
+
- - '='
|
130
116
|
- !ruby/object:Gem::Version
|
131
|
-
version: 0.
|
117
|
+
version: 0.13.0
|
132
118
|
type: :runtime
|
133
119
|
prerelease: false
|
134
120
|
version_requirements: !ruby/object:Gem::Requirement
|
135
121
|
requirements:
|
136
|
-
- -
|
122
|
+
- - '='
|
137
123
|
- !ruby/object:Gem::Version
|
138
|
-
version: 0.
|
124
|
+
version: 0.13.0
|
139
125
|
- !ruby/object:Gem::Dependency
|
140
126
|
name: opentelemetry-resource_detectors
|
141
127
|
requirement: !ruby/object:Gem::Requirement
|
142
128
|
requirements:
|
143
|
-
- -
|
129
|
+
- - '='
|
144
130
|
- !ruby/object:Gem::Version
|
145
|
-
version: 0.
|
131
|
+
version: 0.13.0
|
146
132
|
type: :runtime
|
147
133
|
prerelease: false
|
148
134
|
version_requirements: !ruby/object:Gem::Requirement
|
149
135
|
requirements:
|
150
|
-
- -
|
136
|
+
- - '='
|
151
137
|
- !ruby/object:Gem::Version
|
152
|
-
version: 0.
|
138
|
+
version: 0.13.0
|
153
139
|
- !ruby/object:Gem::Dependency
|
154
140
|
name: opentelemetry-sdk
|
155
141
|
requirement: !ruby/object:Gem::Requirement
|
156
142
|
requirements:
|
157
|
-
- -
|
143
|
+
- - '='
|
158
144
|
- !ruby/object:Gem::Version
|
159
|
-
version: 0.
|
145
|
+
version: 0.13.1
|
160
146
|
type: :runtime
|
161
147
|
prerelease: false
|
162
148
|
version_requirements: !ruby/object:Gem::Requirement
|
163
149
|
requirements:
|
164
|
-
- -
|
150
|
+
- - '='
|
165
151
|
- !ruby/object:Gem::Version
|
166
|
-
version: 0.
|
152
|
+
version: 0.13.1
|
167
153
|
- !ruby/object:Gem::Dependency
|
168
154
|
name: pickup
|
169
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,14 +184,20 @@ dependencies:
|
|
198
184
|
requirements:
|
199
185
|
- - "~>"
|
200
186
|
- !ruby/object:Gem::Version
|
201
|
-
version: '
|
187
|
+
version: '5.0'
|
188
|
+
- - ">="
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: 5.0.4
|
202
191
|
type: :runtime
|
203
192
|
prerelease: false
|
204
193
|
version_requirements: !ruby/object:Gem::Requirement
|
205
194
|
requirements:
|
206
195
|
- - "~>"
|
207
196
|
- !ruby/object:Gem::Version
|
208
|
-
version: '
|
197
|
+
version: '5.0'
|
198
|
+
- - ">="
|
199
|
+
- !ruby/object:Gem::Version
|
200
|
+
version: 5.0.4
|
209
201
|
- !ruby/object:Gem::Dependency
|
210
202
|
name: rack
|
211
203
|
requirement: !ruby/object:Gem::Requirement
|
@@ -384,16 +376,16 @@ dependencies:
|
|
384
376
|
name: rubocop
|
385
377
|
requirement: !ruby/object:Gem::Requirement
|
386
378
|
requirements:
|
387
|
-
- - "
|
379
|
+
- - "~>"
|
388
380
|
- !ruby/object:Gem::Version
|
389
|
-
version:
|
381
|
+
version: 1.1.0
|
390
382
|
type: :development
|
391
383
|
prerelease: false
|
392
384
|
version_requirements: !ruby/object:Gem::Requirement
|
393
385
|
requirements:
|
394
|
-
- - "
|
386
|
+
- - "~>"
|
395
387
|
- !ruby/object:Gem::Version
|
396
|
-
version:
|
388
|
+
version: 1.1.0
|
397
389
|
- !ruby/object:Gem::Dependency
|
398
390
|
name: simplecov
|
399
391
|
requirement: !ruby/object:Gem::Requirement
|