[Ovirt-devel] [PATCH server] Use DNS SRV records for qpidd on appliance

Ian Main imain at redhat.com
Wed Feb 11 19:12:08 UTC 2009


This patch makes taskomatic and dbomatic etc. use dns srv records
when connecting to qpidd.  This fixes the installer problems we
were seeing when connecting to various host names.

Signed-off-by: Ian Main <imain at redhat.com>
---
 src/db-omatic/db_omatic.rb    |    6 +++++-
 src/dutils/dutils.rb          |   32 ++++++++++++++++++++++++++++++++
 src/qmf-libvirt-example.rb    |    5 ++++-
 src/task-omatic/taskomatic.rb |    7 +++++--
 4 files changed, 46 insertions(+), 4 deletions(-)

diff --git a/src/db-omatic/db_omatic.rb b/src/db-omatic/db_omatic.rb
index 06adc19..845a714 100755
--- a/src/db-omatic/db_omatic.rb
+++ b/src/db-omatic/db_omatic.rb
@@ -327,8 +327,12 @@ def main()
     get_credentials('qpidd')
 
     dbsync = DbOmatic.new()
+
+    server, port = get_srv('qpidd', 'tcp')
+    raise "Unable to determine qpid server from DNS SRV record" if not server
+
     s = Qpid::Qmf::Session.new(:console => dbsync, :rcv_events => false)
-    b = s.add_broker("amqp://management.priv.ovirt.org:5672", :mechanism => 'GSSAPI')
+    b = s.add_broker("amqp://#{server}:#{port}", :mechanism => 'GSSAPI')
 
     dbsync.db_init_cleanup()
 
diff --git a/src/dutils/dutils.rb b/src/dutils/dutils.rb
index 6df2f06..5b2ac50 100644
--- a/src/dutils/dutils.rb
+++ b/src/dutils/dutils.rb
@@ -18,6 +18,8 @@
 
 require 'active_record_env'
 require 'krb5_auth'
+require 'resolv'
+
 include Krb5Auth
 
 ENV['KRB5CCNAME'] = '/usr/share/ovirt-server/ovirt-cc'
@@ -56,3 +58,33 @@ def get_credentials(service = 'libvirt')
     end
   end
 end
+
+# Returns the server and port of the specified service using DNS SRV records
+# to perform the look up.
+#
+# For example:
+#
+# server, port = get_srv('qpidd', 'tcp')
+#
+def get_srv(service, proto)
+  server = nil
+  port = nil
+
+  Resolv::DNS.open do |dns|
+    begin
+      hostname = Socket.gethostbyname(Socket.gethostname).first
+      lst = hostname.split('.')
+      lst.shift
+      domainname = lst.join('.')
+      res = dns.getresource("_#{service}._#{proto}.#{domainname}", Resolv::DNS::Resource::IN::SRV)
+      server = res.target.to_s
+      port = res.port
+    rescue => ex
+      puts "Error looking up SRV record: #{ex}"
+    end
+    dns.close
+  end
+
+  return server, port
+end
+
diff --git a/src/qmf-libvirt-example.rb b/src/qmf-libvirt-example.rb
index f8d6aca..64e3ba7 100644
--- a/src/qmf-libvirt-example.rb
+++ b/src/qmf-libvirt-example.rb
@@ -8,8 +8,11 @@ require "dutils"
 
 get_credentials('qpidd')
 
+server, port = get_srv('qpidd', 'tcp')
+raise "Unable to determine qpid server from DNS SRV record" if not server
+
 s = Qpid::Qmf::Session.new()
-b = s.add_broker("amqp://management.priv.ovirt.org:5672", :mechanism => 'GSSAPI')
+b = s.add_broker("amqp://#{server}:#{port}", :mechanism => 'GSSAPI')
 
 while true:
     nodes = s.objects(:class => "node")
diff --git a/src/task-omatic/taskomatic.rb b/src/task-omatic/taskomatic.rb
index 79e2082..77fe6da 100755
--- a/src/task-omatic/taskomatic.rb
+++ b/src/task-omatic/taskomatic.rb
@@ -47,8 +47,11 @@ class TaskOmatic
     @nth_host = 0
 
     @session = Qpid::Qmf::Session.new()
-    # FIXME: Should come from some kind of config or DNS SRV or what have you.
-    @broker = @session.add_broker("amqp://management.priv.ovirt.org:5672", :mechanism => 'GSSAPI')
+
+    server, port = get_srv('qpidd', 'tcp')
+    raise "Unable to determine qpid server from DNS SRV record" if not server
+
+    @broker = @session.add_broker("amqp://#{server}:#{port}", :mechanism => 'GSSAPI')
 
     do_daemon = true
 
-- 
1.6.0.4




More information about the ovirt-devel mailing list