At IAlloc backend guess state from admin state
authorKlaus Aehlig <aehlig@google.com>
Mon, 5 Oct 2015 14:55:27 +0000 (16:55 +0200)
committerKlaus Aehlig <aehlig@google.com>
Thu, 8 Oct 2015 13:10:19 +0000 (15:10 +0200)
At the IAlloc backend of htools we do not get the actual
state of the instance (as everything is state-of-record only).
However, we do get the administrative state. Therefore, by
assuming that for each instance the actual state is the one
corresponding to the administrated one, we can get a much better
description of the cluster than blindly assuming all instances
are running. Do so, whenever the admin_state is provided.

Signed-off-by: Klaus Aehlig <aehlig@google.com>
Reviewed-by: Lisa Velden <velden@google.com>

src/Ganeti/HTools/Backend/IAlloc.hs

index 9cf66a2..da547b0 100644 (file)
@@ -59,7 +59,8 @@ import Ganeti.HTools.CLI
 import Ganeti.HTools.Loader
 import Ganeti.HTools.Types
 import Ganeti.JSON
-import Ganeti.Types (EvacMode(ChangePrimary, ChangeSecondary))
+import Ganeti.Types ( EvacMode(ChangePrimary, ChangeSecondary)
+                    , adminStateFromRaw, AdminState(..))
 import Ganeti.Utils
 
 {-# ANN module "HLint: ignore Eta reduce" #-}
@@ -107,9 +108,13 @@ parseBaseInstance n a = do
   su    <- extract "spindle_use"
   nics  <- extract "nics" >>= toArray >>= asObjectList >>=
            mapM (parseNic n . fromJSObject)
-  return
-    (n,
-     Instance.create n mem disk disks vcpus Running tags True 0 0 dt su nics)
+  state <- (tryFromObj errorMessage a "admin_state" >>= adminStateFromRaw)
+           `mplus` Ok AdminUp
+  let getRunSt AdminOffline = StatusOffline
+      getRunSt AdminDown = StatusDown
+      getRunSt AdminUp = Running
+  return (n, Instance.create n mem disk disks vcpus (getRunSt state) tags
+             True 0 0 dt su nics)
 
 -- | Parses an instance as found in the cluster instance list.
 parseInstance :: NameAssoc -- ^ The node name-to-index association list