Add support for ondemand provisioning to vmfloaty

This commit adds support for provisioning instances on demand with
vmpooler. Additionally, this change adds a capability to detect on
demand pools available in ABS. Without this change vmfloaty does not
support provisioning instances via the vmpooler ondemand endpoints.
This commit is contained in:
kirby@puppetlabs.com 2020-05-22 15:36:21 -07:00
parent 482d4328d1
commit 05a133fc72
6 changed files with 78 additions and 9 deletions

View file

@ -150,6 +150,14 @@ class ABS
os_list << '*** VMPOOLER Pools ***'
os_list += JSON.parse(res_body['vmpooler_platforms'])
res = conn.get 'status/platforms/ondemand_vmpooler'
res_body = JSON.parse(res.body)
unless res_body['ondemand_vmpooler_platforms'] == '[]'
os_list << ''
os_list << '*** VMPOOLER ONDEMAND Pools ***'
os_list += JSON.parse(res_body['ondemand_vmpooler_platforms'])
end
res = conn.get 'status/platforms/nspooler'
res_body = JSON.parse(res.body)
os_list << ''
@ -168,7 +176,7 @@ class ABS
end
# Retrieve an OS from ABS.
def self.retrieve(verbose, os_types, token, url, user, options)
def self.retrieve(verbose, os_types, token, url, user, options, _ondemand = nil)
#
# Contents of post must be like:
#

View file

@ -28,7 +28,7 @@ class Pooler
vms
end
def self.retrieve(verbose, os_type, token, url, _user, _options)
def self.retrieve(verbose, os_type, token, url, _user, _options, ondemand = nil)
# NOTE:
# Developers can use `Utils.generate_os_hash` to
# generate the os_type param.
@ -38,7 +38,8 @@ class Pooler
os_string = os_type.map { |os, num| Array(os) * num }.flatten.join('+')
raise MissingParamError, 'No operating systems provided to obtain.' if os_string.empty?
response = conn.post "vm/#{os_string}"
response = conn.post "vm/#{os_string}" unless ondemand
response ||= conn.post "ondemandvm/#{os_string}"
res_body = JSON.parse(response.body)
@ -46,11 +47,40 @@ class Pooler
res_body
elsif response.status == 401
raise AuthError, "HTTP #{response.status}: The token provided could not authenticate to the pooler.\n#{res_body}"
elsif response.status == 403
raise "HTTP #{response.status}: Failed to obtain VMs from the pooler at #{url}/vm/#{os_string}. Request exceeds the configured per pool maximum. #{res_body}"
else
raise "HTTP #{response.status}: Failed to obtain VMs from the pooler at #{url}/vm/#{os_string}. #{res_body}"
raise "HTTP #{response.status}: Failed to obtain VMs from the pooler at #{url}/vm/#{os_string}. #{res_body}" unless ondemand
raise "HTTP #{response.status}: Failed to obtain VMs from the pooler at #{url}/ondemandvm/#{os_string}. #{res_body}"
end
end
def self.wait_for_request(verbose, request_id, url, timeout = 300)
start_time = Time.now
while check_ondemandvm(verbose, request_id, url) == false
return false if (Time.now - start_time).to_i > timeout
STDOUT.puts "waiting for request #{request_id} to be fulfilled"
sleep 5
end
STDOUT.puts "The request has been fulfilled"
check_ondemandvm(verbose, request_id, url)
end
def self.check_ondemandvm(verbose, request_id, url)
conn = Http.get_conn(verbose, url)
response = conn.get "ondemandvm/#{request_id}"
res_body = JSON.parse(response.body)
return res_body if response.status == 200
return false if response.status == 202
raise "HTTP #{response.status}: The request cannot be found, or an unknown error occurred" if response.status == 404
false
end
def self.modify(verbose, url, hostname, token, modify_hash)
raise TokenError, 'Token provided was nil. Request cannot be made to modify vm' if token.nil?

View file

@ -75,10 +75,14 @@ class Service
@service_object.list_active verbose, url, token, user
end
def retrieve(verbose, os_types, use_token = true)
def retrieve(verbose, os_types, use_token = true, ondemand = nil)
puts 'Requesting a vm without a token...' unless use_token
token_value = use_token ? token : nil
@service_object.retrieve verbose, os_types, token_value, url, user, @config
@service_object.retrieve verbose, os_types, token_value, url, user, @config, ondemand
end
def wait_for_request(verbose, requestid)
@service_object.wait_for_request verbose, requestid, url
end
def ssh(verbose, host_os, use_token = true)

View file

@ -45,7 +45,9 @@ class Utils
result = {}
response_body.each do |os, value|
STDOUT.puts "response body is #{response_body}"
filtered_response_body = response_body.reject { |key, _| key == 'request_id' || key == 'ready' }
filtered_response_body.each do |os, value|
hostnames = Array(value['hostname'])
hostnames.map! { |host| "#{host}.#{domain}" } if domain
result[os] = hostnames