(POOLER-174) Reduce duplicate of on demand code introduced in POOLER-158

refactored every parsing of request of type 'pool_alias:pool:count' into a
utility class, that is used by pool_manager and the api v1 class
This commit is contained in:
Samuel Beaulieu 2020-06-11 10:24:37 -05:00
parent 2afc2a242b
commit dce2a96b68
3 changed files with 27 additions and 20 deletions

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'vmpooler/util/parsing'
module Vmpooler module Vmpooler
class API class API
class V1 < Sinatra::Base class V1 < Sinatra::Base
@ -974,11 +976,9 @@ module Vmpooler
if request_hash['status'] == 'ready' if request_hash['status'] == 'ready'
result['ready'] = true result['ready'] = true
platform_parts = request_hash['requested'].split(',') get_platform_pool_count(request_hash['requested']) do |platform_alias,pool,_count|
platform_parts.each do |platform| instances = backend.smembers("vmpooler__#{request_id}__#{platform_alias}__#{pool}")
pool_alias, pool, _count = platform.split(':') result[platform_alias] = { 'hostname': instances }
instances = backend.smembers("vmpooler__#{request_id}__#{pool_alias}__#{pool}")
result[pool_alias] = { 'hostname': instances }
end end
result['domain'] = config['domain'] if config['domain'] result['domain'] = config['domain'] if config['domain']
status 200 status 200
@ -989,11 +989,9 @@ module Vmpooler
result['message'] = 'The request has been deleted' result['message'] = 'The request has been deleted'
status 200 status 200
else else
platform_parts = request_hash['requested'].split(',') get_platform_pool_count(request_hash['requested']) do |platform_alias,pool,count|
platform_parts.each do |platform| instance_count = backend.scard("vmpooler__#{request_id}__#{platform_alias}__#{pool}")
pool_alias, pool, count = platform.split(':') result[platform_alias] = {
instance_count = backend.scard("vmpooler__#{request_id}__#{pool_alias}__#{pool}")
result[pool_alias] = {
'ready': instance_count.to_s, 'ready': instance_count.to_s,
'pending': (count.to_i - instance_count.to_i).to_s 'pending': (count.to_i - instance_count.to_i).to_s
} }
@ -1017,12 +1015,11 @@ module Vmpooler
else else
backend.hset("vmpooler__odrequest__#{request_id}", 'status', 'deleted') backend.hset("vmpooler__odrequest__#{request_id}", 'status', 'deleted')
platforms.split(',').each do |platform| get_platform_pool_count(platforms) do |platform_alias,pool,_count|
pool_alias, pool, _count = platform.split(':') backend.smembers("vmpooler__#{request_id}__#{platform_alias}__#{pool}")&.each do |vm|
backend.smembers("vmpooler__#{request_id}__#{pool_alias}__#{pool}")&.each do |vm|
backend.smove("vmpooler__running__#{pool}", "vmpooler__completed__#{pool}", vm) backend.smove("vmpooler__running__#{pool}", "vmpooler__completed__#{pool}", vm)
end end
backend.del("vmpooler__#{request_id}__#{pool_alias}__#{pool}") backend.del("vmpooler__#{request_id}__#{platform_alias}__#{pool}")
end end
backend.expire("vmpooler__odrequest__#{request_id}", 129_600_0) backend.expire("vmpooler__odrequest__#{request_id}", 129_600_0)
end end

View file

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'vmpooler/providers' require 'vmpooler/providers'
require 'vmpooler/util/parsing'
require 'spicy-proton' require 'spicy-proton'
require 'resolv' # ruby standard lib require 'resolv' # ruby standard lib
@ -1500,9 +1501,7 @@ module Vmpooler
def vms_ready?(request_id, redis) def vms_ready?(request_id, redis)
catch :request_not_ready do catch :request_not_ready do
request_hash = redis.hgetall("vmpooler__odrequest__#{request_id}") request_hash = redis.hgetall("vmpooler__odrequest__#{request_id}")
requested_platforms = request_hash['requested'].split(',') get_platform_pool_count(request_hash['requested']) do |platform_alias,pool,count|
requested_platforms.each do |platform|
platform_alias, pool, count = platform.split(':')
pools_filled = redis.scard("vmpooler__#{request_id}__#{platform_alias}__#{pool}") pools_filled = redis.scard("vmpooler__#{request_id}__#{platform_alias}__#{pool}")
throw :request_not_ready unless pools_filled.to_i == count.to_i throw :request_not_ready unless pools_filled.to_i == count.to_i
end end
@ -1554,9 +1553,7 @@ module Vmpooler
def remove_vms_for_failed_request(request_id, expiration_ttl, redis) def remove_vms_for_failed_request(request_id, expiration_ttl, redis)
request_hash = redis.hgetall("vmpooler__odrequest__#{request_id}") request_hash = redis.hgetall("vmpooler__odrequest__#{request_id}")
requested_platforms = request_hash['requested'].split(',') get_platform_pool_count(request_hash['requested']) do |platform_alias,pool,_count|
requested_platforms.each do |platform|
platform_alias, pool, _count = platform.split(':')
pools_filled = redis.smembers("vmpooler__#{request_id}__#{platform_alias}__#{pool}") pools_filled = redis.smembers("vmpooler__#{request_id}__#{platform_alias}__#{pool}")
redis.pipelined do redis.pipelined do
pools_filled&.each do |vm| pools_filled&.each do |vm|

View file

@ -0,0 +1,13 @@
# utility class shared between apps
module Vmpooler
class Parsing
def get_platform_pool_count(requested, &block)
requested_platforms = requested.split(',')
requested_platforms.each do |platform|
platform_alias, pool, count = platform.split(':')
#raise ArgumentError if platform_alias.nil? || pool.nil? || count.nil?
yield platform_alias, pool, count
end
end
end
end