Add Cluster.splitCluster for node groups
[ganeti-local] / Ganeti / HTools / Types.hs
index dd15fb6..200163b 100644 (file)
@@ -4,7 +4,7 @@
 
 {-
 
-Copyright (C) 2009 Google Inc.
+Copyright (C) 2009, 2010 Google Inc.
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -29,11 +29,19 @@ module Ganeti.HTools.Types
     , NameAssoc
     , Score
     , Weight
+    , GroupID
+    , RSpec(..)
     , DynUtil(..)
     , zeroUtil
     , baseUtil
     , addUtil
     , subUtil
+    , defVcpuRatio
+    , defReservedDiskRatio
+    , unitMem
+    , unitCpu
+    , unitDsk
+    , unknownField
     , Placement
     , IMove(..)
     , MoveJob
@@ -62,14 +70,24 @@ type Score = Double
 -- | A separate name for a weight metric.
 type Weight = Double
 
+-- | The Group UUID type
+type GroupID = String
+
+-- | The resource spec type.
+data RSpec = RSpec
+    { rspecCpu  :: Int  -- ^ Requested VCPUs
+    , rspecMem  :: Int  -- ^ Requested memory
+    , rspecDsk  :: Int  -- ^ Requested disk
+    } deriving (Show, Eq)
+
 -- | The dynamic resource specs of a machine (i.e. load or load
 -- capacity, as opposed to size).
 data DynUtil = DynUtil
     { cpuWeight :: Weight -- ^ Standardised CPU usage
     , memWeight :: Weight -- ^ Standardised memory load
-    , dskWeight :: Weight -- ^ Standardised disk I/O usage
+    , dskWeight :: Weight -- ^ Standardised disk I\/O usage
     , netWeight :: Weight -- ^ Standardised network usage
-    } deriving (Show)
+    } deriving (Show, Eq)
 
 -- | Initial empty utilisation
 zeroUtil :: DynUtil
@@ -105,6 +123,10 @@ data IMove = Failover                -- ^ Failover the instance (f)
 -- commands
 type MoveJob = ([Ndx], Idx, IMove, [String])
 
+-- | Unknown field in table output
+unknownField :: String
+unknownField = "<unknown field>"
+
 -- | A list of command elements
 type JobSet = [MoveJob]
 
@@ -116,6 +138,26 @@ connTimeout = 15
 queryTimeout :: Int
 queryTimeout = 60
 
+-- | Default vcpu-to-pcpu ratio (randomly chosen value).
+defVcpuRatio :: Double
+defVcpuRatio = 64
+
+-- | Default max disk usage ratio.
+defReservedDiskRatio :: Double
+defReservedDiskRatio = 0
+
+-- | Base memory unit.
+unitMem :: Int
+unitMem = 64
+
+-- | Base disk unit.
+unitDsk :: Int
+unitDsk = 256
+
+-- | Base vcpus unit.
+unitCpu :: Int
+unitCpu = 1
+
 {-|
 
 This is similar to the JSON library Result type - *very* similar, but
@@ -139,6 +181,7 @@ data FailMode = FailMem  -- ^ Failed due to not enough RAM
               | FailDisk -- ^ Failed due to not enough disk
               | FailCPU  -- ^ Failed due to not enough CPU capacity
               | FailN1   -- ^ Failed due to not passing N1 checks
+              | FailTags -- ^ Failed due to tag exclusion
                 deriving (Eq, Enum, Bounded, Show)
 
 -- | List with failure statistics
@@ -147,6 +190,7 @@ type FailStats = [(FailMode, Int)]
 -- | Either-like data-type customized for our failure modes
 data OpResult a = OpFail FailMode -- ^ Failed operation
                 | OpGood a        -- ^ Success operation
+                  deriving (Show)
 
 instance Monad OpResult where
     (OpGood x) >>= fn = fn x
@@ -157,9 +201,17 @@ instance Monad OpResult where
 class Element a where
     -- | Returns the name of the element
     nameOf  :: a -> String
+    -- | Returns all the known names of the element
+    allNames :: a -> [String]
     -- | Returns the index of the element
     idxOf   :: a -> Int
-    -- | Updates the name of the element
-    setName :: a -> String -> a
+    -- | Updates the alias of the element
+    setAlias :: a -> String -> a
+    -- | Compute the alias by stripping a given suffix (domain) from
+    -- | the name
+    computeAlias :: String -> a -> a
+    computeAlias dom e = setAlias e alias
+        where alias = take (length name - length dom) name
+              name = nameOf e
     -- | Updates the index of the element
     setIdx  :: a -> Int -> a