lib/gogetit/maas.rb in gogetit-0.2.1 vs lib/gogetit/maas.rb in gogetit-0.3.0

- old
+ new

@@ -1,6 +1,7 @@ require 'maas/client' +require 'ipaddr' module Gogetit class GogetMAAS attr_reader :config, :conn, :domain, :logger @@ -34,50 +35,144 @@ end false end def domain_name_exists?(name) + logger.info("Calling <#{__method__.to_s}>") return true if dnsresource_exists?(name) or machine_exists?(name) end + 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 + + 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 + def ipaddresses(op = nil, params = nil) + logger.info("Calling <#{__method__.to_s}>") case op when nil conn.request(:get, ['ipaddresses']) when 'reserve' - # sample = { + # 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'}) - # sample = { + # params = { # 'ip' => '10.1.2.8', - # 'hostname' => 'hostname', - # 'mac' => 'blahblah' # } default_param = { 'op' => op } + logger.info("#{params['ip']} is being released..") conn.request(:post, ['ipaddresses'], default_param.merge!(params)) end end + 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 + def delete_dns_record(name) logger.info("Calling <#{__method__.to_s}>") - id = nil conn.request(:get, ['dnsresources']).each do |item| if item['fqdn'] == name + '.' + get_domain - id = item['id'] + logger.info("#{item['fqdn']} is being deleted..") + conn.request(:delete, ['dnsresources', item['id']]) end - end - - if ! id.nil? - conn.request(:delete, ['dnsresources', id.to_s]) - else - logger.warn('No such record found.') end end def refresh_pods logger.info("Calling <#{__method__.to_s}>")