mirror of
https://github.com/puppetlabs/vmpooler.git
synced 2026-01-26 18:08:42 -05:00
(POOLER-158) Getting started with provisioning on demand
This commit is contained in:
parent
e9a79cb6db
commit
63712741a0
3 changed files with 145 additions and 2 deletions
|
|
@ -8,9 +8,9 @@
|
||||||
# RUN:
|
# RUN:
|
||||||
# docker run -e VMPOOLER_CONFIG -p 80:4567 -it vmpooler
|
# docker run -e VMPOOLER_CONFIG -p 80:4567 -it vmpooler
|
||||||
|
|
||||||
FROM jruby:9.2.9-jdk
|
FROM jruby:9.2-jdk
|
||||||
|
|
||||||
ARG vmpooler_version=0.5.0
|
ARG vmpooler_version=0.11.1
|
||||||
|
|
||||||
COPY docker/docker-entrypoint.sh /usr/local/bin/
|
COPY docker/docker-entrypoint.sh /usr/local/bin/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -277,6 +277,35 @@ module Vmpooler
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def generate_ondemand_request(payload)
|
||||||
|
result = { 'ok': false }
|
||||||
|
|
||||||
|
request_id = payload[:request_id]
|
||||||
|
request_id = generate_request_id if request_id.nil?
|
||||||
|
score = Time.now.to_i
|
||||||
|
|
||||||
|
result['request_id'] = request_id
|
||||||
|
|
||||||
|
if backend.exists("vmpooler__odrequest__#{request_id}")
|
||||||
|
result['message'] = "request_id '#{request_id}' has already been created"
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
return result unless backend.zadd('vmpooler__provisioning__request', score, request_id)
|
||||||
|
|
||||||
|
status 201
|
||||||
|
|
||||||
|
requested = payload[:requested].map { |poolname, count| "#{poolname}:#{count}" }.join(',')
|
||||||
|
backend.hset("vmpooler__odrequest__#{request_id}", 'requested', requested)
|
||||||
|
|
||||||
|
result['ok'] = true
|
||||||
|
result
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate_request_id
|
||||||
|
SecureRandom.uuid
|
||||||
|
end
|
||||||
|
|
||||||
get '/' do
|
get '/' do
|
||||||
sync_pool_sizes
|
sync_pool_sizes
|
||||||
redirect to('/dashboard/')
|
redirect to('/dashboard/')
|
||||||
|
|
@ -689,6 +718,41 @@ module Vmpooler
|
||||||
JSON.pretty_generate(result)
|
JSON.pretty_generate(result)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
post "#{api_prefix}/ondemandrequest/?" do
|
||||||
|
content_type :json
|
||||||
|
result = { 'ok' => false }
|
||||||
|
|
||||||
|
payload = JSON.parse(request.body.read)
|
||||||
|
|
||||||
|
if payload
|
||||||
|
invalid = invalid_templates(payload)
|
||||||
|
if invalid.empty?
|
||||||
|
result = generate_ondemand_request(payload)
|
||||||
|
else
|
||||||
|
invalid.each do |bad_template|
|
||||||
|
metrics.increment('ondemandrequest.invalid.' + bad_template)
|
||||||
|
end
|
||||||
|
status 404
|
||||||
|
end
|
||||||
|
else
|
||||||
|
metrics.increment('ondemandrequest.invalid.unknown')
|
||||||
|
status 404
|
||||||
|
end
|
||||||
|
|
||||||
|
JSON.pretty_generate(result)
|
||||||
|
end
|
||||||
|
|
||||||
|
get "#{api_prefix}/ondemandrequest/:requestid/?" do
|
||||||
|
content_type :json
|
||||||
|
|
||||||
|
result = {'ok': false}
|
||||||
|
|
||||||
|
status 404
|
||||||
|
result = check_ondemand_request(payload)
|
||||||
|
|
||||||
|
JSON.pretty_generate(result)
|
||||||
|
end
|
||||||
|
|
||||||
post "#{api_prefix}/vm/?" do
|
post "#{api_prefix}/vm/?" do
|
||||||
content_type :json
|
content_type :json
|
||||||
result = { 'ok' => false }
|
result = { 'ok' => false }
|
||||||
|
|
@ -764,6 +828,29 @@ module Vmpooler
|
||||||
invalid
|
invalid
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def check_ondemand_request(payload)
|
||||||
|
result = {'ok': false}
|
||||||
|
request_id = payload[:request_id]
|
||||||
|
request_hash = backend.hgetall("vmpooler__odrequest__#{request_id}")
|
||||||
|
if request_hash.empty?
|
||||||
|
result['message'] = "no request found for request_id '#{request_id}'"
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
if request_hash['status'] == 'ready'
|
||||||
|
result['status'] = 'ready'
|
||||||
|
instances = {}
|
||||||
|
platforms = request_hash['requested'].split(',').map( { |r| r.split(':')[0] } )
|
||||||
|
platforms.each do |platform|
|
||||||
|
instances[platform] = request_hash[platform].split(':')
|
||||||
|
end
|
||||||
|
result['instances'] = instances
|
||||||
|
status 200
|
||||||
|
end
|
||||||
|
|
||||||
|
result
|
||||||
|
end
|
||||||
|
|
||||||
post "#{api_prefix}/vm/:template/?" do
|
post "#{api_prefix}/vm/:template/?" do
|
||||||
content_type :json
|
content_type :json
|
||||||
result = { 'ok' => false }
|
result = { 'ok' => false }
|
||||||
|
|
|
||||||
|
|
@ -1213,6 +1213,55 @@ module Vmpooler
|
||||||
raise("Provider '#{provider_class}' is unknown for pool with provider name '#{provider_name}'") if provider.nil?
|
raise("Provider '#{provider_class}' is unknown for pool with provider name '#{provider_name}'") if provider.nil?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def check_ondemand_requests(maxloop = 0,
|
||||||
|
loop_delay_min = CHECK_LOOP_DELAY_MIN_DEFAULT,
|
||||||
|
loop_delay_max = CHECK_LOOP_DELAY_MAX_DEFAULT,
|
||||||
|
loop_delay_decay = CHECK_LOOP_DELAY_DECAY_DEFAULT)
|
||||||
|
|
||||||
|
# Use the pool setings if they exist
|
||||||
|
loop_delay_min = pool['check_loop_delay_min'] unless pool['check_loop_delay_min'].nil?
|
||||||
|
loop_delay_max = pool['check_loop_delay_max'] unless pool['check_loop_delay_max'].nil?
|
||||||
|
loop_delay_decay = pool['check_loop_delay_decay'] unless pool['check_loop_delay_decay'].nil?
|
||||||
|
|
||||||
|
loop_delay_decay = 2.0 if loop_delay_decay <= 1.0
|
||||||
|
loop_delay_max = loop_delay_min if loop_delay_max.nil? || loop_delay_max < loop_delay_min
|
||||||
|
|
||||||
|
loop_count = 1
|
||||||
|
loop_delay = loop_delay_min
|
||||||
|
|
||||||
|
loop do
|
||||||
|
result = process_ondemand_requests
|
||||||
|
|
||||||
|
loop_delay = (loop_delay * loop_delay_decay).to_i
|
||||||
|
loop_delay = loop_delay_min if result > 0
|
||||||
|
loop_delay = loop_delay_max if loop_delay > loop_delay_max
|
||||||
|
sleep_with_wakeup_events(loop_delay, loop_delay_min, ondemand_request: true)
|
||||||
|
|
||||||
|
unless maxloop == 0
|
||||||
|
break if loop_count >= maxloop
|
||||||
|
|
||||||
|
loop_count += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def process_ondemand_requests
|
||||||
|
requests = $redis.zrange('vmpooler__provisioning__requests', 0, -1)
|
||||||
|
return 0 if requests.empty?
|
||||||
|
|
||||||
|
requests.each do |request_id|
|
||||||
|
create_ondemand_vms(request_id)
|
||||||
|
$redis.zrem('vmpooler__provisioning__requests', request_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
return requests.length
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_ondemand_vms(request_id)
|
||||||
|
requested = $redis.hget("vmpooler__odrequest__#{request_id}", 'requested')
|
||||||
|
requested = requested.split(',')
|
||||||
|
end
|
||||||
|
|
||||||
def execute!(maxloop = 0, loop_delay = 1)
|
def execute!(maxloop = 0, loop_delay = 1)
|
||||||
$logger.log('d', 'starting vmpooler')
|
$logger.log('d', 'starting vmpooler')
|
||||||
|
|
||||||
|
|
@ -1303,6 +1352,13 @@ module Vmpooler
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if !$threads['ondemand_provisioner']
|
||||||
|
check_ondemand_requests
|
||||||
|
elsif !$threads['ondemand_provisioner'].alive?
|
||||||
|
$logger.log('d', '[!] [ondemand_provisioner] worker thread died, restarting')
|
||||||
|
check_ondemand_requests
|
||||||
|
end
|
||||||
|
|
||||||
sleep(loop_delay)
|
sleep(loop_delay)
|
||||||
|
|
||||||
unless maxloop == 0
|
unless maxloop == 0
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue