mirror of
https://github.com/puppetlabs/vmpooler.git
synced 2026-01-26 10:08:40 -05:00
161 lines
4 KiB
Ruby
Executable file
161 lines
4 KiB
Ruby
Executable file
#!/usr/bin/ruby
|
|
|
|
require 'rubygems'
|
|
|
|
require 'json'
|
|
require 'open-uri'
|
|
require 'redis'
|
|
require 'sinatra'
|
|
require 'yaml'
|
|
|
|
$:.unshift(File.dirname(__FILE__))
|
|
require 'lib/logger'
|
|
require 'lib/require_relative'
|
|
|
|
Dir.chdir(File.dirname(__FILE__))
|
|
|
|
# Load the configuration file
|
|
config_file = File.expand_path('vmware-host-pooler.yaml')
|
|
config = YAML.load_file(config_file)
|
|
|
|
pools = config[:pools]
|
|
|
|
# Load logger library
|
|
$logger = Logger.new config[:config]['logfile']
|
|
|
|
# Connect to Redis
|
|
$redis = Redis.new
|
|
|
|
# Sinatra!
|
|
get '/' do
|
|
erb :dashboard
|
|
end
|
|
|
|
get '/dashboard/stats/vcloud/numbers' do
|
|
result = Hash.new
|
|
result['pending'] = 0
|
|
result['ready'] = 0
|
|
result['running'] = 0
|
|
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'] )
|
|
end
|
|
|
|
content_type :json
|
|
JSON.pretty_generate( result )
|
|
end
|
|
|
|
get '/dashboard/stats/vcloud/pool' do
|
|
result = Hash.new
|
|
|
|
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'] )
|
|
end
|
|
|
|
if ( params[:history] )
|
|
history ||= Hash.new
|
|
|
|
buffer = open( 'http://'+config[:config]['graphite']+'/render?target=vcloud.ready.*&from=-1hour&format=json' ).read
|
|
history = JSON.parse( buffer )
|
|
|
|
history.each do |pool|
|
|
if pool['target'] =~ /.*\.(.*)$/
|
|
pool['name'] = $1
|
|
pool['last'] = result[pool['name']]['size']
|
|
result[pool['name']]['history'] ||= Array.new
|
|
|
|
pool['datapoints'].each do |metric|
|
|
8.times do |n|
|
|
if ( metric[0] )
|
|
pool['last'] = metric[0].to_i
|
|
result[pool['name']]['history'].push( metric[0].to_i )
|
|
else
|
|
result[pool['name']]['history'].push( pool['last'] )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
content_type :json
|
|
JSON.pretty_generate( result )
|
|
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.spop('vmware_host_pool__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)
|
|
|
|
result[params[:template]]['ok'] = true
|
|
result[params[:template]]['hostname'] = vm
|
|
else
|
|
result[params[:template]]['ok'] = false
|
|
end
|
|
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
|
|
|