Project

General

Profile

Download (4.12 KB) Statistics
| Branch: | Tag: | Revision:
90b83222 Ohad Levy
module Orchestration::DNS
dc457681 Joseph Mitchell Magen
extend ActiveSupport::Concern
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
included do
after_validation :dns_conflict_detected?, :queue_dns
before_destroy :queue_dns_destroy
end
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
def dns?
0ef59e67 Trey Dockendorf
hostname.present? and ip_available? and !domain.nil? and !domain.proxy.nil? and managed?
dc457681 Joseph Mitchell Magen
end
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
def reverse_dns?
0ef59e67 Trey Dockendorf
hostname.present? and ip_available? and !subnet.nil? and subnet.dns? and managed?
dc457681 Joseph Mitchell Magen
end
dd42df0a Ohad Levy
dc457681 Joseph Mitchell Magen
def dns_a_record
return unless dns? or @dns_a_record
@dns_a_record ||= Net::DNS::ARecord.new dns_record_attrs
end
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
def dns_ptr_record
return unless reverse_dns? or @dns_ptr_record
@dns_ptr_record ||= Net::DNS::PTRRecord.new reverse_dns_record_attrs
end
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
protected
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
def set_dns_a_record
dns_a_record.create
end
30ae12bf Ohad Levy
dc457681 Joseph Mitchell Magen
def set_conflicting_dns_a_record
dns_a_record.conflicts.each { |c| c.create }
end
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
def set_dns_ptr_record
dns_ptr_record.create
end
30ae12bf Ohad Levy
dc457681 Joseph Mitchell Magen
def set_conflicting_dns_ptr_record
dns_ptr_record.conflicts.each { |c| c.create }
end
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
def del_dns_a_record
dns_a_record.destroy
end
30ae12bf Ohad Levy
dc457681 Joseph Mitchell Magen
def del_conflicting_dns_a_record
dns_a_record.conflicts.each { |c| c.destroy }
end
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
def del_dns_ptr_record
dns_ptr_record.destroy
end
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
def del_conflicting_dns_ptr_record
dns_ptr_record.conflicts.each { |c| c.destroy }
end
30ae12bf Ohad Levy
dc457681 Joseph Mitchell Magen
private
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
def dns_record_attrs
0ef59e67 Trey Dockendorf
{ :hostname => hostname, :ip => ip, :resolver => domain.resolver, :proxy => domain.proxy }
dc457681 Joseph Mitchell Magen
end
dd42df0a Ohad Levy
dc457681 Joseph Mitchell Magen
def reverse_dns_record_attrs
0ef59e67 Trey Dockendorf
{ :hostname => hostname, :ip => ip, :proxy => subnet.dns_proxy }
dc457681 Joseph Mitchell Magen
end
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
def queue_dns
return unless (dns? or reverse_dns?) and errors.empty?
queue_remove_dns_conflicts if overwrite?
new_record? ? queue_dns_create : queue_dns_update
end
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
def queue_dns_create
logger.debug "Scheduling new DNS entries"
queue.create(:name => _("Create DNS record for %s") % self, :priority => 10,
:action => [self, :set_dns_a_record]) if dns?
queue.create(:name => _("Create Reverse DNS record for %s") % self, :priority => 10,
:action => [self, :set_dns_ptr_record]) if reverse_dns?
end
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
def queue_dns_update
0ef59e67 Trey Dockendorf
if old.ip != ip or old.hostname != hostname
dc457681 Joseph Mitchell Magen
queue.create(:name => _("Remove DNS record for %s") % old, :priority => 9,
:action => [old, :del_dns_a_record]) if old.dns?
queue.create(:name => _("Remove Reverse DNS record for %s") % old, :priority => 9,
:action => [old, :del_dns_ptr_record]) if old.reverse_dns?
queue_dns_create
90b83222 Ohad Levy
end
dc457681 Joseph Mitchell Magen
end
90b83222 Ohad Levy
dc457681 Joseph Mitchell Magen
def queue_dns_destroy
return unless errors.empty?
queue.create(:name => _("Remove DNS record for %s") % self, :priority => 1,
:action => [self, :del_dns_a_record]) if dns?
queue.create(:name => _("Remove Reverse DNS record for %s") % self, :priority => 1,
:action => [self, :del_dns_ptr_record]) if reverse_dns?
end
30ae12bf Ohad Levy
dc457681 Joseph Mitchell Magen
def queue_remove_dns_conflicts
return unless errors.empty?
return unless overwrite?
logger.debug "Scheduling DNS conflict removal"
queue.create(:name => _("Remove conflicting DNS record for %s") % self, :priority => 0,
:action => [self, :del_conflicting_dns_a_record]) if dns? and dns_a_record and dns_a_record.conflicting?
queue.create(:name => _("Remove conflicting Reverse DNS record for %s") % self, :priority => 0,
:action => [self, :del_conflicting_dns_ptr_record]) if reverse_dns? and dns_ptr_record and dns_ptr_record.conflicting?
end
30ae12bf Ohad Levy
dc457681 Joseph Mitchell Magen
def dns_conflict_detected?
0ef59e67 Trey Dockendorf
return false if ip.blank? or hostname.blank?
dc457681 Joseph Mitchell Magen
# can't validate anything if dont have an ip-address yet
return false unless require_ip_validation?
# we should only alert on conflicts if overwrite mode is off
return false if overwrite?

status = true
status = failure(_("DNS A Records %s already exists") % dns_a_record.conflicts.to_sentence, nil, :conflict) if dns? and dns_a_record and dns_a_record.conflicting?
90ff2a3a Dmitri Dolguikh
status = failure(_("DNS PTR Records %s already exists") % dns_ptr_record.conflicts.to_sentence, nil, :conflict) if reverse_dns? and dns_ptr_record and dns_ptr_record.conflicting?
not status #failure method returns 'false'
dc457681 Joseph Mitchell Magen
end
3b6d1527 Ohad Levy
90b83222 Ohad Levy
end