mirror of
https://github.com/puppetlabs/vmpooler.git
synced 2026-01-26 01:58:41 -05:00
Rubocop fix
This commit is contained in:
parent
063a6f6d53
commit
2a6d610b7a
15 changed files with 182 additions and 225 deletions
|
|
@ -53,9 +53,7 @@ module Vmpooler
|
||||||
|
|
||||||
# Bail out if someone attempts to start vmpooler with dummy authentication
|
# Bail out if someone attempts to start vmpooler with dummy authentication
|
||||||
# without enbaling debug mode.
|
# without enbaling debug mode.
|
||||||
if parsed_config.key? :auth
|
if parsed_config.key?(:auth) && parsed_config[:auth]['provider'] == 'dummy' && !ENV['VMPOOLER_DEBUG']
|
||||||
if parsed_config[:auth]['provider'] == 'dummy'
|
|
||||||
unless ENV['VMPOOLER_DEBUG']
|
|
||||||
warning = [
|
warning = [
|
||||||
'Dummy authentication should not be used outside of debug mode',
|
'Dummy authentication should not be used outside of debug mode',
|
||||||
'please set environment variable VMPOOLER_DEBUG to \'true\' if you want to use dummy authentication'
|
'please set environment variable VMPOOLER_DEBUG to \'true\' if you want to use dummy authentication'
|
||||||
|
|
@ -63,8 +61,6 @@ module Vmpooler
|
||||||
|
|
||||||
raise warning.join(";\s")
|
raise warning.join(";\s")
|
||||||
end
|
end
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Set some configuration defaults
|
# Set some configuration defaults
|
||||||
parsed_config[:config]['task_limit'] = string_to_int(ENV['TASK_LIMIT']) || parsed_config[:config]['task_limit'] || 10
|
parsed_config[:config]['task_limit'] = string_to_int(ENV['TASK_LIMIT']) || parsed_config[:config]['task_limit'] || 10
|
||||||
|
|
@ -140,14 +136,14 @@ module Vmpooler
|
||||||
parsed_config[:pool_names] << pool['name']
|
parsed_config[:pool_names] << pool['name']
|
||||||
pool['ready_ttl'] ||= parsed_config[:config]['ready_ttl']
|
pool['ready_ttl'] ||= parsed_config[:config]['ready_ttl']
|
||||||
if pool['alias']
|
if pool['alias']
|
||||||
if pool['alias'].is_a?(Array)
|
if pool['alias'].instance_of?(Array)
|
||||||
pool['alias'].each do |pool_alias|
|
pool['alias'].each do |pool_alias|
|
||||||
parsed_config[:alias] ||= {}
|
parsed_config[:alias] ||= {}
|
||||||
parsed_config[:alias][pool_alias] = [pool['name']] unless parsed_config[:alias].key? pool_alias
|
parsed_config[:alias][pool_alias] = [pool['name']] unless parsed_config[:alias].key? pool_alias
|
||||||
parsed_config[:alias][pool_alias] << pool['name'] unless parsed_config[:alias][pool_alias].include? pool['name']
|
parsed_config[:alias][pool_alias] << pool['name'] unless parsed_config[:alias][pool_alias].include? pool['name']
|
||||||
parsed_config[:pool_names] << pool_alias
|
parsed_config[:pool_names] << pool_alias
|
||||||
end
|
end
|
||||||
elsif pool['alias'].is_a?(String)
|
elsif pool['alias'].instance_of?(String)
|
||||||
parsed_config[:alias][pool['alias']] = pool['name']
|
parsed_config[:alias][pool['alias']] = pool['name']
|
||||||
parsed_config[:pool_names] << pool['alias']
|
parsed_config[:pool_names] << pool['alias']
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -128,19 +128,18 @@ module Vmpooler
|
||||||
|
|
||||||
pools.each do |pool|
|
pools.each do |pool|
|
||||||
running = running_hash[pool['name']]
|
running = running_hash[pool['name']]
|
||||||
pool['major'] = Regexp.last_match[1] if pool['name'] =~ /^(\w+)\-/
|
pool['major'] = Regexp.last_match[1] if pool['name'] =~ /^(\w+)-/
|
||||||
result[pool['major']] ||= {}
|
result[pool['major']] ||= {}
|
||||||
result[pool['major']]['running'] = result[pool['major']]['running'].to_i + running.to_i
|
result[pool['major']]['running'] = result[pool['major']]['running'].to_i + running.to_i
|
||||||
end
|
end
|
||||||
|
|
||||||
if params[:history]
|
if params[:history] && graph_url
|
||||||
if graph_url
|
|
||||||
begin
|
begin
|
||||||
buffer = URI.parse(graph_link('.running.*&from=-1hour&format=json')).read
|
buffer = URI.parse(graph_link('.running.*&from=-1hour&format=json')).read
|
||||||
JSON.parse(buffer).each do |pool|
|
JSON.parse(buffer).each do |pool|
|
||||||
if pool['target'] =~ /.*\.(.*)$/
|
if pool['target'] =~ /.*\.(.*)$/
|
||||||
pool['name'] = Regexp.last_match[1]
|
pool['name'] = Regexp.last_match[1]
|
||||||
pool['major'] = Regexp.last_match[1] if pool['name'] =~ /^(\w+)\-/
|
pool['major'] = Regexp.last_match[1] if pool['name'] =~ /^(\w+)-/
|
||||||
result[pool['major']]['history'] ||= []
|
result[pool['major']]['history'] ||= []
|
||||||
|
|
||||||
for i in 0..pool['datapoints'].length
|
for i in 0..pool['datapoints'].length
|
||||||
|
|
@ -157,7 +156,6 @@ module Vmpooler
|
||||||
rescue StandardError
|
rescue StandardError
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
JSON.pretty_generate(result)
|
JSON.pretty_generate(result)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -13,12 +13,12 @@ module Vmpooler
|
||||||
def valid_token?(backend)
|
def valid_token?(backend)
|
||||||
return false unless has_token?
|
return false unless has_token?
|
||||||
|
|
||||||
backend.exists?('vmpooler__token__' + request.env['HTTP_X_AUTH_TOKEN']) ? true : false
|
backend.exists?("vmpooler__token__#{request.env['HTTP_X_AUTH_TOKEN']}") ? true : false
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate_token(backend)
|
def validate_token(backend)
|
||||||
if valid_token?(backend)
|
if valid_token?(backend)
|
||||||
backend.hset('vmpooler__token__' + request.env['HTTP_X_AUTH_TOKEN'], 'last', Time.now)
|
backend.hset("vmpooler__token__#{request.env['HTTP_X_AUTH_TOKEN']}last#{Time.now}")
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
@ -117,8 +117,8 @@ module Vmpooler
|
||||||
tags.each_pair do |tag, value|
|
tags.each_pair do |tag, value|
|
||||||
next if value.nil? or value.empty?
|
next if value.nil? or value.empty?
|
||||||
|
|
||||||
backend.hset('vmpooler__vm__' + hostname, 'tag:' + tag, value)
|
backend.hset("vmpooler__vm__#{hostname}", "tag:#{tag}", value)
|
||||||
backend.hset('vmpooler__tag__' + Date.today.to_s, hostname + ':' + tag, value)
|
backend.hset("vmpooler__tag__#{Date.today}", "#{hostname}:#{tag}", value)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -145,7 +145,7 @@ module Vmpooler
|
||||||
|
|
||||||
def hostname_shorten(hostname, domain=nil)
|
def hostname_shorten(hostname, domain=nil)
|
||||||
if domain && hostname =~ /^[\w-]+\.#{domain}$/
|
if domain && hostname =~ /^[\w-]+\.#{domain}$/
|
||||||
hostname = hostname[/[^\.]+/]
|
hostname = hostname[/[^.]+/]
|
||||||
end
|
end
|
||||||
|
|
||||||
hostname
|
hostname
|
||||||
|
|
@ -251,17 +251,15 @@ module Vmpooler
|
||||||
|
|
||||||
tags = {}
|
tags = {}
|
||||||
|
|
||||||
backend.hgetall('vmpooler__tag__' + date_str).each do |key, value|
|
backend.hgetall("vmpooler__tag__#{date_str}").each do |key, value|
|
||||||
hostname = 'unknown'
|
hostname = 'unknown'
|
||||||
tag = 'unknown'
|
tag = 'unknown'
|
||||||
|
|
||||||
if key =~ /\:/
|
if key =~ /:/
|
||||||
hostname, tag = key.split(':', 2)
|
hostname, tag = key.split(':', 2)
|
||||||
end
|
end
|
||||||
|
|
||||||
if opts[:only]
|
next if opts[:only] && tag != opts[:only]
|
||||||
next unless tag == opts[:only]
|
|
||||||
end
|
|
||||||
|
|
||||||
tags[tag] ||= {}
|
tags[tag] ||= {}
|
||||||
tags[tag][value] ||= 0
|
tags[tag][value] ||= 0
|
||||||
|
|
@ -319,7 +317,7 @@ module Vmpooler
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
task[:count][:total] = backend.hlen('vmpooler__' + task_str + '__' + date_str).to_i
|
task[:count][:total] = backend.hlen("vmpooler__#{task_str}__#{date_str}").to_i
|
||||||
|
|
||||||
if task[:count][:total] > 0
|
if task[:count][:total] > 0
|
||||||
if opts[:bypool] == true
|
if opts[:bypool] == true
|
||||||
|
|
@ -328,11 +326,11 @@ module Vmpooler
|
||||||
task[:count][:pool] = {}
|
task[:count][:pool] = {}
|
||||||
task[:duration][:pool] = {}
|
task[:duration][:pool] = {}
|
||||||
|
|
||||||
backend.hgetall('vmpooler__' + task_str + '__' + date_str).each do |key, value|
|
backend.hgetall("vmpooler__#{task_str}__#{date_str}").each do |key, value|
|
||||||
pool = 'unknown'
|
pool = 'unknown'
|
||||||
hostname = 'unknown'
|
hostname = 'unknown'
|
||||||
|
|
||||||
if key =~ /\:/
|
if key =~ /:/
|
||||||
pool, hostname = key.split(':')
|
pool, hostname = key.split(':')
|
||||||
else
|
else
|
||||||
hostname = key
|
hostname = key
|
||||||
|
|
|
||||||
|
|
@ -174,13 +174,13 @@ module Vmpooler
|
||||||
if Vmpooler::API.settings.config[:auth] and has_token?
|
if Vmpooler::API.settings.config[:auth] and has_token?
|
||||||
validate_token(backend)
|
validate_token(backend)
|
||||||
|
|
||||||
backend.hset('vmpooler__vm__' + vm, 'token:token', request.env['HTTP_X_AUTH_TOKEN'])
|
backend.hset("vmpooler__vm__#{vm}", 'token:token', request.env['HTTP_X_AUTH_TOKEN'])
|
||||||
backend.hset('vmpooler__vm__' + vm, 'token:user',
|
backend.hset("vmpooler__vm__#{vm}", 'token:user',
|
||||||
backend.hget('vmpooler__token__' + request.env['HTTP_X_AUTH_TOKEN'], 'user')
|
backend.hget("vmpooler__token__#{request.env['HTTP_X_AUTH_TOKEN']}", 'user')
|
||||||
)
|
)
|
||||||
|
|
||||||
if config['vm_lifetime_auth'].to_i > 0
|
if config['vm_lifetime_auth'].to_i > 0
|
||||||
backend.hset('vmpooler__vm__' + vm, 'lifetime', config['vm_lifetime_auth'].to_i)
|
backend.hset("vmpooler__vm__#{vm}", 'lifetime', config['vm_lifetime_auth'].to_i)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -205,11 +205,11 @@ module Vmpooler
|
||||||
vmname, vmpool, vmtemplate = fetch_single_vm(requested)
|
vmname, vmpool, vmtemplate = fetch_single_vm(requested)
|
||||||
if !vmname
|
if !vmname
|
||||||
failed = true
|
failed = true
|
||||||
metrics.increment('checkout.empty.' + requested)
|
metrics.increment("checkout.empty.#{requested}")
|
||||||
break
|
break
|
||||||
else
|
else
|
||||||
vms << [vmpool, vmname, vmtemplate]
|
vms << [vmpool, vmname, vmtemplate]
|
||||||
metrics.increment('checkout.success.' + vmtemplate)
|
metrics.increment("checkout.success.#{vmtemplate}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -337,7 +337,7 @@ module Vmpooler
|
||||||
payload&.each do |poolname, count|
|
payload&.each do |poolname, count|
|
||||||
next unless count.to_i > config['max_ondemand_instances_per_request']
|
next unless count.to_i > config['max_ondemand_instances_per_request']
|
||||||
|
|
||||||
metrics.increment('ondemandrequest_fail.toomanyrequests.' + poolname)
|
metrics.increment("ondemandrequest_fail.toomanyrequests.#{poolname}")
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
false
|
false
|
||||||
|
|
@ -380,7 +380,7 @@ module Vmpooler
|
||||||
if Vmpooler::API.settings.config[:auth] and has_token?
|
if Vmpooler::API.settings.config[:auth] and has_token?
|
||||||
backend.hset("vmpooler__odrequest__#{request_id}", 'token:token', request.env['HTTP_X_AUTH_TOKEN'])
|
backend.hset("vmpooler__odrequest__#{request_id}", 'token:token', request.env['HTTP_X_AUTH_TOKEN'])
|
||||||
backend.hset("vmpooler__odrequest__#{request_id}", 'token:user',
|
backend.hset("vmpooler__odrequest__#{request_id}", 'token:user',
|
||||||
backend.hget('vmpooler__token__' + request.env['HTTP_X_AUTH_TOKEN'], 'user'))
|
backend.hget("vmpooler__token__#{request.env['HTTP_X_AUTH_TOKEN']}", 'user'))
|
||||||
end
|
end
|
||||||
|
|
||||||
result['domain'] = config['domain'] if config['domain']
|
result['domain'] = config['domain'] if config['domain']
|
||||||
|
|
@ -542,9 +542,9 @@ module Vmpooler
|
||||||
if subpool.include?(p['name'])
|
if subpool.include?(p['name'])
|
||||||
true
|
true
|
||||||
elsif !p['alias'].nil?
|
elsif !p['alias'].nil?
|
||||||
if p['alias'].is_a?(Array)
|
if p['alias'].instance_of?(Array)
|
||||||
(p['alias'] & subpool).any?
|
(p['alias'] & subpool).any?
|
||||||
elsif p['alias'].is_a?(String)
|
elsif p['alias'].instance_of?(String)
|
||||||
subpool.include?(p['alias'])
|
subpool.include?(p['alias'])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -727,14 +727,14 @@ module Vmpooler
|
||||||
result = { 'ok' => false }
|
result = { 'ok' => false }
|
||||||
|
|
||||||
if Vmpooler::API.settings.config[:auth]
|
if Vmpooler::API.settings.config[:auth]
|
||||||
token = backend.hgetall('vmpooler__token__' + params[:token])
|
token = backend.hgetall("vmpooler__token__#{params[:token]}")
|
||||||
|
|
||||||
if not token.nil? and not token.empty?
|
if not token.nil? and not token.empty?
|
||||||
status 200
|
status 200
|
||||||
|
|
||||||
pools.each do |pool|
|
pools.each do |pool|
|
||||||
backend.smembers('vmpooler__running__' + pool['name']).each do |vm|
|
backend.smembers("vmpooler__running__#{pool['name']}").each do |vm|
|
||||||
if backend.hget('vmpooler__vm__' + vm, 'token:token') == params[:token]
|
if backend.hget("vmpooler__vm__#{vm}", 'token:token') == params[:token]
|
||||||
token['vms'] ||= {}
|
token['vms'] ||= {}
|
||||||
token['vms']['running'] ||= []
|
token['vms']['running'] ||= []
|
||||||
token['vms']['running'].push(vm)
|
token['vms']['running'].push(vm)
|
||||||
|
|
@ -760,7 +760,7 @@ module Vmpooler
|
||||||
|
|
||||||
need_auth!
|
need_auth!
|
||||||
|
|
||||||
if backend.del('vmpooler__token__' + params[:token]).to_i > 0
|
if backend.del("vmpooler__token__#{params[:token]}").to_i > 0
|
||||||
status 200
|
status 200
|
||||||
result['ok'] = true
|
result['ok'] = true
|
||||||
end
|
end
|
||||||
|
|
@ -783,8 +783,8 @@ module Vmpooler
|
||||||
o = [('a'..'z'), ('0'..'9')].map(&:to_a).flatten
|
o = [('a'..'z'), ('0'..'9')].map(&:to_a).flatten
|
||||||
result['token'] = o[rand(25)] + (0...31).map { o[rand(o.length)] }.join
|
result['token'] = o[rand(25)] + (0...31).map { o[rand(o.length)] }.join
|
||||||
|
|
||||||
backend.hset('vmpooler__token__' + result['token'], 'user', @auth.username)
|
backend.hset("vmpooler__token__#{result['token']}", 'user', @auth.username)
|
||||||
backend.hset('vmpooler__token__' + result['token'], 'created', Time.now)
|
backend.hset("vmpooler__token__#{result['token']}", 'created', Time.now)
|
||||||
|
|
||||||
status 200
|
status 200
|
||||||
result['ok'] = true
|
result['ok'] = true
|
||||||
|
|
@ -823,7 +823,7 @@ module Vmpooler
|
||||||
else
|
else
|
||||||
result[:bad_templates] = invalid
|
result[:bad_templates] = invalid
|
||||||
invalid.each do |bad_template|
|
invalid.each do |bad_template|
|
||||||
metrics.increment('ondemandrequest_fail.invalid.' + bad_template)
|
metrics.increment("ondemandrequest_fail.invalid.#{bad_template}")
|
||||||
end
|
end
|
||||||
status 404
|
status 404
|
||||||
end
|
end
|
||||||
|
|
@ -858,7 +858,7 @@ module Vmpooler
|
||||||
else
|
else
|
||||||
result[:bad_templates] = invalid
|
result[:bad_templates] = invalid
|
||||||
invalid.each do |bad_template|
|
invalid.each do |bad_template|
|
||||||
metrics.increment('ondemandrequest_fail.invalid.' + bad_template)
|
metrics.increment("ondemandrequest_fail.invalid.#{bad_template}")
|
||||||
end
|
end
|
||||||
status 404
|
status 404
|
||||||
end
|
end
|
||||||
|
|
@ -904,7 +904,7 @@ module Vmpooler
|
||||||
result = atomically_allocate_vms(payload)
|
result = atomically_allocate_vms(payload)
|
||||||
else
|
else
|
||||||
invalid.each do |bad_template|
|
invalid.each do |bad_template|
|
||||||
metrics.increment('checkout.invalid.' + bad_template)
|
metrics.increment("checkout.invalid.#{bad_template}")
|
||||||
end
|
end
|
||||||
status 404
|
status 404
|
||||||
end
|
end
|
||||||
|
|
@ -980,7 +980,8 @@ module Vmpooler
|
||||||
result['ok'] = true
|
result['ok'] = true
|
||||||
status 202
|
status 202
|
||||||
|
|
||||||
if request_hash['status'] == 'ready'
|
case request_hash['status']
|
||||||
|
when 'ready'
|
||||||
result['ready'] = true
|
result['ready'] = true
|
||||||
Parsing.get_platform_pool_count(request_hash['requested']) do |platform_alias, pool, _count|
|
Parsing.get_platform_pool_count(request_hash['requested']) do |platform_alias, pool, _count|
|
||||||
instances = backend.smembers("vmpooler__#{request_id}__#{platform_alias}__#{pool}")
|
instances = backend.smembers("vmpooler__#{request_id}__#{platform_alias}__#{pool}")
|
||||||
|
|
@ -993,10 +994,10 @@ module Vmpooler
|
||||||
end
|
end
|
||||||
result['domain'] = config['domain'] if config['domain']
|
result['domain'] = config['domain'] if config['domain']
|
||||||
status 200
|
status 200
|
||||||
elsif request_hash['status'] == 'failed'
|
when 'failed'
|
||||||
result['message'] = "The request failed to provision instances within the configured ondemand_request_ttl '#{config['ondemand_request_ttl']}'"
|
result['message'] = "The request failed to provision instances within the configured ondemand_request_ttl '#{config['ondemand_request_ttl']}'"
|
||||||
status 200
|
status 200
|
||||||
elsif request_hash['status'] == 'deleted'
|
when 'deleted'
|
||||||
result['message'] = 'The request has been deleted'
|
result['message'] = 'The request has been deleted'
|
||||||
status 200
|
status 200
|
||||||
else
|
else
|
||||||
|
|
@ -1059,7 +1060,7 @@ module Vmpooler
|
||||||
result = atomically_allocate_vms(payload)
|
result = atomically_allocate_vms(payload)
|
||||||
else
|
else
|
||||||
invalid.each do |bad_template|
|
invalid.each do |bad_template|
|
||||||
metrics.increment('checkout.invalid.' + bad_template)
|
metrics.increment("checkout.invalid.#{bad_template}")
|
||||||
end
|
end
|
||||||
status 404
|
status 404
|
||||||
end
|
end
|
||||||
|
|
@ -1082,7 +1083,7 @@ module Vmpooler
|
||||||
|
|
||||||
params[:hostname] = hostname_shorten(params[:hostname], config['domain'])
|
params[:hostname] = hostname_shorten(params[:hostname], config['domain'])
|
||||||
|
|
||||||
rdata = backend.hgetall('vmpooler__vm__' + params[:hostname])
|
rdata = backend.hgetall("vmpooler__vm__#{params[:hostname]}")
|
||||||
unless rdata.empty?
|
unless rdata.empty?
|
||||||
status 200
|
status 200
|
||||||
result['ok'] = true
|
result['ok'] = true
|
||||||
|
|
@ -1155,12 +1156,12 @@ module Vmpooler
|
||||||
|
|
||||||
params[:hostname] = hostname_shorten(params[:hostname], config['domain'])
|
params[:hostname] = hostname_shorten(params[:hostname], config['domain'])
|
||||||
|
|
||||||
rdata = backend.hgetall('vmpooler__vm__' + params[:hostname])
|
rdata = backend.hgetall("vmpooler__vm__#{params[:hostname]}")
|
||||||
unless rdata.empty?
|
unless rdata.empty?
|
||||||
need_token! if rdata['token:token']
|
need_token! if rdata['token:token']
|
||||||
|
|
||||||
if backend.srem('vmpooler__running__' + rdata['template'], params[:hostname])
|
if backend.srem("vmpooler__running__#{rdata['template']}", params[:hostname])
|
||||||
backend.sadd('vmpooler__completed__' + rdata['template'], params[:hostname])
|
backend.sadd("vmpooler__completed__#{rdata['template']}", params[:hostname])
|
||||||
|
|
||||||
status 200
|
status 200
|
||||||
result['ok'] = true
|
result['ok'] = true
|
||||||
|
|
@ -1184,7 +1185,7 @@ module Vmpooler
|
||||||
|
|
||||||
params[:hostname] = hostname_shorten(params[:hostname], config['domain'])
|
params[:hostname] = hostname_shorten(params[:hostname], config['domain'])
|
||||||
|
|
||||||
if backend.exists?('vmpooler__vm__' + params[:hostname])
|
if backend.exists?("vmpooler__vm__#{params[:hostname]}")
|
||||||
begin
|
begin
|
||||||
jdata = JSON.parse(request.body.read)
|
jdata = JSON.parse(request.body.read)
|
||||||
rescue StandardError
|
rescue StandardError
|
||||||
|
|
@ -1212,13 +1213,8 @@ module Vmpooler
|
||||||
end
|
end
|
||||||
|
|
||||||
when 'tags'
|
when 'tags'
|
||||||
unless arg.is_a?(Hash)
|
failure.push("You provided tags (#{arg}) as something other than a hash.") unless arg.is_a?(Hash)
|
||||||
failure.push("You provided tags (#{arg}) as something other than a hash.")
|
failure.push("You provided unsuppored tags (#{arg}).") if config['allowed_tags'] && !(arg.keys - config['allowed_tags']).empty?
|
||||||
end
|
|
||||||
|
|
||||||
if config['allowed_tags']
|
|
||||||
failure.push("You provided unsuppored tags (#{arg}).") if not (arg.keys - config['allowed_tags']).empty?
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
failure.push("Unknown argument #{arg}.")
|
failure.push("Unknown argument #{arg}.")
|
||||||
end
|
end
|
||||||
|
|
@ -1235,7 +1231,7 @@ module Vmpooler
|
||||||
|
|
||||||
arg = arg.to_i
|
arg = arg.to_i
|
||||||
|
|
||||||
backend.hset('vmpooler__vm__' + params[:hostname], param, arg)
|
backend.hset("vmpooler__vm__#{params[:hostname]}", param, arg)
|
||||||
when 'tags'
|
when 'tags'
|
||||||
filter_tags(arg)
|
filter_tags(arg)
|
||||||
export_tags(backend, params[:hostname], arg)
|
export_tags(backend, params[:hostname], arg)
|
||||||
|
|
@ -1261,11 +1257,11 @@ module Vmpooler
|
||||||
|
|
||||||
params[:hostname] = hostname_shorten(params[:hostname], config['domain'])
|
params[:hostname] = hostname_shorten(params[:hostname], config['domain'])
|
||||||
|
|
||||||
if ((params[:size].to_i > 0 )and (backend.exists?('vmpooler__vm__' + params[:hostname])))
|
if ((params[:size].to_i > 0 )and (backend.exists?("vmpooler__vm__#{params[:hostname]}")))
|
||||||
result[params[:hostname]] = {}
|
result[params[:hostname]] = {}
|
||||||
result[params[:hostname]]['disk'] = "+#{params[:size]}gb"
|
result[params[:hostname]]['disk'] = "+#{params[:size]}gb"
|
||||||
|
|
||||||
backend.sadd('vmpooler__tasks__disk', params[:hostname] + ':' + params[:size])
|
backend.sadd('vmpooler__tasks__disk', "#{params[:hostname]}:#{params[:size]}")
|
||||||
|
|
||||||
status 202
|
status 202
|
||||||
result['ok'] = true
|
result['ok'] = true
|
||||||
|
|
@ -1285,13 +1281,13 @@ module Vmpooler
|
||||||
|
|
||||||
params[:hostname] = hostname_shorten(params[:hostname], config['domain'])
|
params[:hostname] = hostname_shorten(params[:hostname], config['domain'])
|
||||||
|
|
||||||
if backend.exists?('vmpooler__vm__' + params[:hostname])
|
if backend.exists?("vmpooler__vm__#{params[:hostname]}")
|
||||||
result[params[:hostname]] = {}
|
result[params[:hostname]] = {}
|
||||||
|
|
||||||
o = [('a'..'z'), ('0'..'9')].map(&:to_a).flatten
|
o = [('a'..'z'), ('0'..'9')].map(&:to_a).flatten
|
||||||
result[params[:hostname]]['snapshot'] = o[rand(25)] + (0...31).map { o[rand(o.length)] }.join
|
result[params[:hostname]]['snapshot'] = o[rand(25)] + (0...31).map { o[rand(o.length)] }.join
|
||||||
|
|
||||||
backend.sadd('vmpooler__tasks__snapshot', params[:hostname] + ':' + result[params[:hostname]]['snapshot'])
|
backend.sadd('vmpooler__tasks__snapshot', "#{params[:hostname]}:#{result[params[:hostname]]['snapshot']}")
|
||||||
|
|
||||||
status 202
|
status 202
|
||||||
result['ok'] = true
|
result['ok'] = true
|
||||||
|
|
@ -1311,8 +1307,8 @@ module Vmpooler
|
||||||
|
|
||||||
params[:hostname] = hostname_shorten(params[:hostname], config['domain'])
|
params[:hostname] = hostname_shorten(params[:hostname], config['domain'])
|
||||||
|
|
||||||
unless backend.hget('vmpooler__vm__' + params[:hostname], 'snapshot:' + params[:snapshot]).to_i.zero?
|
unless backend.hget("vmpooler__vm__#{params[:hostname]}", "snapshot:#{params[:snapshot]}").to_i.zero?
|
||||||
backend.sadd('vmpooler__tasks__snapshot-revert', params[:hostname] + ':' + params[:snapshot])
|
backend.sadd('vmpooler__tasks__snapshot-revert', "#{params[:hostname]}:#{params[:snapshot]}")
|
||||||
|
|
||||||
status 202
|
status 202
|
||||||
result['ok'] = true
|
result['ok'] = true
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,6 @@ module Vmpooler
|
||||||
class DummyStatsd < Metrics
|
class DummyStatsd < Metrics
|
||||||
attr_reader :server, :port, :prefix
|
attr_reader :server, :port, :prefix
|
||||||
|
|
||||||
def initialize(*)
|
|
||||||
end
|
|
||||||
|
|
||||||
def increment(*)
|
def increment(*)
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ module Vmpooler
|
||||||
class Graphite < Metrics
|
class Graphite < Metrics
|
||||||
attr_reader :server, :port, :prefix
|
attr_reader :server, :port, :prefix
|
||||||
|
|
||||||
|
# rubocop:disable Lint/MissingSuper
|
||||||
def initialize(logger, params = {})
|
def initialize(logger, params = {})
|
||||||
raise ArgumentError, "Graphite server is required. Config: #{params.inspect}" if params['server'].nil? || params['server'].empty?
|
raise ArgumentError, "Graphite server is required. Config: #{params.inspect}" if params['server'].nil? || params['server'].empty?
|
||||||
|
|
||||||
|
|
@ -15,6 +16,7 @@ module Vmpooler
|
||||||
@prefix = params['prefix'] || 'vmpooler'
|
@prefix = params['prefix'] || 'vmpooler'
|
||||||
@logger = logger
|
@logger = logger
|
||||||
end
|
end
|
||||||
|
# rubocop:enable Lint/MissingSuper
|
||||||
|
|
||||||
def increment(label)
|
def increment(label)
|
||||||
log label, 1
|
log label, 1
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ module Vmpooler
|
||||||
@p_metrics = {}
|
@p_metrics = {}
|
||||||
@torun = []
|
@torun = []
|
||||||
|
|
||||||
|
# rubocop:disable Lint/MissingSuper
|
||||||
def initialize(logger, params = {})
|
def initialize(logger, params = {})
|
||||||
@prefix = params['prefix'] || 'vmpooler'
|
@prefix = params['prefix'] || 'vmpooler'
|
||||||
@prometheus_prefix = params['prometheus_prefix'] || 'vmpooler'
|
@prometheus_prefix = params['prometheus_prefix'] || 'vmpooler'
|
||||||
|
|
@ -32,6 +33,7 @@ module Vmpooler
|
||||||
# Setup up prometheus registry and data structures
|
# Setup up prometheus registry and data structures
|
||||||
@prometheus = Prometheus::Client.registry
|
@prometheus = Prometheus::Client.registry
|
||||||
end
|
end
|
||||||
|
# rubocop:enable Lint/MissingSuper
|
||||||
|
|
||||||
=begin # rubocop:disable Style/BlockComments
|
=begin # rubocop:disable Style/BlockComments
|
||||||
The Metrics table is used to register metrics and translate/interpret the incoming metrics.
|
The Metrics table is used to register metrics and translate/interpret the incoming metrics.
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ module Vmpooler
|
||||||
class Statsd < Metrics
|
class Statsd < Metrics
|
||||||
attr_reader :server, :port, :prefix
|
attr_reader :server, :port, :prefix
|
||||||
|
|
||||||
|
# rubocop:disable Lint/MissingSuper
|
||||||
def initialize(logger, params = {})
|
def initialize(logger, params = {})
|
||||||
raise ArgumentError, "Statsd server is required. Config: #{params.inspect}" if params['server'].nil? || params['server'].empty?
|
raise ArgumentError, "Statsd server is required. Config: #{params.inspect}" if params['server'].nil? || params['server'].empty?
|
||||||
|
|
||||||
|
|
@ -17,21 +18,22 @@ module Vmpooler
|
||||||
@server = ::Statsd.new(host, @port)
|
@server = ::Statsd.new(host, @port)
|
||||||
@logger = logger
|
@logger = logger
|
||||||
end
|
end
|
||||||
|
# rubocop:enable Lint/MissingSuper
|
||||||
|
|
||||||
def increment(label)
|
def increment(label)
|
||||||
server.increment(prefix + '.' + label)
|
server.increment("#{prefix}.#{label}")
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
@logger.log('s', "[!] Failure incrementing #{prefix}.#{label} on statsd server [#{server}:#{port}]: #{e}")
|
@logger.log('s', "[!] Failure incrementing #{prefix}.#{label} on statsd server [#{server}:#{port}]: #{e}")
|
||||||
end
|
end
|
||||||
|
|
||||||
def gauge(label, value)
|
def gauge(label, value)
|
||||||
server.gauge(prefix + '.' + label, value)
|
server.gauge("#{prefix}.#{label}", value)
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
@logger.log('s', "[!] Failure updating gauge #{prefix}.#{label} on statsd server [#{server}:#{port}]: #{e}")
|
@logger.log('s', "[!] Failure updating gauge #{prefix}.#{label} on statsd server [#{server}:#{port}]: #{e}")
|
||||||
end
|
end
|
||||||
|
|
||||||
def timing(label, duration)
|
def timing(label, duration)
|
||||||
server.timing(prefix + '.' + label, duration)
|
server.timing("#{prefix}.#{label}", duration)
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
@logger.log('s', "[!] Failure updating timing #{prefix}.#{label} on statsd server [#{server}:#{port}]: #{e}")
|
@logger.log('s', "[!] Failure updating timing #{prefix}.#{label} on statsd server [#{server}:#{port}]: #{e}")
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -108,7 +108,7 @@ module Vmpooler
|
||||||
$logger.log('d', "[!] [#{pool}] '#{vm}' no longer exists. Removing from pending.")
|
$logger.log('d', "[!] [#{pool}] '#{vm}' no longer exists. Removing from pending.")
|
||||||
end
|
end
|
||||||
|
|
||||||
def fail_pending_vm(vm, pool, timeout, redis, exists = true)
|
def fail_pending_vm(vm, pool, timeout, redis, exists: true)
|
||||||
clone_stamp = redis.hget("vmpooler__vm__#{vm}", 'clone')
|
clone_stamp = redis.hget("vmpooler__vm__#{vm}", 'clone')
|
||||||
|
|
||||||
time_since_clone = (Time.now - Time.parse(clone_stamp)) / 60
|
time_since_clone = (Time.now - Time.parse(clone_stamp)) / 60
|
||||||
|
|
@ -117,7 +117,7 @@ module Vmpooler
|
||||||
request_id = redis.hget("vmpooler__vm__#{vm}", 'request_id')
|
request_id = redis.hget("vmpooler__vm__#{vm}", 'request_id')
|
||||||
pool_alias = redis.hget("vmpooler__vm__#{vm}", 'pool_alias') if request_id
|
pool_alias = redis.hget("vmpooler__vm__#{vm}", 'pool_alias') if request_id
|
||||||
redis.multi
|
redis.multi
|
||||||
redis.smove('vmpooler__pending__' + pool, 'vmpooler__completed__' + pool, vm)
|
redis.smove("vmpooler__pending__#{pool}", "vmpooler__completed__#{pool}", vm)
|
||||||
redis.zadd('vmpooler__odcreate__task', 1, "#{pool_alias}:#{pool}:1:#{request_id}") if request_id
|
redis.zadd('vmpooler__odcreate__task', 1, "#{pool_alias}:#{pool}:1:#{request_id}") if request_id
|
||||||
redis.exec
|
redis.exec
|
||||||
$metrics.increment("errors.markedasfailed.#{pool}")
|
$metrics.increment("errors.markedasfailed.#{pool}")
|
||||||
|
|
@ -133,15 +133,16 @@ module Vmpooler
|
||||||
end
|
end
|
||||||
|
|
||||||
def move_pending_vm_to_ready(vm, pool, redis, request_id = nil)
|
def move_pending_vm_to_ready(vm, pool, redis, request_id = nil)
|
||||||
clone_time = redis.hget('vmpooler__vm__' + vm, 'clone')
|
clone_time = redis.hget("vmpooler__vm__#{vm}", 'clone')
|
||||||
finish = format('%<time>.2f', time: Time.now - Time.parse(clone_time))
|
finish = format('%<time>.2f', time: Time.now - Time.parse(clone_time))
|
||||||
|
|
||||||
if request_id
|
if request_id
|
||||||
ondemandrequest_hash = redis.hgetall("vmpooler__odrequest__#{request_id}")
|
ondemandrequest_hash = redis.hgetall("vmpooler__odrequest__#{request_id}")
|
||||||
if ondemandrequest_hash['status'] == 'failed'
|
case ondemandrequest_hash['status']
|
||||||
|
when 'failed'
|
||||||
move_vm_queue(pool, vm, 'pending', 'completed', redis, "moved to completed queue. '#{request_id}' could not be filled in time")
|
move_vm_queue(pool, vm, 'pending', 'completed', redis, "moved to completed queue. '#{request_id}' could not be filled in time")
|
||||||
return nil
|
return nil
|
||||||
elsif ondemandrequest_hash['status'] == 'deleted'
|
when 'deleted'
|
||||||
move_vm_queue(pool, vm, 'pending', 'completed', redis, "moved to completed queue. '#{request_id}' has been deleted")
|
move_vm_queue(pool, vm, 'pending', 'completed', redis, "moved to completed queue. '#{request_id}' has been deleted")
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
@ -160,11 +161,11 @@ module Vmpooler
|
||||||
move_vm_queue(pool, vm, 'pending', 'running', redis)
|
move_vm_queue(pool, vm, 'pending', 'running', redis)
|
||||||
check_ondemand_request_ready(request_id, redis)
|
check_ondemand_request_ready(request_id, redis)
|
||||||
else
|
else
|
||||||
redis.smove('vmpooler__pending__' + pool, 'vmpooler__ready__' + pool, vm)
|
redis.smove("vmpooler__pending__#{pool}", "vmpooler__ready__#{pool}", vm)
|
||||||
end
|
end
|
||||||
|
|
||||||
redis.pipelined do
|
redis.pipelined do
|
||||||
redis.hset('vmpooler__boot__' + Date.today.to_s, pool + ':' + vm, finish) # maybe remove as this is never used by vmpooler itself?
|
redis.hset("vmpooler__boot__#{Date.today}", "#{pool}:#{vm}", finish) # maybe remove as this is never used by vmpooler itself?
|
||||||
redis.hset("vmpooler__vm__#{vm}", 'ready', Time.now)
|
redis.hset("vmpooler__vm__#{vm}", 'ready', Time.now)
|
||||||
|
|
||||||
# last boot time is displayed in API, and used by alarming script
|
# last boot time is displayed in API, and used by alarming script
|
||||||
|
|
@ -203,11 +204,11 @@ module Vmpooler
|
||||||
|
|
||||||
mutex.synchronize do
|
mutex.synchronize do
|
||||||
@redis.with_metrics do |redis|
|
@redis.with_metrics do |redis|
|
||||||
check_stamp = redis.hget('vmpooler__vm__' + vm, 'check')
|
check_stamp = redis.hget("vmpooler__vm__#{vm}", 'check')
|
||||||
last_checked_too_soon = ((Time.now - Time.parse(check_stamp)).to_i < $config[:config]['vm_checktime'] * 60) if check_stamp
|
last_checked_too_soon = ((Time.now - Time.parse(check_stamp)).to_i < $config[:config]['vm_checktime'] * 60) if check_stamp
|
||||||
break if check_stamp && last_checked_too_soon
|
break if check_stamp && last_checked_too_soon
|
||||||
|
|
||||||
redis.hset('vmpooler__vm__' + vm, 'check', Time.now)
|
redis.hset("vmpooler__vm__#{vm}", 'check', Time.now)
|
||||||
# Check if the hosts TTL has expired
|
# Check if the hosts TTL has expired
|
||||||
# if 'boottime' is nil, set bootime to beginning of unix epoch, forces TTL to be assumed expired
|
# if 'boottime' is nil, set bootime to beginning of unix epoch, forces TTL to be assumed expired
|
||||||
boottime = redis.hget("vmpooler__vm__#{vm}", 'ready')
|
boottime = redis.hget("vmpooler__vm__#{vm}", 'ready')
|
||||||
|
|
@ -217,7 +218,7 @@ module Vmpooler
|
||||||
boottime = Time.at(0)
|
boottime = Time.at(0)
|
||||||
end
|
end
|
||||||
if (Time.now - boottime).to_i > ttl * 60
|
if (Time.now - boottime).to_i > ttl * 60
|
||||||
redis.smove('vmpooler__ready__' + pool_name, 'vmpooler__completed__' + pool_name, vm)
|
redis.smove("vmpooler__ready__#{pool_name}", "vmpooler__completed__#{pool_name}", vm)
|
||||||
|
|
||||||
$logger.log('d', "[!] [#{pool_name}] '#{vm}' reached end of TTL after #{ttl} minutes, removed from 'ready' queue")
|
$logger.log('d', "[!] [#{pool_name}] '#{vm}' reached end of TTL after #{ttl} minutes, removed from 'ready' queue")
|
||||||
return nil
|
return nil
|
||||||
|
|
@ -256,7 +257,7 @@ module Vmpooler
|
||||||
return if hostname.empty?
|
return if hostname.empty?
|
||||||
return if hostname == vm
|
return if hostname == vm
|
||||||
|
|
||||||
redis.smove('vmpooler__ready__' + pool_name, 'vmpooler__completed__' + pool_name, vm)
|
redis.smove("vmpooler__ready__#{pool_name}", "vmpooler__completed__#{pool_name}", vm)
|
||||||
$logger.log('d', "[!] [#{pool_name}] '#{vm}' has mismatched hostname #{hostname}, removed from 'ready' queue")
|
$logger.log('d', "[!] [#{pool_name}] '#{vm}' has mismatched hostname #{hostname}, removed from 'ready' queue")
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
@ -280,7 +281,7 @@ module Vmpooler
|
||||||
catch :stop_checking do
|
catch :stop_checking do
|
||||||
@redis.with_metrics do |redis|
|
@redis.with_metrics do |redis|
|
||||||
# Check that VM is within defined lifetime
|
# Check that VM is within defined lifetime
|
||||||
checkouttime = redis.hget('vmpooler__active__' + pool, vm)
|
checkouttime = redis.hget("vmpooler__active__#{pool}", vm)
|
||||||
if checkouttime
|
if checkouttime
|
||||||
time_since_checkout = Time.now - Time.parse(checkouttime)
|
time_since_checkout = Time.now - Time.parse(checkouttime)
|
||||||
running = time_since_checkout / 60 / 60
|
running = time_since_checkout / 60 / 60
|
||||||
|
|
@ -341,7 +342,7 @@ module Vmpooler
|
||||||
adjective = @name_generator.adjective(max: 14 - noun.length)
|
adjective = @name_generator.adjective(max: 14 - noun.length)
|
||||||
random_name = [adjective, noun].join('-')
|
random_name = [adjective, noun].join('-')
|
||||||
hostname = $config[:config]['prefix'] + random_name
|
hostname = $config[:config]['prefix'] + random_name
|
||||||
available = redis.hlen('vmpooler__vm__' + hostname) == 0
|
available = redis.hlen("vmpooler__vm__#{hostname}") == 0
|
||||||
|
|
||||||
[hostname, available]
|
[hostname, available]
|
||||||
end
|
end
|
||||||
|
|
@ -395,12 +396,12 @@ module Vmpooler
|
||||||
@redis.with_metrics do |redis|
|
@redis.with_metrics do |redis|
|
||||||
# Add VM to Redis inventory ('pending' pool)
|
# Add VM to Redis inventory ('pending' pool)
|
||||||
redis.multi
|
redis.multi
|
||||||
redis.sadd('vmpooler__pending__' + pool_name, new_vmname)
|
redis.sadd("vmpooler__pending__#{pool_name}", new_vmname)
|
||||||
redis.hset('vmpooler__vm__' + new_vmname, 'clone', Time.now)
|
redis.hset("vmpooler__vm__#{new_vmname}", 'clone', Time.now)
|
||||||
redis.hset('vmpooler__vm__' + new_vmname, 'template', pool_name) # This value is used to represent the pool.
|
redis.hset("vmpooler__vm__#{new_vmname}", 'template', pool_name) # This value is used to represent the pool.
|
||||||
redis.hset('vmpooler__vm__' + new_vmname, 'pool', pool_name)
|
redis.hset("vmpooler__vm__#{new_vmname}", 'pool', pool_name)
|
||||||
redis.hset('vmpooler__vm__' + new_vmname, 'request_id', request_id) if request_id
|
redis.hset("vmpooler__vm__#{new_vmname}", 'request_id', request_id) if request_id
|
||||||
redis.hset('vmpooler__vm__' + new_vmname, 'pool_alias', pool_alias) if pool_alias
|
redis.hset("vmpooler__vm__#{new_vmname}", 'pool_alias', pool_alias) if pool_alias
|
||||||
redis.exec
|
redis.exec
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -412,8 +413,8 @@ module Vmpooler
|
||||||
|
|
||||||
@redis.with_metrics do |redis|
|
@redis.with_metrics do |redis|
|
||||||
redis.pipelined do
|
redis.pipelined do
|
||||||
redis.hset('vmpooler__clone__' + Date.today.to_s, pool_name + ':' + new_vmname, finish)
|
redis.hset("vmpooler__clone__#{Date.today}", "#{pool_name}:#{new_vmname}", finish)
|
||||||
redis.hset('vmpooler__vm__' + new_vmname, 'clone_time', finish)
|
redis.hset("vmpooler__vm__#{new_vmname}", 'clone_time', finish)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
$logger.log('s', "[+] [#{pool_name}] '#{new_vmname}' cloned in #{finish} seconds")
|
$logger.log('s', "[+] [#{pool_name}] '#{new_vmname}' cloned in #{finish} seconds")
|
||||||
|
|
@ -456,18 +457,18 @@ module Vmpooler
|
||||||
mutex.synchronize do
|
mutex.synchronize do
|
||||||
@redis.with_metrics do |redis|
|
@redis.with_metrics do |redis|
|
||||||
redis.pipelined do
|
redis.pipelined do
|
||||||
redis.hdel('vmpooler__active__' + pool, vm)
|
redis.hdel("vmpooler__active__#{pool}", vm)
|
||||||
redis.hset('vmpooler__vm__' + vm, 'destroy', Time.now)
|
redis.hset("vmpooler__vm__#{vm}", 'destroy', Time.now)
|
||||||
|
|
||||||
# Auto-expire metadata key
|
# Auto-expire metadata key
|
||||||
redis.expire('vmpooler__vm__' + vm, ($config[:redis]['data_ttl'].to_i * 60 * 60))
|
redis.expire("vmpooler__vm__#{vm}", ($config[:redis]['data_ttl'].to_i * 60 * 60))
|
||||||
end
|
end
|
||||||
|
|
||||||
start = Time.now
|
start = Time.now
|
||||||
|
|
||||||
provider.destroy_vm(pool, vm)
|
provider.destroy_vm(pool, vm)
|
||||||
|
|
||||||
redis.srem('vmpooler__completed__' + pool, vm)
|
redis.srem("vmpooler__completed__#{pool}", vm)
|
||||||
|
|
||||||
finish = format('%<time>.2f', time: Time.now - start)
|
finish = format('%<time>.2f', time: Time.now - start)
|
||||||
$logger.log('s', "[-] [#{pool}] '#{vm}' destroyed in #{finish} seconds")
|
$logger.log('s', "[-] [#{pool}] '#{vm}' destroyed in #{finish} seconds")
|
||||||
|
|
@ -603,10 +604,10 @@ module Vmpooler
|
||||||
|
|
||||||
if result
|
if result
|
||||||
@redis.with_metrics do |redis|
|
@redis.with_metrics do |redis|
|
||||||
rdisks = redis.hget('vmpooler__vm__' + vm_name, 'disk')
|
rdisks = redis.hget("vmpooler__vm__#{vm_name}", 'disk')
|
||||||
disks = rdisks ? rdisks.split(':') : []
|
disks = rdisks ? rdisks.split(':') : []
|
||||||
disks.push("+#{disk_size}gb")
|
disks.push("+#{disk_size}gb")
|
||||||
redis.hset('vmpooler__vm__' + vm_name, 'disk', disks.join(':'))
|
redis.hset("vmpooler__vm__#{vm_name}", 'disk', disks.join(':'))
|
||||||
end
|
end
|
||||||
|
|
||||||
$logger.log('s', "[+] [disk_manager] '#{vm_name}' attached #{disk_size}gb disk in #{finish} seconds")
|
$logger.log('s', "[+] [disk_manager] '#{vm_name}' attached #{disk_size}gb disk in #{finish} seconds")
|
||||||
|
|
@ -638,7 +639,7 @@ module Vmpooler
|
||||||
|
|
||||||
if result
|
if result
|
||||||
@redis.with_metrics do |redis|
|
@redis.with_metrics do |redis|
|
||||||
redis.hset('vmpooler__vm__' + vm_name, 'snapshot:' + snapshot_name, Time.now.to_s)
|
redis.hset("vmpooler__vm__#{vm_name}", "snapshot:#{snapshot_name}", Time.now.to_s)
|
||||||
end
|
end
|
||||||
$logger.log('s', "[+] [snapshot_manager] '#{vm_name}' snapshot created in #{finish} seconds")
|
$logger.log('s', "[+] [snapshot_manager] '#{vm_name}' snapshot created in #{finish} seconds")
|
||||||
else
|
else
|
||||||
|
|
@ -697,7 +698,7 @@ module Vmpooler
|
||||||
|
|
||||||
def get_pool_name_for_vm(vm_name, redis)
|
def get_pool_name_for_vm(vm_name, redis)
|
||||||
# the 'template' is a bad name. Should really be 'poolname'
|
# the 'template' is a bad name. Should really be 'poolname'
|
||||||
redis.hget('vmpooler__vm__' + vm_name, 'template')
|
redis.hget("vmpooler__vm__#{vm_name}", 'template')
|
||||||
end
|
end
|
||||||
|
|
||||||
# @param pool_name [String] - the name of the pool
|
# @param pool_name [String] - the name of the pool
|
||||||
|
|
@ -867,16 +868,12 @@ module Vmpooler
|
||||||
|
|
||||||
if options[:clone_target_change]
|
if options[:clone_target_change]
|
||||||
clone_target = redis.hget('vmpooler__config__clone_target}', options[:poolname])
|
clone_target = redis.hget('vmpooler__config__clone_target}', options[:poolname])
|
||||||
if clone_target
|
break if clone_target && !clone_target == initial_clone_target
|
||||||
break unless clone_target == initial_clone_target
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if options[:pool_template_change]
|
if options[:pool_template_change]
|
||||||
configured_template = redis.hget('vmpooler__config__template', options[:poolname])
|
configured_template = redis.hget('vmpooler__config__template', options[:poolname])
|
||||||
if configured_template
|
break if configured_template && initial_template != configured_template
|
||||||
break unless initial_template == configured_template
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if options[:pool_reset]
|
if options[:pool_reset]
|
||||||
|
|
@ -970,15 +967,12 @@ module Vmpooler
|
||||||
def sync_pool_template(pool)
|
def sync_pool_template(pool)
|
||||||
@redis.with_metrics do |redis|
|
@redis.with_metrics do |redis|
|
||||||
pool_template = redis.hget('vmpooler__config__template', pool['name'])
|
pool_template = redis.hget('vmpooler__config__template', pool['name'])
|
||||||
if pool_template
|
pool['template'] = pool_template if pool_template && pool['template'] != pool_template
|
||||||
pool['template'] = pool_template unless pool['template'] == pool_template
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def prepare_template(pool, provider, redis)
|
def prepare_template(pool, provider, redis)
|
||||||
if $config[:config]['create_template_delta_disks']
|
if $config[:config]['create_template_delta_disks'] && !redis.sismember('vmpooler__template__deltas', pool['template'])
|
||||||
unless redis.sismember('vmpooler__template__deltas', pool['template'])
|
|
||||||
begin
|
begin
|
||||||
provider.create_template_delta_disks(pool)
|
provider.create_template_delta_disks(pool)
|
||||||
redis.sadd('vmpooler__template__deltas', pool['template'])
|
redis.sadd('vmpooler__template__deltas', pool['template'])
|
||||||
|
|
@ -986,7 +980,6 @@ module Vmpooler
|
||||||
$logger.log('s', "[!] [#{pool['name']}] failed while preparing a template with an error. As a result vmpooler could not create the template delta disks. Either a template delta disk already exists, or the template delta disk creation failed. The error is: #{e}")
|
$logger.log('s', "[!] [#{pool['name']}] failed while preparing a template with an error. As a result vmpooler could not create the template delta disks. Either a template delta disk already exists, or the template delta disk creation failed. The error is: #{e}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
redis.hset('vmpooler__template__prepared', pool['name'], pool['template'])
|
redis.hset('vmpooler__template__prepared', pool['name'], pool['template'])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -1135,15 +1128,15 @@ module Vmpooler
|
||||||
mutex.synchronize do
|
mutex.synchronize do
|
||||||
@redis.with_metrics do |redis|
|
@redis.with_metrics do |redis|
|
||||||
provider.vms_in_pool(pool['name']).each do |vm|
|
provider.vms_in_pool(pool['name']).each do |vm|
|
||||||
if !redis.sismember('vmpooler__running__' + pool['name'], vm['name']) &&
|
if !redis.sismember("vmpooler__running__#{pool['name']}", vm['name']) &&
|
||||||
!redis.sismember('vmpooler__ready__' + pool['name'], vm['name']) &&
|
!redis.sismember("vmpooler__ready__#{pool['name']}", vm['name']) &&
|
||||||
!redis.sismember('vmpooler__pending__' + pool['name'], vm['name']) &&
|
!redis.sismember("vmpooler__pending__#{pool['name']}", vm['name']) &&
|
||||||
!redis.sismember('vmpooler__completed__' + pool['name'], vm['name']) &&
|
!redis.sismember("vmpooler__completed__#{pool['name']}", vm['name']) &&
|
||||||
!redis.sismember('vmpooler__discovered__' + pool['name'], vm['name']) &&
|
!redis.sismember("vmpooler__discovered__#{pool['name']}", vm['name']) &&
|
||||||
!redis.sismember('vmpooler__migrating__' + pool['name'], vm['name'])
|
!redis.sismember("vmpooler__migrating__#{pool['name']}", vm['name'])
|
||||||
|
|
||||||
pool_check_response[:discovered_vms] += 1
|
pool_check_response[:discovered_vms] += 1
|
||||||
redis.sadd('vmpooler__discovered__' + pool['name'], vm['name'])
|
redis.sadd("vmpooler__discovered__#{pool['name']}", vm['name'])
|
||||||
|
|
||||||
$logger.log('s', "[?] [#{pool['name']}] '#{vm['name']}' added to 'discovered' queue")
|
$logger.log('s', "[?] [#{pool['name']}] '#{vm['name']}' added to 'discovered' queue")
|
||||||
end
|
end
|
||||||
|
|
@ -1164,7 +1157,7 @@ module Vmpooler
|
||||||
redis.smembers("vmpooler__running__#{pool_name}").each do |vm|
|
redis.smembers("vmpooler__running__#{pool_name}").each do |vm|
|
||||||
if inventory[vm]
|
if inventory[vm]
|
||||||
begin
|
begin
|
||||||
vm_lifetime = redis.hget('vmpooler__vm__' + vm, 'lifetime') || $config[:config]['vm_lifetime'] || 12
|
vm_lifetime = redis.hget("vmpooler__vm__#{vm}", 'lifetime') || $config[:config]['vm_lifetime'] || 12
|
||||||
pool_check_response[:checked_running_vms] += 1
|
pool_check_response[:checked_running_vms] += 1
|
||||||
check_running_vm(vm, pool_name, vm_lifetime, provider)
|
check_running_vm(vm, pool_name, vm_lifetime, provider)
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
|
|
@ -1206,7 +1199,7 @@ module Vmpooler
|
||||||
$logger.log('d', "[!] [#{pool_name}] _check_pool failed with an error while evaluating pending VMs: #{e}")
|
$logger.log('d', "[!] [#{pool_name}] _check_pool failed with an error while evaluating pending VMs: #{e}")
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
fail_pending_vm(vm, pool_name, pool_timeout, redis, false)
|
fail_pending_vm(vm, pool_name, pool_timeout, redis, exists: false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@ module Vmpooler
|
||||||
return current_vm['vm_host'] if rand(1..100) > provider_config['migratevm_couldmove_percent']
|
return current_vm['vm_host'] if rand(1..100) > provider_config['migratevm_couldmove_percent']
|
||||||
|
|
||||||
# Simulate a 10 node cluster and randomly pick a different one
|
# Simulate a 10 node cluster and randomly pick a different one
|
||||||
new_host = 'HOST' + rand(1..10).to_s while new_host == current_vm['vm_host']
|
new_host = "HOST#{rand(1..10)}" while new_host == current_vm['vm_host']
|
||||||
|
|
||||||
new_host
|
new_host
|
||||||
end
|
end
|
||||||
|
|
@ -95,9 +95,7 @@ module Vmpooler
|
||||||
end
|
end
|
||||||
|
|
||||||
# Inject clone failure
|
# Inject clone failure
|
||||||
unless provider_config['migratevm_fail_percent'].nil?
|
raise('Dummy Failure for migratevm_fail_percent') if !provider_config['migratevm_fail_percent'].nil? && rand(1..100) <= provider_config['migratevm_fail_percent']
|
||||||
raise('Dummy Failure for migratevm_fail_percent') if rand(1..100) <= provider_config['migratevm_fail_percent']
|
|
||||||
end
|
|
||||||
|
|
||||||
@write_lock.synchronize do
|
@write_lock.synchronize do
|
||||||
current_vm = get_dummy_vm(pool_name, vm_name)
|
current_vm = get_dummy_vm(pool_name, vm_name)
|
||||||
|
|
@ -116,8 +114,7 @@ module Vmpooler
|
||||||
return nil if dummy.nil?
|
return nil if dummy.nil?
|
||||||
|
|
||||||
# Randomly power off the VM
|
# Randomly power off the VM
|
||||||
unless dummy['powerstate'] != 'PoweredOn' || provider_config['getvm_poweroff_percent'].nil?
|
if !(dummy['powerstate'] != 'PoweredOn' || provider_config['getvm_poweroff_percent'].nil?) && rand(1..100) <= provider_config['getvm_poweroff_percent']
|
||||||
if rand(1..100) <= provider_config['getvm_poweroff_percent']
|
|
||||||
@write_lock.synchronize do
|
@write_lock.synchronize do
|
||||||
dummy = get_dummy_vm(pool_name, vm_name)
|
dummy = get_dummy_vm(pool_name, vm_name)
|
||||||
dummy['powerstate'] = 'PoweredOff'
|
dummy['powerstate'] = 'PoweredOff'
|
||||||
|
|
@ -125,19 +122,16 @@ module Vmpooler
|
||||||
end
|
end
|
||||||
logger.log('d', "[ ] [#{dummy['poolname']}] '#{dummy['name']}' is being Dummy Powered Off")
|
logger.log('d', "[ ] [#{dummy['poolname']}] '#{dummy['name']}' is being Dummy Powered Off")
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
# Randomly rename the host
|
# Randomly rename the host
|
||||||
unless dummy['hostname'] != dummy['name'] || provider_config['getvm_rename_percent'].nil?
|
if !(dummy['hostname'] != dummy['name'] || provider_config['getvm_rename_percent'].nil?) && rand(1..100) <= provider_config['getvm_rename_percent']
|
||||||
if rand(1..100) <= provider_config['getvm_rename_percent']
|
|
||||||
@write_lock.synchronize do
|
@write_lock.synchronize do
|
||||||
dummy = get_dummy_vm(pool_name, vm_name)
|
dummy = get_dummy_vm(pool_name, vm_name)
|
||||||
dummy['hostname'] = 'DUMMY' + dummy['name']
|
dummy['hostname'] = "DUMMY#{dummy['name']}"
|
||||||
write_backing_file
|
write_backing_file
|
||||||
end
|
end
|
||||||
logger.log('d', "[ ] [#{dummy['poolname']}] '#{dummy['name']}' is being Dummy renamed")
|
logger.log('d', "[ ] [#{dummy['poolname']}] '#{dummy['name']}' is being Dummy renamed")
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
obj['name'] = dummy['name']
|
obj['name'] = dummy['name']
|
||||||
obj['hostname'] = dummy['hostname']
|
obj['hostname'] = dummy['hostname']
|
||||||
|
|
@ -196,9 +190,7 @@ module Vmpooler
|
||||||
|
|
||||||
begin
|
begin
|
||||||
# Inject clone failure
|
# Inject clone failure
|
||||||
unless provider_config['createvm_fail_percent'].nil?
|
raise('Dummy Failure for createvm_fail_percent') if !provider_config['createvm_fail_percent'].nil? && rand(1..100) <= provider_config['createvm_fail_percent']
|
||||||
raise('Dummy Failure for createvm_fail_percent') if rand(1..100) <= provider_config['createvm_fail_percent']
|
|
||||||
end
|
|
||||||
|
|
||||||
# Assert the VM is ready for use
|
# Assert the VM is ready for use
|
||||||
@write_lock.synchronize do
|
@write_lock.synchronize do
|
||||||
|
|
@ -229,9 +221,7 @@ module Vmpooler
|
||||||
end
|
end
|
||||||
|
|
||||||
# Inject create failure
|
# Inject create failure
|
||||||
unless provider_config['createdisk_fail_percent'].nil?
|
raise('Dummy Failure for createdisk_fail_percent') if !provider_config['createdisk_fail_percent'].nil? && rand(1..100) <= provider_config['createdisk_fail_percent']
|
||||||
raise('Dummy Failure for createdisk_fail_percent') if rand(1..100) <= provider_config['createdisk_fail_percent']
|
|
||||||
end
|
|
||||||
|
|
||||||
@write_lock.synchronize do
|
@write_lock.synchronize do
|
||||||
vm_object = get_dummy_vm(pool_name, vm_name)
|
vm_object = get_dummy_vm(pool_name, vm_name)
|
||||||
|
|
@ -255,9 +245,7 @@ module Vmpooler
|
||||||
end
|
end
|
||||||
|
|
||||||
# Inject create failure
|
# Inject create failure
|
||||||
unless provider_config['createsnapshot_fail_percent'].nil?
|
raise('Dummy Failure for createsnapshot_fail_percent') if !provider_config['createsnapshot_fail_percent'].nil? && rand(1..100) <= provider_config['createsnapshot_fail_percent']
|
||||||
raise('Dummy Failure for createsnapshot_fail_percent') if rand(1..100) <= provider_config['createsnapshot_fail_percent']
|
|
||||||
end
|
|
||||||
|
|
||||||
@write_lock.synchronize do
|
@write_lock.synchronize do
|
||||||
vm_object = get_dummy_vm(pool_name, vm_name)
|
vm_object = get_dummy_vm(pool_name, vm_name)
|
||||||
|
|
@ -282,9 +270,7 @@ module Vmpooler
|
||||||
end
|
end
|
||||||
|
|
||||||
# Inject create failure
|
# Inject create failure
|
||||||
unless provider_config['revertsnapshot_fail_percent'].nil?
|
raise('Dummy Failure for revertsnapshot_fail_percent') if !provider_config['revertsnapshot_fail_percent'].nil? && rand(1..100) <= provider_config['revertsnapshot_fail_percent']
|
||||||
raise('Dummy Failure for revertsnapshot_fail_percent') if rand(1..100) <= provider_config['revertsnapshot_fail_percent']
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
vm_object['snapshots'].include?(snapshot_name)
|
vm_object['snapshots'].include?(snapshot_name)
|
||||||
|
|
@ -320,9 +306,7 @@ module Vmpooler
|
||||||
end
|
end
|
||||||
|
|
||||||
# Inject destroy VM failure
|
# Inject destroy VM failure
|
||||||
unless provider_config['destroyvm_fail_percent'].nil?
|
raise('Dummy Failure for migratevm_fail_percent') if !provider_config['destroyvm_fail_percent'].nil? && rand(1..100) <= provider_config['destroyvm_fail_percent']
|
||||||
raise('Dummy Failure for migratevm_fail_percent') if rand(1..100) <= provider_config['destroyvm_fail_percent']
|
|
||||||
end
|
|
||||||
|
|
||||||
# 'Destroy' the VM
|
# 'Destroy' the VM
|
||||||
@write_lock.synchronize do
|
@write_lock.synchronize do
|
||||||
|
|
@ -354,9 +338,7 @@ module Vmpooler
|
||||||
# it's ready to receive a connection
|
# it's ready to receive a connection
|
||||||
sleep(2)
|
sleep(2)
|
||||||
|
|
||||||
unless provider_config['vmready_fail_percent'].nil?
|
raise('Dummy Failure for vmready_fail_percent') if !provider_config['vmready_fail_percent'].nil? && rand(1..100) <= provider_config['vmready_fail_percent']
|
||||||
raise('Dummy Failure for vmready_fail_percent') if rand(1..100) <= provider_config['vmready_fail_percent']
|
|
||||||
end
|
|
||||||
|
|
||||||
@write_lock.synchronize do
|
@write_lock.synchronize do
|
||||||
vm_object['ready'] = true
|
vm_object['ready'] = true
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require 'vmpooler/providers/base'
|
require 'vmpooler/providers/base'
|
||||||
|
require 'bigdecimal'
|
||||||
|
require 'bigdecimal/util'
|
||||||
|
|
||||||
module Vmpooler
|
module Vmpooler
|
||||||
class PoolManager
|
class PoolManager
|
||||||
|
|
@ -49,9 +51,7 @@ module Vmpooler
|
||||||
end
|
end
|
||||||
|
|
||||||
def folder_configured?(folder_title, base_folder, configured_folders, whitelist)
|
def folder_configured?(folder_title, base_folder, configured_folders, whitelist)
|
||||||
if whitelist
|
return true if whitelist&.include?(folder_title)
|
||||||
return true if whitelist.include?(folder_title)
|
|
||||||
end
|
|
||||||
return false unless configured_folders.keys.include?(folder_title)
|
return false unless configured_folders.keys.include?(folder_title)
|
||||||
return false unless configured_folders[folder_title] == base_folder
|
return false unless configured_folders[folder_title] == base_folder
|
||||||
|
|
||||||
|
|
@ -68,7 +68,7 @@ module Vmpooler
|
||||||
redis.hset("vmpooler__vm__#{vm_name}", 'destroy', Time.now)
|
redis.hset("vmpooler__vm__#{vm_name}", 'destroy', Time.now)
|
||||||
|
|
||||||
# Auto-expire metadata key
|
# Auto-expire metadata key
|
||||||
redis.expire('vmpooler__vm__' + vm_name, (data_ttl * 60 * 60))
|
redis.expire("vmpooler__vm__#{vm_name}", (data_ttl * 60 * 60))
|
||||||
redis.exec
|
redis.exec
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -203,9 +203,7 @@ module Vmpooler
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
wait_for_host_selection(dc, target, loop_delay, max_age) if target[dc].key?('checking')
|
wait_for_host_selection(dc, target, loop_delay, max_age) if target[dc].key?('checking')
|
||||||
if target[dc].key?('check_time_finished')
|
select_target_hosts(target, cluster, datacenter) if target[dc].key?('check_time_finished') && now - target[dc]['check_time_finished'] > max_age
|
||||||
select_target_hosts(target, cluster, datacenter) if now - target[dc]['check_time_finished'] > max_age
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def wait_for_host_selection(dc, target, maxloop = 0, loop_delay = 1, max_age = 60)
|
def wait_for_host_selection(dc, target, maxloop = 0, loop_delay = 1, max_age = 60)
|
||||||
|
|
@ -418,15 +416,15 @@ module Vmpooler
|
||||||
# Determine network device type
|
# Determine network device type
|
||||||
# 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
|
# 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
|
||||||
network_device =
|
network_device =
|
||||||
if template_vm_network_device.is_a? RbVmomi::VIM::VirtualVmxnet2
|
if template_vm_network_device.instance_of? RbVmomi::VIM::VirtualVmxnet2
|
||||||
RbVmomi::VIM.VirtualVmxnet2
|
RbVmomi::VIM.VirtualVmxnet2
|
||||||
elsif template_vm_network_device.is_a? RbVmomi::VIM::VirtualVmxnet3
|
elsif template_vm_network_device.instance_of? RbVmomi::VIM::VirtualVmxnet3
|
||||||
RbVmomi::VIM.VirtualVmxnet3
|
RbVmomi::VIM.VirtualVmxnet3
|
||||||
elsif template_vm_network_device.is_a? RbVmomi::VIM::VirtualE1000
|
elsif template_vm_network_device.instance_of? RbVmomi::VIM::VirtualE1000
|
||||||
RbVmomi::VIM.VirtualE1000
|
RbVmomi::VIM.VirtualE1000
|
||||||
elsif template_vm_network_device.is_a? RbVmomi::VIM::VirtualE1000e
|
elsif template_vm_network_device.instance_of? RbVmomi::VIM::VirtualE1000e
|
||||||
RbVmomi::VIM.VirtualE1000e
|
RbVmomi::VIM.VirtualE1000e
|
||||||
elsif template_vm_network_device.is_a? RbVmomi::VIM::VirtualSriovEthernetCard
|
elsif template_vm_network_device.instance_of? RbVmomi::VIM::VirtualSriovEthernetCard
|
||||||
RbVmomi::VIM.VirtualSriovEthernetCard
|
RbVmomi::VIM.VirtualSriovEthernetCard
|
||||||
else
|
else
|
||||||
RbVmomi::VIM.VirtualPCNet32
|
RbVmomi::VIM.VirtualPCNet32
|
||||||
|
|
@ -560,7 +558,7 @@ module Vmpooler
|
||||||
boottime = vm_object.runtime.bootTime if vm_object.runtime&.bootTime
|
boottime = vm_object.runtime.bootTime if vm_object.runtime&.bootTime
|
||||||
powerstate = vm_object.runtime.powerState if vm_object.runtime&.powerState
|
powerstate = vm_object.runtime.powerState if vm_object.runtime&.powerState
|
||||||
|
|
||||||
hash = {
|
{
|
||||||
'name' => vm_object.name,
|
'name' => vm_object.name,
|
||||||
'hostname' => hostname,
|
'hostname' => hostname,
|
||||||
'template' => pool_configuration['template'],
|
'template' => pool_configuration['template'],
|
||||||
|
|
@ -568,8 +566,6 @@ module Vmpooler
|
||||||
'boottime' => boottime,
|
'boottime' => boottime,
|
||||||
'powerstate' => powerstate
|
'powerstate' => powerstate
|
||||||
}
|
}
|
||||||
|
|
||||||
hash
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# vSphere helper methods
|
# vSphere helper methods
|
||||||
|
|
@ -794,7 +790,7 @@ module Vmpooler
|
||||||
}
|
}
|
||||||
|
|
||||||
folder_object = connection.searchIndex.FindByInventoryPath(propSpecs) # rubocop:disable Naming/VariableName
|
folder_object = connection.searchIndex.FindByInventoryPath(propSpecs) # rubocop:disable Naming/VariableName
|
||||||
return nil unless folder_object.class == RbVmomi::VIM::Folder
|
return nil unless folder_object.instance_of? RbVmomi::VIM::Folder
|
||||||
|
|
||||||
folder_object
|
folder_object
|
||||||
end
|
end
|
||||||
|
|
@ -810,9 +806,7 @@ module Vmpooler
|
||||||
# the cpu or memory utilization is bigger than the limit param
|
# the cpu or memory utilization is bigger than the limit param
|
||||||
def get_host_utilization(host, model = nil, limit = 90)
|
def get_host_utilization(host, model = nil, limit = 90)
|
||||||
limit = @config[:config]['utilization_limit'] if @config[:config].key?('utilization_limit')
|
limit = @config[:config]['utilization_limit'] if @config[:config].key?('utilization_limit')
|
||||||
if model
|
return nil if model && !host_has_cpu_model?(host, model)
|
||||||
return nil unless host_has_cpu_model?(host, model)
|
|
||||||
end
|
|
||||||
return nil if host.runtime.inMaintenanceMode
|
return nil if host.runtime.inMaintenanceMode
|
||||||
return nil unless host.overallStatus == 'green'
|
return nil unless host.overallStatus == 'green'
|
||||||
return nil unless host.configIssue.empty?
|
return nil unless host.configIssue.empty?
|
||||||
|
|
@ -821,9 +815,9 @@ module Vmpooler
|
||||||
memory_utilization = memory_utilization_for host
|
memory_utilization = memory_utilization_for host
|
||||||
|
|
||||||
return nil if cpu_utilization.nil?
|
return nil if cpu_utilization.nil?
|
||||||
return nil if cpu_utilization == 0.0
|
return nil if cpu_utilization.to_d == 0.0.to_d
|
||||||
return nil if memory_utilization.nil?
|
return nil if memory_utilization.nil?
|
||||||
return nil if memory_utilization == 0.0
|
return nil if memory_utilization.to_d == 0.0.to_d
|
||||||
|
|
||||||
return nil if cpu_utilization > limit
|
return nil if cpu_utilization > limit
|
||||||
return nil if memory_utilization > limit
|
return nil if memory_utilization > limit
|
||||||
|
|
@ -838,8 +832,7 @@ module Vmpooler
|
||||||
def get_host_cpu_arch_version(host)
|
def get_host_cpu_arch_version(host)
|
||||||
cpu_model = host.hardware.cpuPkg[0].description
|
cpu_model = host.hardware.cpuPkg[0].description
|
||||||
cpu_model_parts = cpu_model.split
|
cpu_model_parts = cpu_model.split
|
||||||
arch_version = cpu_model_parts[4]
|
cpu_model_parts[4]
|
||||||
arch_version
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def cpu_utilization_for(host)
|
def cpu_utilization_for(host)
|
||||||
|
|
@ -931,8 +924,7 @@ module Vmpooler
|
||||||
target_hosts = get_cluster_host_utilization(cluster_object)
|
target_hosts = get_cluster_host_utilization(cluster_object)
|
||||||
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?
|
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?
|
||||||
|
|
||||||
least_used_host = target_hosts.min[1]
|
target_hosts.min[1]
|
||||||
least_used_host
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def find_cluster(cluster, connection, datacentername)
|
def find_cluster(cluster, connection, datacentername)
|
||||||
|
|
@ -979,11 +971,10 @@ module Vmpooler
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_propSpecs(datacenter, folder, vmname) # rubocop:disable Naming/MethodName
|
def build_propSpecs(datacenter, folder, vmname) # rubocop:disable Naming/MethodName
|
||||||
propSpecs = { # rubocop:disable Naming/VariableName
|
{
|
||||||
entity => self,
|
entity => self,
|
||||||
:inventoryPath => "#{datacenter}/vm/#{folder}/#{vmname}"
|
:inventoryPath => "#{datacenter}/vm/#{folder}/#{vmname}"
|
||||||
}
|
}
|
||||||
propSpecs # rubocop:disable Naming/VariableName
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def find_vm(pool_name, vmname, connection)
|
def find_vm(pool_name, vmname, connection)
|
||||||
|
|
|
||||||
|
|
@ -588,7 +588,7 @@ def mock_RbVmomi_VIM_VirtualVmxnet3(options = {})
|
||||||
mock.addressType = options[:addressType]
|
mock.addressType = options[:addressType]
|
||||||
mock.connectable = options[:connectable]
|
mock.connectable = options[:connectable]
|
||||||
|
|
||||||
allow(mock).to receive(:is_a?) do |expected_type|
|
allow(mock).to receive(:instance_of?) do |expected_type|
|
||||||
expected_type == RbVmomi::VIM::VirtualVmxnet3
|
expected_type == RbVmomi::VIM::VirtualVmxnet3
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -185,7 +185,7 @@ EOT
|
||||||
it 'moves VM to completed queue if VM has exceeded timeout and exists' do
|
it 'moves VM to completed queue if VM has exceeded timeout and exists' do
|
||||||
redis_connection_pool.with do |redis|
|
redis_connection_pool.with do |redis|
|
||||||
redis.hset("vmpooler__vm__#{vm}", 'clone',Date.new(2001,1,1).to_s)
|
redis.hset("vmpooler__vm__#{vm}", 'clone',Date.new(2001,1,1).to_s)
|
||||||
expect(subject.fail_pending_vm(vm, pool, timeout, redis, true)).to eq(true)
|
expect(subject.fail_pending_vm(vm, pool, timeout, redis, exists: true)).to eq(true)
|
||||||
expect(redis.sismember("vmpooler__pending__#{pool}", vm)).to be(false)
|
expect(redis.sismember("vmpooler__pending__#{pool}", vm)).to be(false)
|
||||||
expect(redis.sismember("vmpooler__completed__#{pool}", vm)).to be(true)
|
expect(redis.sismember("vmpooler__completed__#{pool}", vm)).to be(true)
|
||||||
end
|
end
|
||||||
|
|
@ -195,7 +195,7 @@ EOT
|
||||||
redis_connection_pool.with do |redis|
|
redis_connection_pool.with do |redis|
|
||||||
redis.hset("vmpooler__vm__#{vm}", 'clone',Date.new(2001,1,1).to_s)
|
redis.hset("vmpooler__vm__#{vm}", 'clone',Date.new(2001,1,1).to_s)
|
||||||
expect(logger).to receive(:log).with('d', "[!] [#{pool}] '#{vm}' marked as 'failed' after #{timeout} minutes")
|
expect(logger).to receive(:log).with('d', "[!] [#{pool}] '#{vm}' marked as 'failed' after #{timeout} minutes")
|
||||||
expect(subject.fail_pending_vm(vm, pool, timeout, redis, true)).to eq(true)
|
expect(subject.fail_pending_vm(vm, pool, timeout, redis, exists: true)).to eq(true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -203,14 +203,14 @@ EOT
|
||||||
redis_connection_pool.with do |redis|
|
redis_connection_pool.with do |redis|
|
||||||
redis.hset("vmpooler__vm__#{vm}", 'clone',Date.new(2001,1,1).to_s)
|
redis.hset("vmpooler__vm__#{vm}", 'clone',Date.new(2001,1,1).to_s)
|
||||||
expect(subject).to receive(:remove_nonexistent_vm).with(vm, pool, redis)
|
expect(subject).to receive(:remove_nonexistent_vm).with(vm, pool, redis)
|
||||||
expect(subject.fail_pending_vm(vm, pool, timeout, redis, false)).to eq(true)
|
expect(subject.fail_pending_vm(vm, pool, timeout, redis, exists: false)).to eq(true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'swallows error if an error is raised' do
|
it 'swallows error if an error is raised' do
|
||||||
redis_connection_pool.with do |redis|
|
redis_connection_pool.with do |redis|
|
||||||
redis.hset("vmpooler__vm__#{vm}", 'clone','iamnotparsable_asdate')
|
redis.hset("vmpooler__vm__#{vm}", 'clone','iamnotparsable_asdate')
|
||||||
expect(subject.fail_pending_vm(vm, pool, timeout, redis, true)).to eq(false)
|
expect(subject.fail_pending_vm(vm, pool, timeout, redis, exists: true)).to eq(false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -219,7 +219,7 @@ EOT
|
||||||
redis.hset("vmpooler__vm__#{vm}", 'clone','iamnotparsable_asdate')
|
redis.hset("vmpooler__vm__#{vm}", 'clone','iamnotparsable_asdate')
|
||||||
expect(logger).to receive(:log).with('d', String)
|
expect(logger).to receive(:log).with('d', String)
|
||||||
|
|
||||||
subject.fail_pending_vm(vm, pool, timeout, redis, true)
|
subject.fail_pending_vm(vm, pool, timeout, redis, exists: true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -230,7 +230,7 @@ EOT
|
||||||
redis.hset("vmpooler__vm__#{vm}", 'clone',(Time.now - 900).to_s)
|
redis.hset("vmpooler__vm__#{vm}", 'clone',(Time.now - 900).to_s)
|
||||||
redis.hset("vmpooler__vm__#{vm}", 'pool_alias', pool)
|
redis.hset("vmpooler__vm__#{vm}", 'pool_alias', pool)
|
||||||
redis.hset("vmpooler__vm__#{vm}", 'request_id', request_id)
|
redis.hset("vmpooler__vm__#{vm}", 'request_id', request_id)
|
||||||
subject.fail_pending_vm(vm, pool, timeout, redis, true)
|
subject.fail_pending_vm(vm, pool, timeout, redis, exists: true)
|
||||||
expect(redis.zrange('vmpooler__odcreate__task', 0, -1)).to eq(["#{pool}:#{pool}:1:#{request_id}"])
|
expect(redis.zrange('vmpooler__odcreate__task', 0, -1)).to eq(["#{pool}:#{pool}:1:#{request_id}"])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -3950,7 +3950,7 @@ EOT
|
||||||
|
|
||||||
it 'should call fail_pending_vm' do
|
it 'should call fail_pending_vm' do
|
||||||
redis_connection_pool.with do |redis|
|
redis_connection_pool.with do |redis|
|
||||||
expect(subject).to receive(:fail_pending_vm).with(vm,pool,Integer,redis,false)
|
expect(subject).to receive(:fail_pending_vm).with(vm, pool, Integer, redis, exists: false)
|
||||||
end
|
end
|
||||||
|
|
||||||
subject.check_pending_pool_vms(pool, provider, pool_check_response, inventory, timeout)
|
subject.check_pending_pool_vms(pool, provider, pool_check_response, inventory, timeout)
|
||||||
|
|
|
||||||
|
|
@ -1585,7 +1585,7 @@ EOT
|
||||||
expect(result.location.datastore.name).to eq('datastore0')
|
expect(result.location.datastore.name).to eq('datastore0')
|
||||||
expect(result.location.diskMoveType).to eq(:moveChildMostDiskBacking)
|
expect(result.location.diskMoveType).to eq(:moveChildMostDiskBacking)
|
||||||
expect(result.config.deviceChange.first[:operation]).to eq(:edit)
|
expect(result.config.deviceChange.first[:operation]).to eq(:edit)
|
||||||
expect(result.config.deviceChange.first[:device].is_a?(RbVmomi::VIM::VirtualVmxnet3)).to be true
|
expect(result.config.deviceChange.first[:device].instance_of?(RbVmomi::VIM::VirtualVmxnet3)).to be true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -1885,7 +1885,7 @@ EOT
|
||||||
|
|
||||||
it 'should return the folder when found' do
|
it 'should return the folder when found' do
|
||||||
allow(connection.searchIndex).to receive(:FindByInventoryPath).and_return(folder_object)
|
allow(connection.searchIndex).to receive(:FindByInventoryPath).and_return(folder_object)
|
||||||
allow(folder_object).to receive(:class).and_return(RbVmomi::VIM::Folder)
|
allow(folder_object).to receive(:instance_of?).and_return(RbVmomi::VIM::Folder)
|
||||||
result = subject.find_vm_folder(poolname,connection)
|
result = subject.find_vm_folder(poolname,connection)
|
||||||
expect(result.name).to eq(foldername)
|
expect(result.name).to eq(foldername)
|
||||||
end
|
end
|
||||||
|
|
@ -1901,7 +1901,7 @@ EOT
|
||||||
|
|
||||||
it 'should return the folder when found' do
|
it 'should return the folder when found' do
|
||||||
allow(connection.searchIndex).to receive(:FindByInventoryPath).and_return(folder_object)
|
allow(connection.searchIndex).to receive(:FindByInventoryPath).and_return(folder_object)
|
||||||
allow(folder_object).to receive(:class).and_return(RbVmomi::VIM::Folder)
|
allow(folder_object).to receive(:instance_of?).and_return(RbVmomi::VIM::Folder)
|
||||||
result = subject.find_vm_folder(poolname,connection)
|
result = subject.find_vm_folder(poolname,connection)
|
||||||
expect(result.name).to eq(foldername)
|
expect(result.name).to eq(foldername)
|
||||||
end
|
end
|
||||||
|
|
@ -1918,7 +1918,7 @@ EOT
|
||||||
|
|
||||||
it 'should return the folder when found' do
|
it 'should return the folder when found' do
|
||||||
allow(connection.searchIndex).to receive(:FindByInventoryPath).and_return(folder_object)
|
allow(connection.searchIndex).to receive(:FindByInventoryPath).and_return(folder_object)
|
||||||
allow(folder_object).to receive(:class).and_return(RbVmomi::VIM::Folder)
|
allow(folder_object).to receive(:instance_of?).and_return(RbVmomi::VIM::Folder)
|
||||||
result = subject.find_vm_folder(poolname,connection)
|
result = subject.find_vm_folder(poolname,connection)
|
||||||
expect(result.name).to eq(foldername)
|
expect(result.name).to eq(foldername)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ Gem::Specification.new do |s|
|
||||||
s.add_development_dependency 'pry'
|
s.add_development_dependency 'pry'
|
||||||
s.add_development_dependency 'rack-test', '>= 0.6'
|
s.add_development_dependency 'rack-test', '>= 0.6'
|
||||||
s.add_development_dependency 'rspec', '>= 3.2'
|
s.add_development_dependency 'rspec', '>= 3.2'
|
||||||
s.add_development_dependency 'rubocop', '< 1.0'
|
s.add_development_dependency 'rubocop', '~> 1.0'
|
||||||
s.add_development_dependency 'simplecov', '>= 0.11.2'
|
s.add_development_dependency 'simplecov', '>= 0.11.2'
|
||||||
s.add_development_dependency 'yarjuf', '>= 2.0'
|
s.add_development_dependency 'yarjuf', '>= 2.0'
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue