#!/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, locals: { site_name: config[:config]['site_name'] || 'vmware-host-pooler', } end get '/dashboard/stats/vcloud/numbers' do result = Hash.new result['pending'] = 0 result['cloning'] = 0 result['booting'] = 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 result['cloning'] = $redis.get( 'vmware_host_pool__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 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] ) if ( config[:config]['graphite'] ) history ||= Hash.new begin 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 if ( result[pool['name']] ) 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 rescue end else config[:pools].each do |pool| result[pool['name']] ||= Hash.new result[pool['name']]['history'] = [ $redis.scard( 'vmware_host_pool__ready__' + pool['name'] ) ] 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 ( $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 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]) result['ok'] = true else result['ok'] = false end end JSON.pretty_generate(result) end