Reduce the warnings during the unittests
[ganeti-local] / Ganeti / HTools / Instance.hs
index 72b27da..6bcf88e 100644 (file)
@@ -33,10 +33,14 @@ module Ganeti.HTools.Instance
     , create
     , setIdx
     , setName
+    , setAlias
     , setPri
     , setSec
     , setBoth
+    , setMovable
+    , specOf
     , shrinkByType
+    , runningStates
     ) where
 
 import qualified Ganeti.HTools.Types as T
@@ -46,6 +50,7 @@ import qualified Ganeti.HTools.Container as Container
 
 -- | The instance type
 data Instance = Instance { name :: String    -- ^ The instance name
+                         , alias :: String   -- ^ The shortened name
                          , mem :: Int        -- ^ Memory of the instance
                          , dsk :: Int        -- ^ Disk size of instance
                          , vcpus :: Int      -- ^ Number of VCPUs
@@ -55,23 +60,20 @@ data Instance = Instance { name :: String    -- ^ The instance name
                          , sNode :: T.Ndx    -- ^ Original secondary node
                          , idx :: T.Idx      -- ^ Internal index
                          , util :: T.DynUtil -- ^ Dynamic resource usage
+                         , movable :: Bool   -- ^ Can the instance be moved?
+                         , tags :: [String]  -- ^ List of instance tags
                          } deriving (Show)
 
 instance T.Element Instance where
-    nameOf  = name
-    idxOf   = idx
-    setName = setName
-    setIdx  = setIdx
-
--- | Base memory unit.
-unitMem :: Int
-unitMem = 64
--- | Base disk unit.
-unitDsk :: Int
-unitDsk = 256
--- | Base vcpus unit.
-unitCpu :: Int
-unitCpu = 1
+    nameOf   = name
+    idxOf    = idx
+    setAlias = setAlias
+    setIdx   = setIdx
+    allNames n = [name n, alias n]
+
+-- | Running instance states.
+runningStates :: [String]
+runningStates = ["running", "ERROR_up"]
 
 -- | A simple name for the int, instance association list.
 type AssocList = [(T.Idx, Instance)]
@@ -85,18 +87,22 @@ type List = Container.Container Instance
 --
 -- Some parameters are not initialized by function, and must be set
 -- later (via 'setIdx' for example).
-create :: String -> Int -> Int -> Int -> String -> T.Ndx -> T.Ndx -> Instance
-create name_init mem_init dsk_init vcpus_init run_init pn sn =
+create :: String -> Int -> Int -> Int -> String
+       -> [String] -> T.Ndx -> T.Ndx -> Instance
+create name_init mem_init dsk_init vcpus_init run_init tags_init pn sn =
     Instance { name = name_init
+             , alias = name_init
              , mem = mem_init
              , dsk = dsk_init
              , vcpus = vcpus_init
-             , running = run_init == "running" || run_init == "ERROR_up"
+             , running = run_init `elem` runningStates
              , runSt = run_init
              , pNode = pn
              , sNode = sn
              , idx = -1
-             , util = T.zeroUtil
+             , util = T.baseUtil
+             , tags = tags_init
+             , movable = True
              }
 
 -- | Changes the index.
@@ -113,7 +119,15 @@ setIdx t i = t { idx = i }
 setName :: Instance -- ^ The original instance
         -> String   -- ^ New name
         -> Instance -- ^ The modified instance
-setName t s = t { name = s }
+setName t s = t { name = s, alias = s }
+
+-- | Changes the alias.
+--
+-- This is used only during the building of the data structures.
+setAlias :: Instance -- ^ The original instance
+         -> String   -- ^ New alias
+         -> Instance -- ^ The modified instance
+setAlias t s = t { alias = s }
 
 -- * Update functions
 
@@ -136,19 +150,29 @@ setBoth :: Instance  -- ^ the original instance
          -> Instance -- ^ the modified instance
 setBoth t p s = t { pNode = p, sNode = s }
 
+setMovable :: Instance -- ^ The original instance
+           -> Bool     -- ^ New movable flag
+           -> Instance -- ^ The modified instance
+setMovable t m = t { movable = m }
+
 -- | Try to shrink the instance based on the reason why we can't
 -- allocate it.
 shrinkByType :: Instance -> T.FailMode -> T.Result Instance
-shrinkByType inst T.FailMem = let v = mem inst - unitMem
-                              in if v < unitMem
+shrinkByType inst T.FailMem = let v = mem inst - T.unitMem
+                              in if v < T.unitMem
                                  then T.Bad "out of memory"
                                  else T.Ok inst { mem = v }
-shrinkByType inst T.FailDisk = let v = dsk inst - unitDsk
-                               in if v < unitDsk
+shrinkByType inst T.FailDisk = let v = dsk inst - T.unitDsk
+                               in if v < T.unitDsk
                                   then T.Bad "out of disk"
                                   else T.Ok inst { dsk = v }
-shrinkByType inst T.FailCPU = let v = vcpus inst - unitCpu
-                              in if v < unitCpu
+shrinkByType inst T.FailCPU = let v = vcpus inst - T.unitCpu
+                              in if v < T.unitCpu
                                  then T.Bad "out of vcpus"
                                  else T.Ok inst { vcpus = v }
 shrinkByType _ f = T.Bad $ "Unhandled failure mode " ++ show f
+
+-- | Return the spec of an instance.
+specOf :: Instance -> T.RSpec
+specOf Instance { mem = m, dsk = d, vcpus = c } =
+    T.RSpec { T.rspecCpu = c, T.rspecMem = m, T.rspecDsk = d }