#!/usr/bin/ruby require 'json' require 'rbvmomi' require 'redis' require 'sinatra' require 'yaml' $:.unshift(File.dirname(__FILE__)) require 'lib/logger' require 'lib/require_relative' require 'lib/vsphere_helper' logger = Logger.new vsphere_helper = VsphereHelper.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] vsphere = YAML.load_file(config_file)[:vsphere] # Connect to vSphere $vim = RbVmomi::VIM.connect( :host => vsphere['server'], :user => vsphere['username'], :password => vsphere['password'], :ssl => true, :insecure => true, :rev => '5.1' ) # Connect to Redis $redis = Redis.new # Sinatra! 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") datacenter = $vim.serviceInstance.find_datacenter base = datacenter.hostFolder # Move the VM to the specified folder and resource pool relocateSpec = RbVmomi::VIM.VirtualMachineRelocateSpec( :pool => vsphere_helper.find_pool(params[:pool]) ) vm = vsphere_helper.find_vms(vm)[vm] vm.RelocateVM_Task(:spec => relocateSpec) result[params[:template]]['ok'] = 'true' result[params[:template]]['hostname'] = vm['name'] 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