Fix disabling of user shutdown reporting
authorHrvoje Ribicic <riba@google.com>
Mon, 17 Aug 2015 18:24:24 +0000 (18:24 +0000)
committerHrvoje Ribicic <riba@google.com>
Wed, 19 Aug 2015 10:04:50 +0000 (12:04 +0200)
Unlike the Python-side query logic still used for more detailed
queries, the Haskell queries neglected to take into account the
user-shutdown cluster-level parameter, turning USER_DOWN reporting on
by default. This is especially bad considering that this parameter was
introduced to give time to users to adapt their automation to take the
new statuses into account. This patch makes the parameter usable,
albeit possibly too late.

Signed-off-by: Hrvoje Ribicic <riba@google.com>
Reviewed-by: Helga Velroyen <helgav@google.com>

src/Ganeti/Query/Instance.hs

index d4feb03..132b31b 100644 (file)
@@ -693,6 +693,10 @@ isPrimaryOffline cfg inst =
      Ok pNode -> nodeOffline pNode
      Bad    _ -> error "Programmer error - result assumed to be OK is Bad!"
 
+-- | Determines if user shutdown reporting is enabled
+userShutdownEnabled :: ConfigData -> Bool
+userShutdownEnabled = clusterEnabledUserShutdown . configCluster
+
 -- | Determines the status of a live instance
 liveInstanceStatus :: ConfigData
                    -> (InstanceInfo, Bool)
@@ -716,18 +720,20 @@ liveInstanceStatus cfg (instInfo, foundOnPrimary) inst
           fromContainer $ getFilledInstHvParams (C.toList C.hvcGlobals) cfg inst
 
         allowDown =
-          instHypervisor inst /= Kvm ||
-          (Map.member C.hvKvmUserShutdown hvparams &&
-           hvparams Map.! C.hvKvmUserShutdown == J.JSBool True)
+          userShutdownEnabled cfg &&
+          (instHypervisor inst /= Kvm ||
+           (Map.member C.hvKvmUserShutdown hvparams &&
+            hvparams Map.! C.hvKvmUserShutdown == J.JSBool True))
 
 -- | Determines the status of a dead instance.
-deadInstanceStatus :: Instance -> InstanceStatus
-deadInstanceStatus inst =
+deadInstanceStatus :: ConfigData -> Instance -> InstanceStatus
+deadInstanceStatus cfg inst =
   case instAdminState inst of
     AdminUp -> ErrorDown
-    AdminDown | instAdminStateSource inst == UserSource -> UserDown
+    AdminDown | wasCleanedUp && userShutdownEnabled cfg -> UserDown
               | otherwise -> StatusDown
     AdminOffline -> StatusOffline
+  where wasCleanedUp = instAdminStateSource inst == UserSource
 
 -- | Determines the status of the instance, depending on whether it is possible
 -- to communicate with its primary node, on which node it is, and its
@@ -741,7 +747,7 @@ determineInstanceStatus cfg res inst
   | otherwise = case res of
       Left _                   -> NodeDown
       Right (Just liveData, _) -> liveInstanceStatus cfg liveData inst
-      Right (Nothing, _)       -> deadInstanceStatus inst
+      Right (Nothing, _)       -> deadInstanceStatus cfg inst
 
 -- | Extracts the instance status, retrieving it using the functions above and
 -- transforming it into a 'ResultEntry'.