Implement clone rate-limiting

This commit is contained in:
Scott Schneider 2014-01-21 16:28:41 -08:00
parent 36cc7ea3fe
commit f4caa5a3ad

View file

@ -14,20 +14,23 @@ Dir.chdir(File.dirname(__FILE__))
# Load the configuration file # Load the configuration file
config_file = File.expand_path('vmware-host-pooler.yaml') config_file = File.expand_path('vmware-host-pooler.yaml')
config = YAML.load_file(config_file) $config = YAML.load_file(config_file)
pools = config[:pools] pools = $config[:pools]
vsphere = config[:vsphere] vsphere = $config[:vsphere]
# Load logger library # Load logger library
$logger = Logger.new config[:config]['logfile'] $logger = Logger.new $config[:config]['logfile']
# Load Graphite helper library (if configured) # Load Graphite helper library (if configured)
if (defined? config[:config]['graphite']) if (defined? $config[:config]['graphite'])
require 'lib/graphite' require 'lib/graphite'
$graphite = Graphite.new config[:config]['graphite'] $graphite = Graphite.new $config[:config]['graphite']
end end
# Set some defaults
$config[:config]['task_limit'] ||= 10
# Connect to Redis # Connect to Redis
$redis = Redis.new $redis = Redis.new
@ -187,6 +190,8 @@ def clone_vm template, pool, folder, datastore
$logger.log('s', "[+] [#{vm['template']}] '#{vm['hostname']}' cloned from '#{vm['template']}' in #{finish} seconds") $logger.log('s', "[+] [#{vm['template']}] '#{vm['hostname']}' cloned from '#{vm['template']}' in #{finish} seconds")
$redis.decr('vmware_host_pool__tasks__clone')
begin begin
$graphite.log("vcloud.clone.#{vm['template']}", finish) if defined? $graphite $graphite.log("vcloud.clone.#{vm['template']}", finish) if defined? $graphite
rescue rescue
@ -227,8 +232,6 @@ end
def check_pool pool def check_pool pool
$logger.log('d', "[*] [#{pool['name']}] starting worker thread") $logger.log('d', "[*] [#{pool['name']}] starting worker thread")
$redis.del('vmware_host_pool__pending__'+pool['name'])
$threads[pool['name']] = Thread.new { $threads[pool['name']] = Thread.new {
$vsphere[pool['name']] ||= VsphereHelper.new $vsphere[pool['name']] ||= VsphereHelper.new
@ -332,14 +335,19 @@ def check_pool pool
if (total < pool['size']) if (total < pool['size'])
(1..(pool['size'] - total)).each { |i| (1..(pool['size'] - total)).each { |i|
begin
clone_vm( if ($redis.get('vmware_host_pool__tasks__clone').to_i < $config[:config]['task_limit'])
pool['template'], begin
pool['pool'], $redis.incr('vmware_host_pool__tasks__clone')
pool['folder'],
pool['datastore'] clone_vm(
) pool['template'],
rescue pool['pool'],
pool['folder'],
pool['datastore']
)
rescue
end
end end
} }
end end