Project

General

Profile

Download (4.22 KB) Statistics
| Branch: | Tag: | Revision:
90b83222 Ohad Levy
module Orchestration::DNS
def self.included(base)
base.send :include, InstanceMethods
base.class_eval do
ffb24832 Ohad Levy
after_validation :dns_conflict_detected?, :queue_dns
acb50a39 Ohad Levy
before_destroy :queue_dns_destroy
90b83222 Ohad Levy
end
end

module InstanceMethods

def dns?
9bb4e25f Ohad Levy
!domain.nil? and !domain.proxy.nil? and managed?
90b83222 Ohad Levy
end

dd42df0a Ohad Levy
def reverse_dns?
!subnet.nil? and !subnet.dns_proxy.nil? and managed? and capabilities.include?(:build)
end

acb50a39 Ohad Levy
def dns_a_record
5265048e Paul Kelly
return unless dns? or @dns_a_record
acb50a39 Ohad Levy
@dns_a_record ||= Net::DNS::ARecord.new dns_record_attrs
90b83222 Ohad Levy
end

acb50a39 Ohad Levy
def dns_ptr_record
dd42df0a Ohad Levy
return unless reverse_dns? or @dns_ptr_record
@dns_ptr_record ||= Net::DNS::PTRRecord.new reverse_dns_record_attrs
90b83222 Ohad Levy
end

acb50a39 Ohad Levy
protected
90b83222 Ohad Levy
acb50a39 Ohad Levy
def set_dns_a_record
dns_a_record.create
90b83222 Ohad Levy
end

30ae12bf Ohad Levy
def set_conflicting_dns_a_record
dns_a_record.conflicts.each { |c| c.create }
end

acb50a39 Ohad Levy
def set_dns_ptr_record
dns_ptr_record.create
90b83222 Ohad Levy
end

30ae12bf Ohad Levy
def set_conflicting_dns_ptr_record
dns_ptr_record.conflicts.each { |c| c.create }
end

acb50a39 Ohad Levy
def del_dns_a_record
dns_a_record.destroy
end
90b83222 Ohad Levy
30ae12bf Ohad Levy
def del_conflicting_dns_a_record
dns_a_record.conflicts.each { |c| c.destroy }
end

acb50a39 Ohad Levy
def del_dns_ptr_record
dns_ptr_record.destroy
90b83222 Ohad Levy
end

30ae12bf Ohad Levy
def del_conflicting_dns_ptr_record
dns_ptr_record.conflicts.each { |c| c.destroy }
90b83222 Ohad Levy
end

30ae12bf Ohad Levy
private

acb50a39 Ohad Levy
def dns_record_attrs
{ :hostname => name, :ip => ip, :resolver => domain.resolver, :proxy => domain.proxy }
90b83222 Ohad Levy
end

dd42df0a Ohad Levy
def reverse_dns_record_attrs
{ :hostname => name, :ip => ip, :proxy => subnet.dns_proxy }
end

90b83222 Ohad Levy
def queue_dns
dd42df0a Ohad Levy
return unless (dns? or reverse_dns?) and errors.empty?
ffb24832 Ohad Levy
queue_remove_dns_conflicts if overwrite?
90b83222 Ohad Levy
new_record? ? queue_dns_create : queue_dns_update
end

def queue_dns_create
30ae12bf Ohad Levy
logger.debug "Scheduling new DNS entries"
dd42df0a Ohad Levy
queue.create(:name => "Create DNS record for #{self}", :priority => 10,
acb50a39 Ohad Levy
:action => [self, :set_dns_a_record])
dd42df0a Ohad Levy
queue.create(:name => "Create Reverse DNS record for #{self}", :priority => 10,
:action => [self, :set_dns_ptr_record]) if reverse_dns?
90b83222 Ohad Levy
end

def queue_dns_update
if old.ip != ip or old.name != name
017a7d84 Ohad Levy
queue.create(:name => "Remove DNS record for #{old}", :priority => 9,
dd42df0a Ohad Levy
:action => [old, :del_dns_a_record]) if old.dns?
017a7d84 Ohad Levy
queue.create(:name => "Remove Reverse DNS record for #{old}", :priority => 9,
dd42df0a Ohad Levy
:action => [old, :del_dns_ptr_record]) if old.reverse_dns?
90b83222 Ohad Levy
queue_dns_create
end
end

def queue_dns_destroy
dd42df0a Ohad Levy
return unless errors.empty?
acb50a39 Ohad Levy
queue.create(:name => "Remove DNS record for #{self}", :priority => 1,
dd42df0a Ohad Levy
:action => [self, :del_dns_a_record]) if dns?
acb50a39 Ohad Levy
queue.create(:name => "Remove Reverse DNS record for #{self}", :priority => 1,
dd42df0a Ohad Levy
:action => [self, :del_dns_ptr_record]) if reverse_dns?
90b83222 Ohad Levy
end

30ae12bf Ohad Levy
def queue_remove_dns_conflicts
dd42df0a Ohad Levy
return unless errors.empty?
30ae12bf Ohad Levy
return unless overwrite?
logger.debug "Scheduling DNS conflict removal"
ffb24832 Ohad Levy
queue.create(:name => "Remove conflicting DNS record for #{self}", :priority => 0,
dd42df0a Ohad Levy
:action => [self, :del_conflicting_dns_a_record]) if dns? and dns_a_record and dns_a_record.conflicting?
ffb24832 Ohad Levy
queue.create(:name => "Remove conflicting Reverse DNS record for #{self}", :priority => 0,
dd42df0a Ohad Levy
:action => [self, :del_conflicting_dns_ptr_record]) if reverse_dns? and dns_ptr_record and dns_ptr_record.conflicting?
30ae12bf Ohad Levy
end

def dns_conflict_detected?
ffb24832 Ohad Levy
return false if ip.blank? or name.blank?
# can't validate anything if dont have an ip-address yet
dd42df0a Ohad Levy
return false unless require_ip_validation?
ffb24832 Ohad Levy
# we should only alert on conflicts if overwrite mode is off
30ae12bf Ohad Levy
return false if overwrite?
ffb24832 Ohad Levy
30ae12bf Ohad Levy
status = true
ffb24832 Ohad Levy
status = failure("DNS A Record #{dns_a_record.conflicts[0]} already exists", nil, :conflict) if dns? and dns_a_record and dns_a_record.conflicting?
status &= failure("DNS PTR Record #{dns_ptr_record.conflicts[0]} already exists", nil, :conflict) if reverse_dns? and dns_ptr_record and dns_ptr_record.conflicting?
30ae12bf Ohad Levy
status
end

90b83222 Ohad Levy
end
end