class OVH::Provisioner::APIObject::DedicatedServer

Represent a dedicated server

Constants

IDLE

install_status const

NO_OS

Attributes

boot[R]
dc[R]
flavor[R]
flavor_tag[R]
install_status[R]
ip[R]
location[R]
os[R]
reverse[R]
server_id[R]
state[R]
vrack[R]
vrack_id[R]

Public Instance Methods

define_reverse(domain, name = newname) click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 79
def define_reverse(domain, name = newname)
  full_name = "#{name}.#{domain.id}"
  return "#{reverse}: no change" if reverse == full_name

  add_reverse(full_name)
end
install() click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 36
def install
  raise 'Please provide a valid template' if config['template'].nil?

  ok, reason = can_install
  if ok
    result = post('install/start', install_body)
    if result.is_a?(String) # Meaning an error message
      reason = result
      ok = false
    end
  end
  "#{id}: #{ok ? 'ok' : 'failed'}\n  #{reason}"
end
ipmi() click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 86
def ipmi
  request_ipmi

  (1..10).each do |_|
    result = get('features/ipmi/access?type=kvmipJnlp')
    unless result.is_a?(String)
      launch_ipmi(result['value'])
      break
    end
    sleep(1)
  end
end
newname() click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 57
def newname
  name_scheme = Provisioner.config['name_scheme']
  return reverse if name_scheme.nil?

  subst = attributes.map { |a| { a => send(a) } }.reduce(&:merge)
  name_scheme % subst
end
rename(domain, name = newname) click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 65
def rename(domain, name = newname)
  full_name = "#{name}.#{domain.id}"
  return "#{reverse}: no change" if reverse == full_name

  # check if name is already used
  records = domain.filter_records('subdomain' => newname)
  return "#{reverse}: name already used" unless records.list.empty?

  # remove old name (only if it belongs to the same domain)
  remove_old_names(domain)

  domain.add_record(name, 'A', ip)
end
to_s() click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 50
def to_s
  "#{reverse}[#{id}/#{server_id}]" \
  "\n  #{location} - #{flavor} - #{vrack}:#{ip} " \
  "- #{boot}:#{os} - #{state}" \
  "\n  #{install_status}"
end

Private Instance Methods

add_reverse(full_name) click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 201
def add_reverse(full_name)
  ip_obj = Actor[Spawner::NAME].get('IP', id: "#{ip}/32")
  result = ip_obj.add_reverse(full_name)
  cant = "Cannot check if #{full_name}. resolves to #{ip}"
  if result == cant
    result = "#{reverse}: DNS propagation is not finished, try later_"
  end
  result
end
can_install() click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 101
def can_install
  if install_status != IDLE
    [false, "Installation ongoing: #{install_status}"]
  elsif !config['force'] && os != NO_OS
    [false,
     "An OS is already installed (#{os}) but option force is false"]
  else [true, "Installation of #{config['template']} launched"]
  end
end
extract_status(status) click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 187
def extract_status(status)
  cur = status['progress'].select { |step| step['status'] == 'doing' }
  cur << { 'comment' => 'Preparing installation' } if cur.empty?
  cur.first['comment']
end
get_boot(general) click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 139
def get_boot(general)
  get("boot/#{general['bootId']}")['bootType']
end
get_flavors_from_config(hardware) click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 156
def get_flavors_from_config(hardware)
  (config['flavors'].dup || {}).map do |flavor, desc|
    diff = HashDiff.diff(hardware, desc['hardware'])
    signs = diff.map(&:first).uniq - ['-']
    signs.empty? ? flavor : nil
  end.compact
end
get_reverse(general) click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 135
def get_reverse(general)
  (general['reverse'] || id).chomp('.')
end
install_body() click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 111
def install_body
  details = { 'customHostname' => reverse.chomp('.') }
  %w[customHostname useDistribKernel sshKeyName].each do |opt|
    value = config[APIObject.underscore(opt)]
    details.merge!(opt => value) unless value.nil?
  end
  {
    'templateName' => config['template'],
    'details' => details
  }
end
launch_ipmi(jnlp) click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 217
def launch_ipmi(jnlp)
  filename = "/tmp/#{id}.jnlp"
  File.open(filename, 'w') { |file| file.write(jnlp) }
  system("javaws #{filename}")
end
remove_old_names(domain) click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 193
def remove_old_names(domain)
  old_name = reverse.match(/^(.*)\.#{domain.id}$/).to_a.last
  return if old_name.nil?

  records = domain.filter_records('subdomain' => old_name)
  records.parallel_map(:rm_record, [], domain)
end
request_ipmi() click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 211
def request_ipmi
  body = { 'ttl' => '15', 'type' => 'kvmipJnlp' }
  result = post('features/ipmi/access', body)
  puts result if result.is_a?(String)
end
set_flavor() click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 143
def set_flavor
  hardware = get('specifications/hardware')
  flavors = get_flavors_from_config(hardware)
  raise "Too many flavor possible: #{flavors}" if flavors.size > 1

  @flavor, @flavor_tag =
    if flavors.first.nil?
      %w[undefined undef]
    else
      [flavors.first, config['flavors'][flavors.first]['tag']]
    end
end
set_general() click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 123
def set_general
  general = get
  @reverse = get_reverse(general)
  @server_id = general['serverId']
  @ip = general['ip']
  @dc = general['datacenter']
  @location = dc.gsub(/[0-9]*$/, '')
  @os = general['os']
  @boot = get_boot(general)
  @state = general['state']
end
set_install_status() click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 177
def set_install_status
  status = get('install/status')
  if status.is_a?(String)
    status = {
      'progress' => ['status' => 'doing', 'comment' => status]
    }
  end
  @install_status = extract_status(status)
end
set_vrack() click to toggle source
# File lib/ovh/provisioner/api_object/dedicated_server.rb, line 164
def set_vrack
  vracks = get('vrack')
  raise "Too many vracks for #{server}: #{vracks}" if vracks.size > 1

  if vracks.first.nil?
    @vrack_id = '-1'
    @vrack = 'none'
  else
    @vrack_id = vracks.first
    @vrack = Actor[Spawner::NAME].get('Vrack', id: @vrack_id).name
  end
end