module Kontena::Machine::Packet::PacketCommon

Public Instance Methods

api_retry(message, times=5) { || ... } click to toggle source

Retry API requests to recover from random tls errors @param [String] message Message to output when giving up @param [Fixnum] times Default: 5

# File lib/kontena/machine/packet/packet_common.rb, line 73
def api_retry(message, times=5, &block)
  attempt = 1
  begin
    yield
  rescue => error
    ENV['DEBUG'] && puts("Packet API error: #{error}: #{error.message} - attempt #{attempt}")
    attempt += 1
    if attempt < times
      sleep 5 and retry
    else
      abort(message)
    end
  end
end
check_or_create_ssh_key(ssh_key) click to toggle source

@param [String] ssh_key SSH public key

# File lib/kontena/machine/packet/packet_common.rb, line 26
def check_or_create_ssh_key(ssh_key)
  return nil if ssh_key.nil?
  create_ssh_key(ssh_key) unless ssh_key_exist?(ssh_key)
end
create_ssh_key(ssh_key) click to toggle source
# File lib/kontena/machine/packet/packet_common.rb, line 12
def create_ssh_key(ssh_key)
  client.create_ssh_key(label: ssh_key_label(ssh_key), key: ssh_key)
end
device_public_ip(device) click to toggle source
# File lib/kontena/machine/packet/packet_common.rb, line 51
def device_public_ip(device)
  start_time = Time.now.to_i
  api_retry "Packet API did not find a public ip address for the device" do
    loop do
      ip = refresh(device).ip_addresses.find{|ip| ip['public'] && ip['address_family'] == 4}
      return ip if ip
      sleep 0.5
      raise 'Timeout while looking for device public ip' if (Time.now.to_i - start_time) > 300
    end
  end
end
erb(template, vars) click to toggle source
# File lib/kontena/machine/packet/packet_common.rb, line 93
def erb(template, vars)
  ERB.new(template, nil, '%<>-').result(OpenStruct.new(vars).instance_eval { binding })
end
find_device(project_id, device_hostname) click to toggle source
# File lib/kontena/machine/packet/packet_common.rb, line 35
def find_device(project_id, device_hostname)
  client.list_devices(project_id).find{|device| device.hostname == device_hostname}
end
find_facility(facility_code) click to toggle source
# File lib/kontena/machine/packet/packet_common.rb, line 39
def find_facility(facility_code)
  client.list_facilities.find{|f| f.code == facility_code}
end
find_os(os_code) click to toggle source
# File lib/kontena/machine/packet/packet_common.rb, line 43
def find_os(os_code)
  client.list_operating_systems.find{|os| os.slug == os_code}
end
find_plan(plan_code) click to toggle source
# File lib/kontena/machine/packet/packet_common.rb, line 47
def find_plan(plan_code)
  client.list_plans.find{|plan| plan.slug == plan_code}
end
find_project(project_id) click to toggle source
# File lib/kontena/machine/packet/packet_common.rb, line 31
def find_project(project_id)
  client.list_projects.find{|project| project.id == project_id}
end
login(token) click to toggle source

@param [String] token Packet token

# File lib/kontena/machine/packet/packet_common.rb, line 8
def login(token)
  ::Packet::Client.new(token)
end
refresh(device) click to toggle source

Reloads the device data from Packet API @param device [Packet::Device] @return refreshed_device [Packet::Device]

# File lib/kontena/machine/packet/packet_common.rb, line 66
def refresh(device)
  client.get_device(device.id)
end
ssh_key_exist?(ssh_key) click to toggle source
# File lib/kontena/machine/packet/packet_common.rb, line 16
def ssh_key_exist?(ssh_key)
  client.list_ssh_keys.any?{|key| key.key == ssh_key}
end
ssh_key_label(ssh_key) click to toggle source
# File lib/kontena/machine/packet/packet_common.rb, line 20
def ssh_key_label(ssh_key)
  label = ssh_key[/^ssh.+?\s+\S+\s+(.*)$/, 1].to_s.strip
  label.empty? ? "kontena-ssh-key-#{rand(1..9)}" : label
end
user_data(vars, template_filename) click to toggle source
# File lib/kontena/machine/packet/packet_common.rb, line 88
def user_data(vars, template_filename)
  cloudinit_template = File.join(__dir__ , template_filename)
  erb(File.read(cloudinit_template), vars)
end