class Gogetit::GogetMAAS

Attributes

config[R]
conn[R]
domain[R]
logger[R]

Public Class Methods

new(conf, logger) click to toggle source
# File lib/gogetit/maas.rb, line 8
def initialize(conf, logger)
  @config = conf
  @conn = Maas::Client::MaasClient.new(
      config[:maas][:key],
      config[:maas][:url]
    )
  @logger = logger
end

Public Instance Methods

change_hostname(system_id, hostname) click to toggle source
# File lib/gogetit/maas.rb, line 223
def change_hostname(system_id, hostname)
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:put, ['machines', system_id], { 'hostname' => hostname })
end
delete_dns_record(name) click to toggle source
# File lib/gogetit/maas.rb, line 181
def delete_dns_record(name)
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:get, ['dnsresources']).each do |item|
    if item['fqdn'] == name + '.' + get_domain
      logger.info("#{item['fqdn']} is being deleted..")
      conn.request(:delete, ['dnsresources', item['id']])
    end
  end
end
dnsresource_exists?(name) click to toggle source
# File lib/gogetit/maas.rb, line 39
def dnsresource_exists?(name)
  logger.info("Calling <#{__method__.to_s}> for #{name}")
  conn.request(:get, ['dnsresources']).each do |item|
    return true if item['fqdn'] == name + '.' + get_domain
  end
  false
end
domain_name_exists?(name) click to toggle source
# File lib/gogetit/maas.rb, line 47
def domain_name_exists?(name)
  logger.info("Calling <#{__method__.to_s}> for #{name}")
  return true if dnsresource_exists?(name) or machine_exists?(name)
end
get_distro_name(system_id) click to toggle source
# File lib/gogetit/maas.rb, line 31
def get_distro_name(system_id)
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:get, ['machines']).each do |m|
    return m['osystem'] if m['system_id'] == system_id
  end
  false
end
get_domain() click to toggle source
# File lib/gogetit/maas.rb, line 17
def get_domain
  return @domain if @domain
  logger.info("Calling <#{__method__.to_s}>")
  @domain = conn.request(:get, ['domains'])[0]['name']
end
get_machine_state(system_id) click to toggle source
# File lib/gogetit/maas.rb, line 215
def get_machine_state(system_id)
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:get, ['machines']).each do |m|
    return m['status_name'] if m['system_id'] == system_id
  end
  false
end
get_package_repos() click to toggle source
# File lib/gogetit/maas.rb, line 233
def get_package_repos
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:get, ['package-repositories'])
end
get_sshkeys() click to toggle source
# File lib/gogetit/maas.rb, line 228
def get_sshkeys
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:get, ['account', 'prefs', 'sshkeys'])
end
get_subnets() click to toggle source
# File lib/gogetit/maas.rb, line 52
def get_subnets
  logger.info("Calling <#{__method__.to_s}>")
  return conn.request(:get, ['subnets'])
end
get_system_id(name) click to toggle source
# File lib/gogetit/maas.rb, line 199
def get_system_id(name)
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:get, ['machines']).each do |m|
    return m['system_id'] if m['hostname'] == name
  end
  nil
end
interfaces(url = [], params = {}) click to toggle source
# File lib/gogetit/maas.rb, line 159
def interfaces(url = [], params = {})
  logger.info("Calling <#{__method__.to_s}>")

  url.insert(0, 'nodes')
  url.insert(2, 'interfaces')
  # ['nodes', system_id, 'interfaces']

  case params['op']
  when nil
    conn.request(:get, url)
  when 'create_vlan'
    logger.info("Creating a vlan interface for id: #{params['vlan']}..")
    conn.request(:post, url, params)
  when 'link_subnet'
    logger.info("Linking a subnet for id: #{url[3]}..")
    conn.request(:post, url, params)
  when 'unlink_subnet'
    logger.info("Linking a subnet for id: #{url[3]}..")
    conn.request(:post, url, params)
  end
end
ip_reserved?(addresses) click to toggle source
# File lib/gogetit/maas.rb, line 57
def ip_reserved?(addresses)
  logger.info("Calling <#{__method__.to_s}>")
  ips = Set.new
  addresses.each do |ip|
    ips.add(IPAddr.new(ip))
  end

  reserved_ips = Set.new
  conn.request(:get, ['ipaddresses']).each do |ip|
    reserved_ips.add(IPAddr.new(ip['ip']))
  end

  rackcontroller_ips = Set.new
  conn.request(:get, ['rackcontrollers']).each do |rctrl|
    rctrl['ip_addresses'].each do |ip|
      rackcontroller_ips.add(IPAddr.new(ip))
    end
  end

  # reserved_ips | rackcontroller_ips
  # Returns a new array by joining ary with other_ary,
  # excluding any duplicates and preserving the order from the original array.
  if ips.disjoint? reserved_ips | rackcontroller_ips
    subnets = conn.request(:get, ['subnets'])
    ipranges = conn.request(:get, ['ipranges'])

    ifaces = []

    ips.each do |ip|
      available = false
      subnets.each do |subnet|
        if IPAddr.new(subnet['cidr']).include?(ip)
          ipranges.each do |range|
            if range['subnet']['id'] == subnet['id']
              first = IPAddr.new(range['start_ip']).to_i
              last = IPAddr.new(range['end_ip']).to_i
              if (first..last) === ip.to_i
                logger.info("#{ip} is available.")
                available = true
                subnets.delete(subnet)
                subnet['ip'] = ip.to_s
                ifaces << subnet
                break
              end
            end
          end
        end
        break if available
      end

      if not available
        logger.info("#{ip.to_s} does not belong to any subnet pre-defined.")
        return false
      end
    end

  else
    logger.info("#{(ips & (reserved_ips | rackcontroller_ips)).to_a.join(', ')}\
                is already reserved.")
    return false
  end

  return ifaces
end
ipaddresses(op = nil, params = nil) click to toggle source
# File lib/gogetit/maas.rb, line 133
def ipaddresses(op = nil, params = nil)
  logger.info("Calling <#{__method__.to_s}>")
  case op
  when nil
    conn.request(:get, ['ipaddresses'])
  when 'reserve'
    # params = {
    #   'subnet' => '10.1.2.0/24',
    #   'ip' => '10.1.2.8',
    #   'hostname' => 'hostname',
    #   'mac' => 'blahblah'
    # }
    default_param = { 'op' => op }
    logger.info("#{params['ip']} is being reserved..")
    conn.request(:post, ['ipaddresses'], default_param.merge!(params))
  when 'release'
    # Gogetit.maas.ipaddresses('release', {'ip' => '10.1.2.8'})
    # params = {
    #   'ip' => '10.1.2.8',
    # }
    default_param = { 'op' => op }
    logger.info("#{params['ip']} is being released..")
    conn.request(:post, ['ipaddresses'], default_param.merge!(params))
  end
end
ipaddresses_reserved?(ip) click to toggle source
# File lib/gogetit/maas.rb, line 122
def ipaddresses_reserved?(ip)
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:get, ['ipaddresses']).each do |address|
    if address['ip'] == ip
      logger.info("#{ip} is reserved.")
      return true
    end
  end
  return false
end
machine_exists?(name) click to toggle source
# File lib/gogetit/maas.rb, line 23
def machine_exists?(name)
  logger.info("Calling <#{__method__.to_s}> for #{name}")
  conn.request(:get, ['machines']).each do |m|
    return true if m['hostname'] == name
  end
  false
end
refresh_pods() click to toggle source
# File lib/gogetit/maas.rb, line 191
def refresh_pods
  logger.info("Calling <#{__method__.to_s}>")
  pod_id = conn.request(:get, ['pods'])
  pod_id.each do |pod|
    conn.request(:post, ['pods', pod['id']], { 'op' => 'refresh' } )
  end
end
wait_until_state(system_id, state) click to toggle source
# File lib/gogetit/maas.rb, line 207
def wait_until_state(system_id, state)
  logger.info("Calling <#{__method__.to_s}> for being #{state}")
  until conn.request(:get, ['machines', system_id])['status_name'] == state
    sleep 3
  end
  logger.info("The status has become '#{state}'.")
end