vmpooler 0.16.1 → 0.18.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/vmpooler.rb +9 -13
- data/lib/vmpooler/api/dashboard.rb +18 -20
- data/lib/vmpooler/api/helpers.rb +15 -15
- data/lib/vmpooler/api/v1.rb +55 -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/statsd.rb +5 -3
- data/lib/vmpooler/pool_manager.rb +54 -65
- data/lib/vmpooler/providers/dummy.rb +20 -38
- data/lib/vmpooler/providers/vsphere.rb +48 -38
- data/lib/vmpooler/version.rb +1 -1
- metadata +42 -36
@@ -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: 0.18.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-10
|
11
|
+
date: 2020-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -70,100 +70,100 @@ dependencies:
|
|
70
70
|
name: opentelemetry-api
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - '='
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0.
|
75
|
+
version: 0.8.0
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - '='
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.
|
82
|
+
version: 0.8.0
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: opentelemetry-exporter-jaeger
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - '='
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.
|
89
|
+
version: 0.8.0
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - '='
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.
|
96
|
+
version: 0.8.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: opentelemetry-instrumentation-concurrent_ruby
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - '='
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.
|
103
|
+
version: 0.8.0
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - '='
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.
|
110
|
+
version: 0.8.0
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: opentelemetry-instrumentation-redis
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - '='
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.
|
117
|
+
version: 0.8.0
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - '='
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.
|
124
|
+
version: 0.8.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: opentelemetry-instrumentation-sinatra
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- -
|
129
|
+
- - '='
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 0.
|
131
|
+
version: 0.8.0
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- -
|
136
|
+
- - '='
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: 0.
|
138
|
+
version: 0.8.0
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: opentelemetry-resource_detectors
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
|
-
- -
|
143
|
+
- - '='
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: 0.
|
145
|
+
version: 0.8.0
|
146
146
|
type: :runtime
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
|
-
- -
|
150
|
+
- - '='
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: 0.
|
152
|
+
version: 0.8.0
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: opentelemetry-sdk
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
|
-
- -
|
157
|
+
- - '='
|
158
158
|
- !ruby/object:Gem::Version
|
159
|
-
version: 0.
|
159
|
+
version: 0.8.0
|
160
160
|
type: :runtime
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
|
-
- -
|
164
|
+
- - '='
|
165
165
|
- !ruby/object:Gem::Version
|
166
|
-
version: 0.
|
166
|
+
version: 0.8.0
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
168
|
name: pickup
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,14 +198,20 @@ dependencies:
|
|
198
198
|
requirements:
|
199
199
|
- - "~>"
|
200
200
|
- !ruby/object:Gem::Version
|
201
|
-
version: '
|
201
|
+
version: '5.0'
|
202
|
+
- - ">="
|
203
|
+
- !ruby/object:Gem::Version
|
204
|
+
version: 5.0.4
|
202
205
|
type: :runtime
|
203
206
|
prerelease: false
|
204
207
|
version_requirements: !ruby/object:Gem::Requirement
|
205
208
|
requirements:
|
206
209
|
- - "~>"
|
207
210
|
- !ruby/object:Gem::Version
|
208
|
-
version: '
|
211
|
+
version: '5.0'
|
212
|
+
- - ">="
|
213
|
+
- !ruby/object:Gem::Version
|
214
|
+
version: 5.0.4
|
209
215
|
- !ruby/object:Gem::Dependency
|
210
216
|
name: rack
|
211
217
|
requirement: !ruby/object:Gem::Requirement
|
@@ -384,16 +390,16 @@ dependencies:
|
|
384
390
|
name: rubocop
|
385
391
|
requirement: !ruby/object:Gem::Requirement
|
386
392
|
requirements:
|
387
|
-
- - "
|
393
|
+
- - "~>"
|
388
394
|
- !ruby/object:Gem::Version
|
389
|
-
version: '0'
|
395
|
+
version: '1.0'
|
390
396
|
type: :development
|
391
397
|
prerelease: false
|
392
398
|
version_requirements: !ruby/object:Gem::Requirement
|
393
399
|
requirements:
|
394
|
-
- - "
|
400
|
+
- - "~>"
|
395
401
|
- !ruby/object:Gem::Version
|
396
|
-
version: '0'
|
402
|
+
version: '1.0'
|
397
403
|
- !ruby/object:Gem::Dependency
|
398
404
|
name: simplecov
|
399
405
|
requirement: !ruby/object:Gem::Requirement
|