lib/nexussw/lxd/driver/mixins/rest.rb in lxd-common-0.6.0 vs lib/nexussw/lxd/driver/mixins/rest.rb in lxd-common-0.7.0
- old
+ new
@@ -1,82 +1,81 @@
+require 'nexussw/lxd/rest_api'
require 'nexussw/lxd/driver/mixins/helpers/wait'
require 'nexussw/lxd/transport/rest'
-require 'hyperkit'
module NexusSW
module LXD
class Driver
module Mixins
module Rest
# PARITY note: CLI functions are on an indefinite timeout by default, yet we have a 2 minute socket read timeout
# Leaving it alone, for now, on calls that are quick in nature
# Adapting on known long running calls such as create, stop, execute
- # REQUEST_TIMEOUT = 120 # upstream default: 120
def initialize(rest_endpoint, driver_options = {}, inner_driver = nil)
@rest_endpoint = rest_endpoint
@driver_options = driver_options
- hkoptions = (driver_options || {}).merge(
+ apioptions = (driver_options || {}).merge(
api_endpoint: rest_endpoint,
auto_sync: true
)
- @hk = inner_driver || Hyperkit::Client.new(hkoptions)
+ @api = inner_driver || RestAPI.new(apioptions)
end
- attr_reader :hk, :rest_endpoint, :driver_options
+ attr_reader :api, :rest_endpoint, :driver_options
include Helpers::WaitMixin
def server_info
- @server_info ||= hk.get('/1.0')[:metadata]
+ @server_info ||= api.get('/1.0')[:metadata]
end
def transport_for(container_name)
- Transport::Rest.new container_name, info: server_info, connection: hk, driver_options: driver_options, rest_endpoint: rest_endpoint
+ Transport::Rest.new container_name, info: server_info, connection: api, driver_options: driver_options, rest_endpoint: rest_endpoint
end
def create_container(container_name, container_options = {})
if container_exists?(container_name)
start_container container_name # Start the container for Parity with the CLI
return container_name
end
# parity note: CLI will run indefinitely rather than timeout hence the 0 timeout
retry_forever do
- @hk.create_container(container_name, container_options.merge(sync: false))
+ api.create_container(container_name, container_options.merge(sync: false))
end
start_container container_name
container_name
end
def start_container(container_id)
return if container_status(container_id) == 'running'
retry_forever do
- @hk.start_container(container_id, sync: false)
+ api.start_container(container_id, sync: false)
end
wait_for_status container_id, 'running'
end
def stop_container(container_id, options = {})
return if container_status(container_id) == 'stopped'
if options[:force]
- @hk.stop_container(container_id, force: true)
+ api.stop_container(container_id, force: true)
else
last_id = nil
use_last = false
LXD.with_timeout_and_retries({ timeout: 0 }.merge(options)) do # timeout: 0 to enable retry functionality
return if container_status(container_id) == 'stopped'
begin
unless use_last
# Keep resubmitting until the server complains (Stops will be ignored/hang if init is not yet listening for SIGPWR i.e. recently started)
begin
- last_id = @hk.stop_container(container_id, sync: false)[:id]
- rescue Hyperkit::BadRequest # Happens if a stop command has previously been accepted as well as other reasons. handle that on next line
+ last_id = api.stop_container(container_id, sync: false)[:metadata][:id]
+ rescue NexusSW::LXD::RestAPI::Error::BadRequest # Happens if a stop command has previously been accepted as well as other reasons. handle that on next line
# if we have a last_id then a prior stop command has successfully initiated so we'll just wait on that one
raise unless last_id # rubocop:disable Metrics/BlockNesting
use_last = true
end
end
- @hk.wait_for_operation last_id # , options[:retry_interval]
+ api.wait_for_operation last_id # , options[:retry_interval]
rescue Faraday::TimeoutError => e
return if container_status(container_id) == 'stopped'
raise Timeout::Retry.new e # if options[:retry_interval] # rubocop:disable Style/RaiseArgs
end
end
@@ -87,37 +86,39 @@
def delete_container(container_id)
return unless container_exists? container_id
stop_container container_id, force: true
# ISSUE 17: something upstream is causing a double-tap on the REST endpoint
- begin
- @hk.delete_container container_id
- rescue ::Faraday::ConnectionFailed, ::Hyperkit::BadRequest
- LXD.with_timeout_and_retries timeout: 120 do
- loop do
- return unless container_exists? container_id
- sleep 0.3
- end
- end
- end
+
+ # trial return to normal
+ # begin
+ api.delete_container container_id
+ # rescue ::Faraday::ConnectionFailed, ::NexusSW::LXD::RestAPI::Error::BadRequest
+ # LXD.with_timeout_and_retries timeout: 120 do
+ # loop do
+ # return unless container_exists? container_id
+ # sleep 0.3
+ # end
+ # end
+ # end
end
def container_status(container_id)
- STATUS_CODES[container(container_id)[:status_code].to_i]
+ STATUS_CODES[api.container(container_id)[:metadata][:status_code].to_i]
end
def container_state(container_id)
return nil unless container_status(container_id) == 'running' # Parity with CLI
- @hk.container_state(container_id)
+ api.container_state(container_id)[:metadata]
end
def container(container_id)
- @hk.container container_id
+ api.container(container_id)[:metadata]
end
def container_exists?(container_id)
- hk.containers.include? container_id
+ api.containers[:metadata].map { |url| url.split('/').last }.include? container_id
end
protected
def wait_for_status(container_id, newstatus)
@@ -131,10 +132,10 @@
def retry_forever
retval = yield
LXD.with_timeout_and_retries timeout: 0 do
begin
- @hk.wait_for_operation retval[:id]
+ api.wait_for_operation retval[:metadata][:id]
rescue Faraday::TimeoutError => e
raise Timeout::Retry.new e # rubocop:disable Style/RaiseArgs
end
end
end