#!/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']] = {} [ '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]) result.to_json 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 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 end result.to_json 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' result.to_json end