Use FQDN to check master node status
authorThomas Thrainer <thomasth@google.com>
Tue, 13 Aug 2013 07:50:42 +0000 (09:50 +0200)
committerThomas Thrainer <thomasth@google.com>
Tue, 13 Aug 2013 09:04:11 +0000 (11:04 +0200)
The master node name in SS conf is stored as FQDN, so also use the FQDN
on each node to check if it is the master node.

This fixes issue 551.

Signed-off-by: Thomas Thrainer <thomasth@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

src/Ganeti/Daemon.hs

index 6f9db4a..ada57eb 100644 (file)
@@ -47,7 +47,7 @@ module Ganeti.Daemon
 
 import Control.Exception
 import Control.Monad
-import Data.Maybe (fromMaybe)
+import Data.Maybe (fromMaybe, listToMaybe)
 import Data.Word
 import GHC.IO.Handle (hDuplicateTo)
 import Network.BSD (getHostName)
@@ -297,6 +297,17 @@ parseAddress opts defport = do
 vClusterHostNameEnvVar :: String
 vClusterHostNameEnvVar = "GANETI_HOSTNAME"
 
+getFQDN :: IO String
+getFQDN = do
+  hostname <- getHostName
+  addrInfos <- Socket.getAddrInfo Nothing (Just hostname) Nothing
+  let address = listToMaybe addrInfos >>= (Just . Socket.addrAddress)
+  case address of
+    Just a -> do
+      fqdn <- liftM fst $ Socket.getNameInfo [] True False a
+      return (fromMaybe hostname fqdn)
+    Nothing -> return hostname
+
 -- | Returns if the current node is the master node.
 isMaster :: IO Bool
 isMaster = do
@@ -307,7 +318,7 @@ isMaster = do
                      ioErrorToNothing
   curNode <- case vcluster_node of
     Just node_name -> return node_name
-    Nothing -> getHostName
+    Nothing -> getFQDN
   masterNode <- Ssconf.getMasterNode Nothing
   case masterNode of
     Ok n -> return (curNode == n)