diff --git a/LICENSE b/LICENSE index c589db9..a1d1454 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ - vmware-host-pooler + vmpooler Copyright (C) 2014 Scott Schneider diff --git a/lib/logger.rb b/lib/logger.rb index 4ad90db..2ec8918 100755 --- a/lib/logger.rb +++ b/lib/logger.rb @@ -2,7 +2,7 @@ require 'rubygems' unless defined?(Gem) class Logger def initialize( - f = '/var/log/vmware-host-pooler.log' + f = '/var/log/vmpooler.log' ) @file = f end diff --git a/lib/vsphere_helper.rb b/lib/vsphere_helper.rb index afb52e3..1dfa018 100755 --- a/lib/vsphere_helper.rb +++ b/lib/vsphere_helper.rb @@ -11,7 +11,7 @@ class VsphereHelper Dir.chdir(File.dirname(__FILE__)) - config_file = File.expand_path('../vmware-host-pooler.yaml') + config_file = File.expand_path('../vmpooler.yaml') vsphere = YAML.load_file(config_file)[:vsphere] @connection = RbVmomi::VIM.connect :host => vsphere['server'], diff --git a/vmware-host-pooler b/vmware-host-pooler index 234833f..96c0ffd 100755 --- a/vmware-host-pooler +++ b/vmware-host-pooler @@ -14,7 +14,7 @@ require 'lib/vsphere_helper' Dir.chdir(File.dirname(__FILE__)) # Load the configuration file -config_file = File.expand_path('vmware-host-pooler.yaml') +config_file = File.expand_path('vmpooler.yaml') $config = YAML.load_file(config_file) pools = $config[:pools] @@ -64,18 +64,18 @@ def check_pending_vm vm, pool, timeout rescue end - $redis.smove('vmware_host_pool__pending__'+pool, 'vmware_host_pool__ready__'+pool, vm) + $redis.smove('vmpooler__pending__'+pool, 'vmpooler__ready__'+pool, vm) $logger.log('s', "[>] [#{pool}] '#{vm}' moved to 'ready' queue") end else - clone_stamp = $redis.hget('vmware_host_pool__vm__'+vm, 'clone') + clone_stamp = $redis.hget('vmpooler__vm__'+vm, 'clone') if ( (clone_stamp) and (((Time.now - Time.parse(clone_stamp))/60) > timeout) ) - $redis.smove('vmware_host_pool__pending__'+pool, 'vmware_host_pool__completed__'+pool, vm) + $redis.smove('vmpooler__pending__'+pool, 'vmpooler__completed__'+pool, vm) $logger.log('d', "[!] [#{pool}] '#{vm}' marked as 'failed' after #{timeout} minutes") end @@ -93,18 +93,18 @@ def check_ready_vm vm, pool, ttl (host.runtime.powerState) and (host.runtime.powerState != 'poweredOn') ) - $redis.smove('vmware_host_pool__ready__'+pool, 'vmware_host_pool__completed__'+pool, vm) + $redis.smove('vmpooler__ready__'+pool, 'vmpooler__completed__'+pool, vm) $logger.log('d', "[!] [#{pool}] '#{vm}' appears to be powered off or dead") else if ((((Time.now - host.runtime.bootTime)/60).to_s[/^\d+\.\d{1}/].to_f) > ttl) - $redis.smove('vmware_host_pool__ready__'+pool, 'vmware_host_pool__completed__'+pool, vm) + $redis.smove('vmpooler__ready__'+pool, 'vmpooler__completed__'+pool, vm) $logger.log('d', "[!] [#{pool}] '#{vm}' reached end of TTL after #{ttl} minutes") end end else - $redis.srem('vmware_host_pool__ready__'+pool, vm) + $redis.srem('vmpooler__ready__'+pool, vm) $logger.log('s', "[!] [#{pool}] '#{vm}' not found in vCenter inventory") end @@ -120,7 +120,7 @@ def check_running_vm vm, pool, ttl (host.runtime) and (host.runtime.powerState != 'poweredOn') ) - $redis.smove('vmware_host_pool__running__'+pool, 'vmware_host_pool__completed__'+pool, vm) + $redis.smove('vmpooler__running__'+pool, 'vmpooler__completed__'+pool, vm) $logger.log('d', "[!] [#{pool}] '#{vm}' appears to be powered off or dead") else @@ -129,7 +129,7 @@ def check_running_vm vm, pool, ttl (host.runtime.bootTime) ((((Time.now - host.runtime.bootTime)/60).to_s[/^\d+\.\d{1}/].to_f) > ttl) ) - $redis.smove('vmware_host_pool__running__'+pool, 'vmware_host_pool__completed__'+pool, vm) + $redis.smove('vmpooler__running__'+pool, 'vmpooler__completed__'+pool, vm) $logger.log('d', "[!] [#{pool}] '#{vm}' reached end of TTL after #{ttl} minutes") end @@ -163,8 +163,8 @@ def clone_vm template, pool, folder, datastore vm['hostname'] = o[rand(25)]+(0...14).map{o[rand(o.length)]}.join # Add VM to Redis inventory ('pending' pool) - $redis.sadd('vmware_host_pool__pending__'+vm['template'], vm['hostname']) - $redis.hset('vmware_host_pool__vm__'+vm['hostname'], 'clone', Time.now) + $redis.sadd('vmpooler__pending__'+vm['template'], vm['hostname']) + $redis.hset('vmpooler__vm__'+vm['hostname'], 'clone', Time.now) # Annotate with creation time, origin template, etc. configSpec = RbVmomi::VIM.VirtualMachineConfigSpec( @@ -206,10 +206,10 @@ def clone_vm template, pool, folder, datastore $logger.log('s', "[+] [#{vm['template']}] '#{vm['hostname']}' cloned from '#{vm['template']}' in #{finish} seconds") rescue $logger.log('s', "[!] [#{vm['template']}] '#{vm['hostname']}' clone appears to have failed") - $redis.srem('vmware_host_pool__pending__'+vm['template'], vm['hostname']) + $redis.srem('vmpooler__pending__'+vm['template'], vm['hostname']) end - $redis.decr('vmware_host_pool__tasks__clone') + $redis.decr('vmpooler__tasks__clone') begin $graphite.log("vcloud.clone.#{vm['template']}", finish) if defined? $graphite @@ -221,9 +221,9 @@ end # Destroy a VM def destroy_vm vm, pool Thread.new { - $redis.srem('vmware_host_pool__completed__'+pool, vm) - $redis.hdel('vmware_host_pool__active__'+pool, vm) - $redis.del('vmware_host_pool__vm__'+vm) + $redis.srem('vmpooler__completed__'+pool, vm) + $redis.hdel('vmpooler__active__'+pool, vm) + $redis.del('vmpooler__vm__'+vm) host = $vsphere[pool].find_vm(vm) || $vsphere[pool].find_vm_heavy(vm)[vm] @@ -264,13 +264,13 @@ def check_pool pool base.vm.each do |vm| if ( - (! $redis.sismember('vmware_host_pool__running__'+pool['name'], vm['name'])) and - (! $redis.sismember('vmware_host_pool__ready__'+pool['name'], vm['name'])) and - (! $redis.sismember('vmware_host_pool__pending__'+pool['name'], vm['name'])) and - (! $redis.sismember('vmware_host_pool__completed__'+pool['name'], vm['name'])) and - (! $redis.sismember('vmware_host_pool__discovered__'+pool['name'], vm['name'])) + (! $redis.sismember('vmpooler__running__'+pool['name'], vm['name'])) and + (! $redis.sismember('vmpooler__ready__'+pool['name'], vm['name'])) and + (! $redis.sismember('vmpooler__pending__'+pool['name'], vm['name'])) and + (! $redis.sismember('vmpooler__completed__'+pool['name'], vm['name'])) and + (! $redis.sismember('vmpooler__discovered__'+pool['name'], vm['name'])) ) - $redis.sadd('vmware_host_pool__discovered__'+pool['name'], vm['name']) + $redis.sadd('vmpooler__discovered__'+pool['name'], vm['name']) $logger.log('s', "[?] [#{pool['name']}] '#{vm['name']}' added to 'discovered' queue") end @@ -281,7 +281,7 @@ def check_pool pool end # RUNNING - $redis.smembers('vmware_host_pool__running__'+pool['name']).each do |vm| + $redis.smembers('vmpooler__running__'+pool['name']).each do |vm| if (inventory[vm]) if (pool['running_ttl']) begin @@ -298,7 +298,7 @@ def check_pool pool end # READY - $redis.smembers('vmware_host_pool__ready__'+pool['name']).each do |vm| + $redis.smembers('vmpooler__ready__'+pool['name']).each do |vm| if (inventory[vm]) if (pool['ready_ttl']) begin @@ -310,7 +310,7 @@ def check_pool pool end # PENDING - $redis.smembers('vmware_host_pool__pending__'+pool['name']).each do |vm| + $redis.smembers('vmpooler__pending__'+pool['name']).each do |vm| pool['timeout'] ||= 15 if (inventory[vm]) @@ -322,47 +322,47 @@ def check_pool pool end # COMPLETED - $redis.smembers('vmware_host_pool__completed__'+pool['name']).each do |vm| + $redis.smembers('vmpooler__completed__'+pool['name']).each do |vm| if (inventory[vm]) begin destroy_vm(vm, pool['name']) rescue $logger.log('s', "[!] [#{pool['name']}] '#{vm}' destroy appears to have failed") - $redis.srem('vmware_host_pool__completed__'+pool['name'], vm) - $redis.hdel('vmware_host_pool__active__'+pool['name'], vm) - $redis.del('vmware_host_pool__vm__'+vm) + $redis.srem('vmpooler__completed__'+pool['name'], vm) + $redis.hdel('vmpooler__active__'+pool['name'], vm) + $redis.del('vmpooler__vm__'+vm) end else $logger.log('s', "[!] [#{pool['name']}] '#{vm}' not found in inventory, removed from 'completed' queue") - $redis.srem('vmware_host_pool__completed__'+pool['name'], vm) - $redis.hdel('vmware_host_pool__active__'+pool['name'], vm) - $redis.del('vmware_host_pool__vm__'+vm) + $redis.srem('vmpooler__completed__'+pool['name'], vm) + $redis.hdel('vmpooler__active__'+pool['name'], vm) + $redis.del('vmpooler__vm__'+vm) end end # DISCOVERED - $redis.smembers('vmware_host_pool__discovered__'+pool['name']).each do |vm| + $redis.smembers('vmpooler__discovered__'+pool['name']).each do |vm| ['pending', 'ready', 'running', 'completed'].each do |queue| - if ($redis.sismember('vmware_host_pool__'+queue+'__'+pool['name'], vm)) + if ($redis.sismember('vmpooler__'+queue+'__'+pool['name'], vm)) $logger.log('d', "[!] [#{pool['name']}] '#{vm}' found in '#{queue}', removed from 'discovered' queue") - $redis.srem('vmware_host_pool__discovered__'+pool['name'], vm) + $redis.srem('vmpooler__discovered__'+pool['name'], vm) end end - if ($redis.sismember('vmware_host_pool__discovered__'+pool['name'], vm)) - $redis.smove('vmware_host_pool__discovered__'+pool['name'], 'vmware_host_pool__completed__'+pool['name'], vm) + if ($redis.sismember('vmpooler__discovered__'+pool['name'], vm)) + $redis.smove('vmpooler__discovered__'+pool['name'], 'vmpooler__completed__'+pool['name'], vm) end end # LONG-RUNNING - $redis.smembers('vmware_host_pool__running__'+pool['name']).each do |vm| - if ($redis.hget('vmware_host_pool__active__'+pool['name'], vm)) - running = (Time.now - Time.parse($redis.hget('vmware_host_pool__active__'+pool['name'], vm)))/60/60 + $redis.smembers('vmpooler__running__'+pool['name']).each do |vm| + if ($redis.hget('vmpooler__active__'+pool['name'], vm)) + running = (Time.now - Time.parse($redis.hget('vmpooler__active__'+pool['name'], vm)))/60/60 if ( ($config[:config]['vm_lifetime'] > 0) and (running > $config[:config]['vm_lifetime']) ) - $redis.smove('vmware_host_pool__running__'+pool['name'], 'vmware_host_pool__completed__'+pool['name'], vm) + $redis.smove('vmpooler__running__'+pool['name'], 'vmpooler__completed__'+pool['name'], vm) $logger.log('d', "[!] [#{pool['name']}] '#{vm}' reached end of TTL after #{$config[:config]['vm_lifetime']} hours") end @@ -370,13 +370,13 @@ def check_pool pool end # REPOPULATE - total = $redis.scard('vmware_host_pool__ready__'+pool['name']) + - $redis.scard('vmware_host_pool__pending__'+pool['name']) + total = $redis.scard('vmpooler__ready__'+pool['name']) + + $redis.scard('vmpooler__pending__'+pool['name']) begin if (defined? $graphite) - $graphite.log('vcloud.ready.'+pool['name'], $redis.scard('vmware_host_pool__ready__'+pool['name'])) - $graphite.log('vcloud.running.'+pool['name'], $redis.scard('vmware_host_pool__running__'+pool['name'])) + $graphite.log('vcloud.ready.'+pool['name'], $redis.scard('vmpooler__ready__'+pool['name'])) + $graphite.log('vcloud.running.'+pool['name'], $redis.scard('vmpooler__running__'+pool['name'])) end rescue end @@ -384,9 +384,9 @@ def check_pool pool if (total < pool['size']) (1..(pool['size'] - total)).each { |i| - if ($redis.get('vmware_host_pool__tasks__clone').to_i < $config[:config]['task_limit']) + if ($redis.get('vmpooler__tasks__clone').to_i < $config[:config]['task_limit']) begin - $redis.incr('vmware_host_pool__tasks__clone') + $redis.incr('vmpooler__tasks__clone') clone_vm( pool['template'], @@ -396,7 +396,7 @@ def check_pool pool ) rescue $logger.log('s', "[!] [#{pool['name']}] clone appears to have failed") - $redis.decr('vmware_host_pool__tasks__clone') + $redis.decr('vmpooler__tasks__clone') end end } @@ -409,10 +409,10 @@ end -$logger.log('d', "starting vmware-host-pooler") +$logger.log('d', "starting vmpooler") # Clear out the tasks manager, as we don't know about any tasks at this point -$redis.set('vmware_host_pool__tasks__clone', 0) +$redis.set('vmpooler__tasks__clone', 0) loop do pools.each do |pool| diff --git a/vmware-host-pooler-api b/vmware-host-pooler-api index 24b7444..689f4f0 100755 --- a/vmware-host-pooler-api +++ b/vmware-host-pooler-api @@ -15,7 +15,7 @@ require 'lib/require_relative' Dir.chdir(File.dirname(__FILE__)) # Load the configuration file -config_file = File.expand_path('vmware-host-pooler.yaml') +config_file = File.expand_path('vmpooler.yaml') $config = YAML.load_file(config_file) pools = $config[:pools] @@ -34,7 +34,7 @@ $redis = Redis.new(:host => $config[:redis]['server']) # Sinatra! get '/' do erb :dashboard, locals: { - site_name: $config[:config]['site_name'] || 'vmware-host-pooler', + site_name: $config[:config]['site_name'] || 'vmpooler', } end @@ -48,13 +48,13 @@ get '/dashboard/stats/vcloud/numbers' do result['completed'] = 0 $config[:pools].each do |pool| - result['pending'] += $redis.scard( 'vmware_host_pool__pending__' + pool['name'] ) - result['ready'] += $redis.scard( 'vmware_host_pool__ready__' + pool['name'] ) - result['running'] += $redis.scard( 'vmware_host_pool__running__' + pool['name'] ) - result['completed'] += $redis.scard( 'vmware_host_pool__completed__' + pool['name'] ) + result['pending'] += $redis.scard( 'vmpooler__pending__' + pool['name'] ) + result['ready'] += $redis.scard( 'vmpooler__ready__' + pool['name'] ) + result['running'] += $redis.scard( 'vmpooler__running__' + pool['name'] ) + result['completed'] += $redis.scard( 'vmpooler__completed__' + pool['name'] ) end - result['cloning'] = $redis.get( 'vmware_host_pool__tasks__clone' ) + result['cloning'] = $redis.get( 'vmpooler__tasks__clone' ) result['booting'] = result['pending'].to_i - result['cloning'].to_i result['booting'] = 0 if result['booting'] < 0 result['total'] = result['pending'].to_i + result['ready'].to_i + result['running'].to_i + result['completed'].to_i @@ -69,7 +69,7 @@ get '/dashboard/stats/vcloud/pool' do $config[:pools].each do |pool| result[pool['name']] ||= Hash.new result[pool['name']]['size'] = pool['size'] - result[pool['name']]['ready'] = $redis.scard( 'vmware_host_pool__ready__' + pool['name'] ) + result[pool['name']]['ready'] = $redis.scard( 'vmpooler__ready__' + pool['name'] ) end if ( params[:history] ) @@ -106,7 +106,7 @@ get '/dashboard/stats/vcloud/pool' do else $config[:pools].each do |pool| result[pool['name']] ||= Hash.new - result[pool['name']]['history'] = [ $redis.scard( 'vmware_host_pool__ready__' + pool['name'] ) ] + result[pool['name']]['history'] = [ $redis.scard( 'vmpooler__ready__' + pool['name'] ) ] end end end @@ -119,7 +119,7 @@ get '/dashboard/stats/vcloud/running' do result = Hash.new $config[:pools].each do |pool| - running = $redis.scard( 'vmware_host_pool__running__' + pool['name'] ) + running = $redis.scard( 'vmpooler__running__' + pool['name'] ) pool['major'] = $1 if pool['name'] =~ /^(\w+)\-/ result[pool['major']] ||= Hash.new @@ -181,7 +181,7 @@ get '/vm/:template' do result = {} result[params[:template]] = {} - result[params[:template]]['hosts'] = $redis.smembers('vmware_host_pool__ready__'+params[:template]) + result[params[:template]]['hosts'] = $redis.smembers('vmpooler__ready__'+params[:template]) JSON.pretty_generate(result) end @@ -192,12 +192,12 @@ post '/vm/:template' do result = {} result[params[:template]] = {} - if ( $redis.scard('vmware_host_pool__ready__'+params[:template]) > 0 ) - vm = $redis.spop('vmware_host_pool__ready__'+params[:template]) + if ( $redis.scard('vmpooler__ready__'+params[:template]) > 0 ) + vm = $redis.spop('vmpooler__ready__'+params[:template]) unless (vm.nil?) - $redis.sadd('vmware_host_pool__running__'+params[:template], vm) - $redis.hset('vmware_host_pool__active__'+params[:template], vm, Time.now) + $redis.sadd('vmpooler__running__'+params[:template], vm) + $redis.hset('vmpooler__active__'+params[:template], vm, Time.now) result[params[:template]]['ok'] = true result[params[:template]]['hostname'] = vm @@ -219,9 +219,9 @@ delete '/vm/:hostname' do result['ok'] = false pools.each do |pool| - if $redis.sismember('vmware_host_pool__running__'+pool['name'], params[:hostname]) - $redis.srem('vmware_host_pool__running__'+pool['name'], params[:hostname]) - $redis.sadd('vmware_host_pool__completed__'+pool['name'], params[:hostname]) + if $redis.sismember('vmpooler__running__'+pool['name'], params[:hostname]) + $redis.srem('vmpooler__running__'+pool['name'], params[:hostname]) + $redis.sadd('vmpooler__completed__'+pool['name'], params[:hostname]) result['ok'] = true end end