mirror of
https://github.com/puppetlabs/vmpooler.git
synced 2026-01-27 10:28:41 -05:00
Revert "Revert "Merge pull request #155 from shermdog/RE-7014-cinext""
This reverts commit 0fd6fff934.
This commit is contained in:
parent
4738a0b8b9
commit
c71b2cd003
10 changed files with 207 additions and 24 deletions
|
|
@ -7,6 +7,7 @@ module Vmpooler
|
|||
require 'rbvmomi'
|
||||
require 'redis'
|
||||
require 'sinatra/base'
|
||||
require "statsd-ruby"
|
||||
require 'time'
|
||||
require 'timeout'
|
||||
require 'yaml'
|
||||
|
|
@ -57,6 +58,13 @@ module Vmpooler
|
|||
parsed_config[:graphite]['prefix'] ||= 'vmpooler'
|
||||
end
|
||||
|
||||
# statsd is an addition and my not be present in YAML configuration
|
||||
if parsed_config[:statsd]
|
||||
if parsed_config[:statsd]['server']
|
||||
parsed_config[:statsd]['prefix'] ||= 'vmpooler'
|
||||
end
|
||||
end
|
||||
|
||||
if parsed_config[:tagfilter]
|
||||
parsed_config[:tagfilter].keys.each do |tag|
|
||||
parsed_config[:tagfilter][tag] = Regexp.new(parsed_config[:tagfilter][tag])
|
||||
|
|
@ -84,6 +92,14 @@ module Vmpooler
|
|||
end
|
||||
end
|
||||
|
||||
def self.new_statsd(server, port)
|
||||
if server.nil? || server.empty?
|
||||
nil
|
||||
else
|
||||
Statsd.new server, port
|
||||
end
|
||||
end
|
||||
|
||||
def self.pools(conf)
|
||||
conf[:pools]
|
||||
end
|
||||
|
|
|
|||
|
|
@ -42,9 +42,10 @@ module Vmpooler
|
|||
use Vmpooler::API::Reroute
|
||||
use Vmpooler::API::V1
|
||||
|
||||
def configure(config, redis, environment = :production)
|
||||
def configure(config, redis, statsd, environment = :production)
|
||||
self.settings.set :config, config
|
||||
self.settings.set :redis, redis
|
||||
self.settings.set :statsd, statsd
|
||||
self.settings.set :environment, environment
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,16 @@ module Vmpooler
|
|||
Vmpooler::API.settings.redis
|
||||
end
|
||||
|
||||
def statsd
|
||||
Vmpooler::API.settings.statsd
|
||||
end
|
||||
|
||||
def statsd_prefix
|
||||
if Vmpooler::API.settings.statsd
|
||||
Vmpooler::API.settings.config[:statsd]['prefix'] ? Vmpooler::API.settings.config[:statsd]['prefix'] : 'vmpooler'
|
||||
end
|
||||
end
|
||||
|
||||
def config
|
||||
Vmpooler::API.settings.config[:config]
|
||||
end
|
||||
|
|
@ -34,13 +44,11 @@ module Vmpooler
|
|||
|
||||
def fetch_single_vm(template)
|
||||
vm = backend.spop('vmpooler__ready__' + template)
|
||||
|
||||
return [vm, template] if vm
|
||||
|
||||
aliases = Vmpooler::API.settings.config[:alias]
|
||||
if aliases && aliased_template = aliases[template]
|
||||
vm = backend.spop('vmpooler__ready__' + aliased_template)
|
||||
|
||||
return [vm, aliased_template] if vm
|
||||
end
|
||||
|
||||
|
|
@ -85,14 +93,16 @@ module Vmpooler
|
|||
failed = false
|
||||
vms = []
|
||||
|
||||
payload.each do |template, count|
|
||||
payload.each do |requested, count|
|
||||
count.to_i.times do |_i|
|
||||
vm, name = fetch_single_vm(template)
|
||||
vm, name = fetch_single_vm(requested)
|
||||
if !vm
|
||||
failed = true
|
||||
statsd.increment(statsd_prefix + '.checkout.empty.' + name, 1)
|
||||
break
|
||||
else
|
||||
vms << [ name, vm ]
|
||||
statsd.increment(statsd_prefix + '.checkout.success.' + name, 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -372,8 +382,16 @@ module Vmpooler
|
|||
|
||||
payload = JSON.parse(request.body.read)
|
||||
|
||||
if all_templates_valid?(payload)
|
||||
result = atomically_allocate_vms(payload)
|
||||
if payload
|
||||
invalid = invalid_templates(payload)
|
||||
if invalid.empty?
|
||||
result = atomically_allocate_vms(payload)
|
||||
else
|
||||
invalid.each do |bad_template|
|
||||
statsd.increment(statsd_prefix + '.checkout.invalid', bad_template)
|
||||
end
|
||||
status 404
|
||||
end
|
||||
else
|
||||
status 404
|
||||
end
|
||||
|
|
@ -392,12 +410,12 @@ module Vmpooler
|
|||
payload
|
||||
end
|
||||
|
||||
def all_templates_valid?(payload)
|
||||
return false unless payload
|
||||
|
||||
payload.keys.all? do |templates|
|
||||
pool_exists?(templates)
|
||||
def invalid_templates(payload)
|
||||
invalid = []
|
||||
payload.keys.each do |template|
|
||||
invalid << template unless pool_exists?(template)
|
||||
end
|
||||
invalid
|
||||
end
|
||||
|
||||
post "#{api_prefix}/vm/:template/?" do
|
||||
|
|
@ -406,8 +424,16 @@ module Vmpooler
|
|||
|
||||
payload = extract_templates_from_query_params(params[:template])
|
||||
|
||||
if all_templates_valid?(payload)
|
||||
result = atomically_allocate_vms(payload)
|
||||
if payload
|
||||
invalid = invalid_templates(payload)
|
||||
if invalid.empty?
|
||||
result = atomically_allocate_vms(payload)
|
||||
else
|
||||
invalid.each do |bad_template|
|
||||
statsd.increment(statsd_prefix + '.checkout.invalid', bad_template)
|
||||
end
|
||||
status 404
|
||||
end
|
||||
else
|
||||
status 404
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,12 +1,15 @@
|
|||
module Vmpooler
|
||||
class PoolManager
|
||||
def initialize(config, logger, redis, graphite=nil)
|
||||
def initialize(config, logger, redis, graphite = nil, statsd = nil)
|
||||
$config = config
|
||||
|
||||
# Load logger library
|
||||
$logger = logger
|
||||
|
||||
unless graphite.nil?
|
||||
# statsd and graphite are mutex in the context of vmpooler
|
||||
if statsd
|
||||
$statsd = statsd
|
||||
elsif graphite
|
||||
$graphite = graphite
|
||||
end
|
||||
|
||||
|
|
@ -258,7 +261,8 @@ module Vmpooler
|
|||
$redis.decr('vmpooler__tasks__clone')
|
||||
|
||||
begin
|
||||
$graphite.log($config[:graphite]['prefix'] + ".clone.#{vm['template']}", finish) if defined? $graphite
|
||||
$statsd.timing($config[:statsd]['prefix'] + ".clone.#{vm['template']}", finish) if $statsd
|
||||
$graphite.log($config[:graphite]['prefix'] + ".clone.#{vm['template']}", finish) if $graphite
|
||||
rescue
|
||||
end
|
||||
end
|
||||
|
|
@ -294,7 +298,7 @@ module Vmpooler
|
|||
|
||||
$logger.log('s', "[-] [#{pool}] '#{vm}' destroyed in #{finish} seconds")
|
||||
|
||||
$graphite.log($config[:graphite]['prefix'] + ".destroy.#{pool}", finish) if defined? $graphite
|
||||
$graphite.log($config[:graphite]['prefix'] + ".destroy.#{pool}", finish) if $graphite
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -565,7 +569,10 @@ module Vmpooler
|
|||
total = $redis.scard('vmpooler__pending__' + pool['name']) + ready
|
||||
|
||||
begin
|
||||
if defined? $graphite
|
||||
if $statsd
|
||||
$statsd.gauge($config[:statsd]['prefix'] + '.ready.' + pool['name'], $redis.scard('vmpooler__ready__' + pool['name']))
|
||||
$statsd.gauge($config[:statsd]['prefix'] + '.running.' + pool['name'], $redis.scard('vmpooler__running__' + pool['name']))
|
||||
elsif $graphite
|
||||
$graphite.log($config[:graphite]['prefix'] + '.ready.' + pool['name'], $redis.scard('vmpooler__ready__' + pool['name']))
|
||||
$graphite.log($config[:graphite]['prefix'] + '.running.' + pool['name'], $redis.scard('vmpooler__running__' + pool['name']))
|
||||
end
|
||||
|
|
|
|||
9
lib/vmpooler/statsd.rb
Normal file
9
lib/vmpooler/statsd.rb
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
require 'rubygems' unless defined?(Gem)
|
||||
|
||||
module Vmpooler
|
||||
class Statsd
|
||||
def initialize(server = 'statsd', port = 8125)
|
||||
@server = Statsd.new(server, port)
|
||||
end
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue