diff --git a/vmware-host-pooler b/vmware-host-pooler index cf766de..cc0e836 100755 --- a/vmware-host-pooler +++ b/vmware-host-pooler @@ -1,9 +1,7 @@ #!/usr/bin/ruby -require 'json' require 'rbvmomi' require 'redis' -require 'sinatra' require 'yaml' $:.unshift(File.dirname(__FILE__)) @@ -148,7 +146,6 @@ end -# Start worker threads for each defined pool pools.each do |pool| puts "Starting new worker thread for pool '#{pool['name']}'" @@ -219,78 +216,7 @@ pools.each do |pool| } end - - -# Sinatra API -get '/' do - puts '' -end - -get '/status' do - content_type :json - - result = {} - - pools.each do |pool| - result[pool['name']] = {} - result[pool['name']]['size'] = pool['size'] - [ 'pending', 'ready', 'completed' ].each do |queue| - result[pool['name']][queue] = $redis.scard("vmware_host_pool__#{queue}__#{pool['name']}") - end - end - - JSON.pretty_generate(result) -end - -get '/vm/:template' do - content_type :json - - result = {} - result[params[:template]] = {} - result[params[:template]]['hosts'] = $redis.smembers('vmware_host_pool__ready__'+params[:template]) - - JSON.pretty_generate(result) -end - -post '/vm/:template' do - content_type :json - - result = {} - result[params[:template]] = {} - - if ( ( ! params[:folder] ) or ( ! params[:pool] )) - result[params[:template]]['error'] = 'You must specify a destination \'folder\' and \'pool\'' - else - if ( $redis.scard('vmware_host_pool__ready__'+params[:template]) > 0 ) - vm = $redis.srandmember('vmware_host_pool__ready__'+params[:template]) - $redis.srem('vmware_host_pool__ready__'+params[:template], vm) - $redis.sadd('vmware_host_pool__running__'+params[:template], vm) - - logger.log('s', "[<] '#{vm}' moved to 'running' queue") - - result[params[:template]]['ok'] = true - result[params[:template]]['hostname'] = vm - else - result[params[:template]]['ok'] = false - end - end - - JSON.pretty_generate(result) -end - -delete '/vm/:hostname' do - content_type :json - - result = {} - - 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]) - end - end - - result['ok'] = true - JSON.pretty_generate(result) +loop do + sleep(1) end diff --git a/vmware-host-pooler-api b/vmware-host-pooler-api new file mode 100755 index 0000000..25e0257 --- /dev/null +++ b/vmware-host-pooler-api @@ -0,0 +1,96 @@ +#!/usr/bin/ruby + +require 'json' +require 'redis' +require 'sinatra' +require 'yaml' + +$:.unshift(File.dirname(__FILE__)) +require 'lib/logger' +require 'lib/require_relative' + +logger = Logger.new + +Dir.chdir(File.dirname(__FILE__)) + +# Load the configuration file +config_file = File.expand_path('vmware-host-pooler.yaml') + +pools = YAML.load_file(config_file)[:pools] + +# Connect to Redis +$redis = Redis.new + +# Sinatra! +get '/' do + puts '' +end + +get '/status' do + content_type :json + + result = {} + + pools.each do |pool| + result[pool['name']] = {} + result[pool['name']]['size'] = pool['size'] + [ 'pending', 'ready', 'completed' ].each do |queue| + result[pool['name']][queue] = $redis.scard("vmware_host_pool__#{queue}__#{pool['name']}") + end + end + + JSON.pretty_generate(result) +end + +get '/vm/:template' do + content_type :json + + result = {} + result[params[:template]] = {} + result[params[:template]]['hosts'] = $redis.smembers('vmware_host_pool__ready__'+params[:template]) + + JSON.pretty_generate(result) +end + +post '/vm/:template' do + content_type :json + + result = {} + result[params[:template]] = {} + + if ( ( ! params[:folder] ) or ( ! params[:pool] )) + result[params[:template]]['error'] = 'You must specify a destination \'folder\' and \'pool\'' + else + if ( $redis.scard('vmware_host_pool__ready__'+params[:template]) > 0 ) + vm = $redis.srandmember('vmware_host_pool__ready__'+params[:template]) + $redis.srem('vmware_host_pool__ready__'+params[:template], vm) + $redis.sadd('vmware_host_pool__running__'+params[:template], vm) + + logger.log('s', "[<] '#{vm}' moved to 'running' queue") + + result[params[:template]]['ok'] = true + result[params[:template]]['hostname'] = vm + else + result[params[:template]]['ok'] = false + end + end + + JSON.pretty_generate(result) +end + +delete '/vm/:hostname' do + content_type :json + + result = {} + + 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]) + end + end + + result['ok'] = true + JSON.pretty_generate(result) +end +