class Chef::Knife::OciServerDelete

Server Delete Command: Delete an OCI instance.

Constants

MAX_INTERVAL_SECONDS

max interval for polling the server state

Public Instance Methods

confirm_deletion(prompt) click to toggle source
# File lib/chef/knife/oci_server_delete.rb, line 131
def confirm_deletion(prompt)
  if confirm(prompt)
    # we have user's confirmation, so avoid any further confirmation prompts from Chef
    config[:yes] = true
    return
  end
  error_and_exit 'Server delete canceled.'
end
delete_chef_client(client_name) click to toggle source
# File lib/chef/knife/oci_server_delete.rb, line 86
def delete_chef_client(client_name)
  object = Chef::ApiClient.load(client_name)
  return unless object && !object.validator
  object.destroy
  ui.msg "Deleted Chef client '#{client_name}'"
end
delete_chef_node(node) click to toggle source
# File lib/chef/knife/oci_server_delete.rb, line 81
def delete_chef_node(node)
  node.destroy
  ui.msg "Deleted Chef node '#{node.name}'"
end
end_progress_indicator() click to toggle source
# File lib/chef/knife/oci_server_delete.rb, line 145
def end_progress_indicator
  print ui.color("done\n", :magenta)
end
get_chef_node(node_name) click to toggle source
# File lib/chef/knife/oci_server_delete.rb, line 76
def get_chef_node(node_name)
  node = Chef::Node.load(node_name)
  node
end
get_wait_options(wait_for) click to toggle source
# File lib/chef/knife/oci_server_delete.rb, line 123
def get_wait_options(wait_for)
  opts = {
    max_interval_seconds: MAX_INTERVAL_SECONDS
  }
  opts[:max_wait_seconds] = wait_for if wait_for > 0
  opts
end
run() click to toggle source
# File lib/chef/knife/oci_server_delete.rb, line 41
def run
  $stdout.sync = true
  validate_required_params(%i[instance_id], config)
  wait_for = validate_wait
  if config[:chef_node_name] && !config[:purge]
    error_and_exit('--node-name requires --purge argument')
  end

  response = check_can_access_instance(config[:instance_id])

  ui.msg "Instance name: #{response.data.display_name}"
  deletion_prompt = 'Delete server? (y/n)'
  chef_node = nil
  if config[:purge]
    deletion_prompt = 'Delete server and chef node? (y/n)'
    node_name = response.data.display_name
    node_name = config[:chef_node_name] if config[:chef_node_name]
    chef_node = get_chef_node(node_name)
    ui.msg "Chef node name: #{chef_node.name}"
  end
  confirm_deletion(deletion_prompt)

  terminate_instance(config[:instance_id])
  delete_chef_node(chef_node) if config[:purge]
  delete_chef_client(node_name) if config[:purge]

  wait_for_instance_terminated(config[:instance_id], wait_for) if wait_for
end
show_progress() click to toggle source
# File lib/chef/knife/oci_server_delete.rb, line 140
def show_progress
  print ui.color('.', :magenta)
  $stdout.flush
end
terminate_instance(instance_id) click to toggle source
# File lib/chef/knife/oci_server_delete.rb, line 70
def terminate_instance(instance_id)
  compute_client.terminate_instance(instance_id)

  ui.msg "Initiated delete of instance #{instance_id}"
end
validate_wait() click to toggle source
# File lib/chef/knife/oci_server_delete.rb, line 114
def validate_wait
  wait_for = nil
  if config[:wait]
    wait_for = Integer(config[:wait])
    error_and_exit 'Wait value must be 0 or greater' if wait_for < 0
  end
  wait_for
end
wait_for_instance_terminated(instance_id, wait_for) click to toggle source
# File lib/chef/knife/oci_server_delete.rb, line 93
def wait_for_instance_terminated(instance_id, wait_for)
  print ui.color('Waiting for instance to terminate...', :magenta)
  begin
    begin
      compute_client.get_instance(instance_id).wait_until(:lifecycle_state,
                                                          OCI::Core::Models::Instance::LIFECYCLE_STATE_TERMINATED,
                                                          get_wait_options(wait_for)) do
        show_progress
      end
    ensure
      end_progress_indicator
    end
  rescue OCI::Waiter::Errors::MaximumWaitTimeExceededError
    error_and_exit 'Timeout exceeded while waiting for instance to terminate'
  rescue OCI::Errors::ServiceError => service_error
    raise unless service_error.service_code == 'NotAuthorizedOrNotFound'
    # we'll soak this exception since the terminate may have completed before we started waiting for it.
    ui.warn 'Instance not authorized or not found'
  end
end