Statistics
| Branch: | Tag: | Revision:

root / htools / Ganeti / HTools / Types.hs @ f3f76ccc

History | View | Annotate | Download (8.4 kB)

1 e9aaa3c6 Iustin Pop
{-# LANGUAGE TemplateHaskell #-}
2 e9aaa3c6 Iustin Pop
3 e4c5beaf Iustin Pop
{-| Some common types.
4 e4c5beaf Iustin Pop
5 e4c5beaf Iustin Pop
-}
6 e4c5beaf Iustin Pop
7 e2fa2baf Iustin Pop
{-
8 e2fa2baf Iustin Pop
9 2e5eb96a Iustin Pop
Copyright (C) 2009, 2010, 2011 Google Inc.
10 e2fa2baf Iustin Pop
11 e2fa2baf Iustin Pop
This program is free software; you can redistribute it and/or modify
12 e2fa2baf Iustin Pop
it under the terms of the GNU General Public License as published by
13 e2fa2baf Iustin Pop
the Free Software Foundation; either version 2 of the License, or
14 e2fa2baf Iustin Pop
(at your option) any later version.
15 e2fa2baf Iustin Pop
16 e2fa2baf Iustin Pop
This program is distributed in the hope that it will be useful, but
17 e2fa2baf Iustin Pop
WITHOUT ANY WARRANTY; without even the implied warranty of
18 e2fa2baf Iustin Pop
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19 e2fa2baf Iustin Pop
General Public License for more details.
20 e2fa2baf Iustin Pop
21 e2fa2baf Iustin Pop
You should have received a copy of the GNU General Public License
22 e2fa2baf Iustin Pop
along with this program; if not, write to the Free Software
23 e2fa2baf Iustin Pop
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24 e2fa2baf Iustin Pop
02110-1301, USA.
25 e2fa2baf Iustin Pop
26 e2fa2baf Iustin Pop
-}
27 e2fa2baf Iustin Pop
28 e4c5beaf Iustin Pop
module Ganeti.HTools.Types
29 ebf38064 Iustin Pop
  ( Idx
30 ebf38064 Iustin Pop
  , Ndx
31 ebf38064 Iustin Pop
  , Gdx
32 ebf38064 Iustin Pop
  , NameAssoc
33 ebf38064 Iustin Pop
  , Score
34 ebf38064 Iustin Pop
  , Weight
35 ebf38064 Iustin Pop
  , GroupID
36 f3f76ccc Iustin Pop
  , defaultGroupID
37 ebf38064 Iustin Pop
  , AllocPolicy(..)
38 ebf38064 Iustin Pop
  , allocPolicyFromRaw
39 ebf38064 Iustin Pop
  , allocPolicyToRaw
40 ebf38064 Iustin Pop
  , InstanceStatus(..)
41 ebf38064 Iustin Pop
  , instanceStatusFromRaw
42 ebf38064 Iustin Pop
  , instanceStatusToRaw
43 ebf38064 Iustin Pop
  , RSpec(..)
44 ebf38064 Iustin Pop
  , DynUtil(..)
45 ebf38064 Iustin Pop
  , zeroUtil
46 ebf38064 Iustin Pop
  , baseUtil
47 ebf38064 Iustin Pop
  , addUtil
48 ebf38064 Iustin Pop
  , subUtil
49 ebf38064 Iustin Pop
  , defVcpuRatio
50 ebf38064 Iustin Pop
  , defReservedDiskRatio
51 ebf38064 Iustin Pop
  , unitMem
52 ebf38064 Iustin Pop
  , unitCpu
53 ebf38064 Iustin Pop
  , unitDsk
54 ebf38064 Iustin Pop
  , unknownField
55 ebf38064 Iustin Pop
  , Placement
56 ebf38064 Iustin Pop
  , IMove(..)
57 ebf38064 Iustin Pop
  , DiskTemplate(..)
58 ebf38064 Iustin Pop
  , diskTemplateToRaw
59 ebf38064 Iustin Pop
  , diskTemplateFromRaw
60 ebf38064 Iustin Pop
  , MoveJob
61 ebf38064 Iustin Pop
  , JobSet
62 ebf38064 Iustin Pop
  , Result(..)
63 ebf38064 Iustin Pop
  , isOk
64 ebf38064 Iustin Pop
  , isBad
65 ebf38064 Iustin Pop
  , eitherToResult
66 f3f76ccc Iustin Pop
  , annotateResult
67 ebf38064 Iustin Pop
  , Element(..)
68 ebf38064 Iustin Pop
  , FailMode(..)
69 ebf38064 Iustin Pop
  , FailStats
70 ebf38064 Iustin Pop
  , OpResult(..)
71 ebf38064 Iustin Pop
  , opToResult
72 ebf38064 Iustin Pop
  , connTimeout
73 ebf38064 Iustin Pop
  , queryTimeout
74 ebf38064 Iustin Pop
  , EvacMode(..)
75 ebf38064 Iustin Pop
  ) where
76 e4c5beaf Iustin Pop
77 2d0ca2c5 Iustin Pop
import qualified Data.Map as M
78 b2ba4669 Iustin Pop
import qualified Text.JSON as JSON
79 2d0ca2c5 Iustin Pop
80 2e5eb96a Iustin Pop
import qualified Ganeti.Constants as C
81 e9aaa3c6 Iustin Pop
import qualified Ganeti.THH as THH
82 0c37d1e4 Iustin Pop
import Ganeti.BasicTypes
83 2e5eb96a Iustin Pop
84 9188aeef Iustin Pop
-- | The instance index type.
85 608efcce Iustin Pop
type Idx = Int
86 608efcce Iustin Pop
87 9188aeef Iustin Pop
-- | The node index type.
88 608efcce Iustin Pop
type Ndx = Int
89 608efcce Iustin Pop
90 0dc1bf87 Iustin Pop
-- | The group index type.
91 0dc1bf87 Iustin Pop
type Gdx = Int
92 0dc1bf87 Iustin Pop
93 9188aeef Iustin Pop
-- | The type used to hold name-to-idx mappings.
94 2d0ca2c5 Iustin Pop
type NameAssoc = M.Map String Int
95 e4c5beaf Iustin Pop
96 92e32d76 Iustin Pop
-- | A separate name for the cluster score type.
97 92e32d76 Iustin Pop
type Score = Double
98 92e32d76 Iustin Pop
99 2180829f Iustin Pop
-- | A separate name for a weight metric.
100 2180829f Iustin Pop
type Weight = Double
101 2180829f Iustin Pop
102 0dc1bf87 Iustin Pop
-- | The Group UUID type.
103 c4d98278 Iustin Pop
type GroupID = String
104 c4d98278 Iustin Pop
105 f3f76ccc Iustin Pop
-- | Default group UUID (just a string, not a real UUID).
106 f3f76ccc Iustin Pop
defaultGroupID :: GroupID
107 f3f76ccc Iustin Pop
defaultGroupID = "00000000-0000-0000-0000-000000000000"
108 f3f76ccc Iustin Pop
109 0dc1bf87 Iustin Pop
-- | The Group allocation policy type.
110 73206d0a Iustin Pop
--
111 73206d0a Iustin Pop
-- Note that the order of constructors is important as the automatic
112 73206d0a Iustin Pop
-- Ord instance will order them in the order they are defined, so when
113 73206d0a Iustin Pop
-- changing this data type be careful about the interaction with the
114 73206d0a Iustin Pop
-- desired sorting order.
115 e9aaa3c6 Iustin Pop
$(THH.declareSADT "AllocPolicy"
116 ebf38064 Iustin Pop
       [ ("AllocPreferred",   'C.allocPolicyPreferred)
117 ebf38064 Iustin Pop
       , ("AllocLastResort",  'C.allocPolicyLastResort)
118 ebf38064 Iustin Pop
       , ("AllocUnallocable", 'C.allocPolicyUnallocable)
119 ebf38064 Iustin Pop
       ])
120 e9aaa3c6 Iustin Pop
$(THH.makeJSONInstance ''AllocPolicy)
121 b2ba4669 Iustin Pop
122 3771d104 Agata Murawska
-- | The Instance real state type.
123 3771d104 Agata Murawska
$(THH.declareSADT "InstanceStatus"
124 ebf38064 Iustin Pop
       [ ("AdminDown", 'C.inststAdmindown)
125 ebf38064 Iustin Pop
       , ("AdminOffline", 'C.inststAdminoffline)
126 ebf38064 Iustin Pop
       , ("ErrorDown", 'C.inststErrordown)
127 ebf38064 Iustin Pop
       , ("ErrorUp", 'C.inststErrorup)
128 ebf38064 Iustin Pop
       , ("NodeDown", 'C.inststNodedown)
129 ebf38064 Iustin Pop
       , ("NodeOffline", 'C.inststNodeoffline)
130 ebf38064 Iustin Pop
       , ("Running", 'C.inststRunning)
131 ebf38064 Iustin Pop
       , ("WrongNode", 'C.inststWrongnode)
132 ebf38064 Iustin Pop
       ])
133 3771d104 Agata Murawska
$(THH.makeJSONInstance ''InstanceStatus)
134 3771d104 Agata Murawska
135 1f9066c0 Iustin Pop
-- | The resource spec type.
136 1f9066c0 Iustin Pop
data RSpec = RSpec
137 ebf38064 Iustin Pop
  { rspecCpu  :: Int  -- ^ Requested VCPUs
138 ebf38064 Iustin Pop
  , rspecMem  :: Int  -- ^ Requested memory
139 ebf38064 Iustin Pop
  , rspecDsk  :: Int  -- ^ Requested disk
140 ebf38064 Iustin Pop
  } deriving (Show, Read, Eq)
141 1f9066c0 Iustin Pop
142 2180829f Iustin Pop
-- | The dynamic resource specs of a machine (i.e. load or load
143 2180829f Iustin Pop
-- capacity, as opposed to size).
144 2180829f Iustin Pop
data DynUtil = DynUtil
145 ebf38064 Iustin Pop
  { cpuWeight :: Weight -- ^ Standardised CPU usage
146 ebf38064 Iustin Pop
  , memWeight :: Weight -- ^ Standardised memory load
147 ebf38064 Iustin Pop
  , dskWeight :: Weight -- ^ Standardised disk I\/O usage
148 ebf38064 Iustin Pop
  , netWeight :: Weight -- ^ Standardised network usage
149 ebf38064 Iustin Pop
  } deriving (Show, Read, Eq)
150 2180829f Iustin Pop
151 525bfb36 Iustin Pop
-- | Initial empty utilisation.
152 2180829f Iustin Pop
zeroUtil :: DynUtil
153 2180829f Iustin Pop
zeroUtil = DynUtil { cpuWeight = 0, memWeight = 0
154 2180829f Iustin Pop
                   , dskWeight = 0, netWeight = 0 }
155 2180829f Iustin Pop
156 525bfb36 Iustin Pop
-- | Base utilisation (used when no actual utilisation data is
157 525bfb36 Iustin Pop
-- supplied).
158 ee9724b9 Iustin Pop
baseUtil :: DynUtil
159 ee9724b9 Iustin Pop
baseUtil = DynUtil { cpuWeight = 1, memWeight = 1
160 ee9724b9 Iustin Pop
                   , dskWeight = 1, netWeight = 1 }
161 ee9724b9 Iustin Pop
162 525bfb36 Iustin Pop
-- | Sum two utilisation records.
163 2180829f Iustin Pop
addUtil :: DynUtil -> DynUtil -> DynUtil
164 2180829f Iustin Pop
addUtil (DynUtil a1 a2 a3 a4) (DynUtil b1 b2 b3 b4) =
165 ebf38064 Iustin Pop
  DynUtil (a1+b1) (a2+b2) (a3+b3) (a4+b4)
166 2180829f Iustin Pop
167 525bfb36 Iustin Pop
-- | Substracts one utilisation record from another.
168 2180829f Iustin Pop
subUtil :: DynUtil -> DynUtil -> DynUtil
169 2180829f Iustin Pop
subUtil (DynUtil a1 a2 a3 a4) (DynUtil b1 b2 b3 b4) =
170 ebf38064 Iustin Pop
  DynUtil (a1-b1) (a2-b2) (a3-b3) (a4-b4)
171 2180829f Iustin Pop
172 66dac8e0 Iustin Pop
-- | The description of an instance placement. It contains the
173 66dac8e0 Iustin Pop
-- instance index, the new primary and secondary node, the move being
174 66dac8e0 Iustin Pop
-- performed and the score of the cluster after the move.
175 66dac8e0 Iustin Pop
type Placement = (Idx, Ndx, Ndx, IMove, Score)
176 92e32d76 Iustin Pop
177 525bfb36 Iustin Pop
-- | An instance move definition.
178 92e32d76 Iustin Pop
data IMove = Failover                -- ^ Failover the instance (f)
179 92e32d76 Iustin Pop
           | ReplacePrimary Ndx      -- ^ Replace primary (f, r:np, f)
180 92e32d76 Iustin Pop
           | ReplaceSecondary Ndx    -- ^ Replace secondary (r:ns)
181 92e32d76 Iustin Pop
           | ReplaceAndFailover Ndx  -- ^ Replace secondary, failover (r:np, f)
182 92e32d76 Iustin Pop
           | FailoverAndReplace Ndx  -- ^ Failover, replace secondary (f, r:ns)
183 6bc39970 Iustin Pop
             deriving (Show, Read)
184 92e32d76 Iustin Pop
185 179c0828 Iustin Pop
-- | Instance disk template type.
186 e9aaa3c6 Iustin Pop
$(THH.declareSADT "DiskTemplate"
187 ebf38064 Iustin Pop
       [ ("DTDiskless",   'C.dtDiskless)
188 ebf38064 Iustin Pop
       , ("DTFile",       'C.dtFile)
189 ebf38064 Iustin Pop
       , ("DTSharedFile", 'C.dtSharedFile)
190 ebf38064 Iustin Pop
       , ("DTPlain",      'C.dtPlain)
191 ebf38064 Iustin Pop
       , ("DTBlock",      'C.dtBlock)
192 ebf38064 Iustin Pop
       , ("DTDrbd8",      'C.dtDrbd8)
193 ebf38064 Iustin Pop
       ])
194 e9aaa3c6 Iustin Pop
$(THH.makeJSONInstance ''DiskTemplate)
195 cc25e437 Iustin Pop
196 0e8ae201 Iustin Pop
-- | Formatted solution output for one move (involved nodes and
197 525bfb36 Iustin Pop
-- commands.
198 924f9c16 Iustin Pop
type MoveJob = ([Ndx], Idx, IMove, [String])
199 0e8ae201 Iustin Pop
200 525bfb36 Iustin Pop
-- | Unknown field in table output.
201 82ea2874 Iustin Pop
unknownField :: String
202 82ea2874 Iustin Pop
unknownField = "<unknown field>"
203 82ea2874 Iustin Pop
204 525bfb36 Iustin Pop
-- | A list of command elements.
205 0e8ae201 Iustin Pop
type JobSet = [MoveJob]
206 0e8ae201 Iustin Pop
207 135a6c6a Iustin Pop
-- | Connection timeout (when using non-file methods).
208 135a6c6a Iustin Pop
connTimeout :: Int
209 135a6c6a Iustin Pop
connTimeout = 15
210 135a6c6a Iustin Pop
211 135a6c6a Iustin Pop
-- | The default timeout for queries (when using non-file methods).
212 135a6c6a Iustin Pop
queryTimeout :: Int
213 135a6c6a Iustin Pop
queryTimeout = 60
214 135a6c6a Iustin Pop
215 f4c0b8c5 Iustin Pop
-- | Default vcpu-to-pcpu ratio (randomly chosen value).
216 f4c0b8c5 Iustin Pop
defVcpuRatio :: Double
217 f4c0b8c5 Iustin Pop
defVcpuRatio = 64
218 f4c0b8c5 Iustin Pop
219 f4c0b8c5 Iustin Pop
-- | Default max disk usage ratio.
220 f4c0b8c5 Iustin Pop
defReservedDiskRatio :: Double
221 f4c0b8c5 Iustin Pop
defReservedDiskRatio = 0
222 f4c0b8c5 Iustin Pop
223 1e3dccc8 Iustin Pop
-- | Base memory unit.
224 1e3dccc8 Iustin Pop
unitMem :: Int
225 1e3dccc8 Iustin Pop
unitMem = 64
226 1e3dccc8 Iustin Pop
227 1e3dccc8 Iustin Pop
-- | Base disk unit.
228 1e3dccc8 Iustin Pop
unitDsk :: Int
229 1e3dccc8 Iustin Pop
unitDsk = 256
230 1e3dccc8 Iustin Pop
231 1e3dccc8 Iustin Pop
-- | Base vcpus unit.
232 1e3dccc8 Iustin Pop
unitCpu :: Int
233 1e3dccc8 Iustin Pop
unitCpu = 1
234 1e3dccc8 Iustin Pop
235 525bfb36 Iustin Pop
-- | Reason for an operation's falure.
236 f2280553 Iustin Pop
data FailMode = FailMem  -- ^ Failed due to not enough RAM
237 f2280553 Iustin Pop
              | FailDisk -- ^ Failed due to not enough disk
238 f2280553 Iustin Pop
              | FailCPU  -- ^ Failed due to not enough CPU capacity
239 f2280553 Iustin Pop
              | FailN1   -- ^ Failed due to not passing N1 checks
240 5f0b9579 Iustin Pop
              | FailTags -- ^ Failed due to tag exclusion
241 6bc39970 Iustin Pop
                deriving (Eq, Enum, Bounded, Show, Read)
242 f2280553 Iustin Pop
243 525bfb36 Iustin Pop
-- | List with failure statistics.
244 478df686 Iustin Pop
type FailStats = [(FailMode, Int)]
245 478df686 Iustin Pop
246 525bfb36 Iustin Pop
-- | Either-like data-type customized for our failure modes.
247 a30b473c Iustin Pop
--
248 a30b473c Iustin Pop
-- The failure values for this monad track the specific allocation
249 a30b473c Iustin Pop
-- failures, so this is not a general error-monad (compare with the
250 a30b473c Iustin Pop
-- 'Result' data type). One downside is that this type cannot encode a
251 a30b473c Iustin Pop
-- generic failure mode, hence 'fail' for this monad is not defined
252 a30b473c Iustin Pop
-- and will cause an exception.
253 f2280553 Iustin Pop
data OpResult a = OpFail FailMode -- ^ Failed operation
254 f2280553 Iustin Pop
                | OpGood a        -- ^ Success operation
255 6bc39970 Iustin Pop
                  deriving (Show, Read)
256 f2280553 Iustin Pop
257 f2280553 Iustin Pop
instance Monad OpResult where
258 ebf38064 Iustin Pop
  (OpGood x) >>= fn = fn x
259 ebf38064 Iustin Pop
  (OpFail y) >>= _ = OpFail y
260 ebf38064 Iustin Pop
  return = OpGood
261 f2280553 Iustin Pop
262 a30b473c Iustin Pop
-- | Conversion from 'OpResult' to 'Result'.
263 a30b473c Iustin Pop
opToResult :: OpResult a -> Result a
264 a30b473c Iustin Pop
opToResult (OpFail f) = Bad $ show f
265 a30b473c Iustin Pop
opToResult (OpGood v) = Ok v
266 a30b473c Iustin Pop
267 9188aeef Iustin Pop
-- | A generic class for items that have updateable names and indices.
268 497e30a1 Iustin Pop
class Element a where
269 ebf38064 Iustin Pop
  -- | Returns the name of the element
270 ebf38064 Iustin Pop
  nameOf  :: a -> String
271 ebf38064 Iustin Pop
  -- | Returns all the known names of the element
272 ebf38064 Iustin Pop
  allNames :: a -> [String]
273 ebf38064 Iustin Pop
  -- | Returns the index of the element
274 ebf38064 Iustin Pop
  idxOf   :: a -> Int
275 ebf38064 Iustin Pop
  -- | Updates the alias of the element
276 ebf38064 Iustin Pop
  setAlias :: a -> String -> a
277 ebf38064 Iustin Pop
  -- | Compute the alias by stripping a given suffix (domain) from
278 ebf38064 Iustin Pop
  -- the name
279 ebf38064 Iustin Pop
  computeAlias :: String -> a -> a
280 ebf38064 Iustin Pop
  computeAlias dom e = setAlias e alias
281 ebf38064 Iustin Pop
    where alias = take (length name - length dom) name
282 ebf38064 Iustin Pop
          name = nameOf e
283 ebf38064 Iustin Pop
  -- | Updates the index of the element
284 ebf38064 Iustin Pop
  setIdx  :: a -> Int -> a
285 1fe412bb Iustin Pop
286 1fe412bb Iustin Pop
-- | The iallocator node-evacuate evac_mode type.
287 e9aaa3c6 Iustin Pop
$(THH.declareSADT "EvacMode"
288 ebf38064 Iustin Pop
       [ ("ChangePrimary",   'C.iallocatorNevacPri)
289 ebf38064 Iustin Pop
       , ("ChangeSecondary", 'C.iallocatorNevacSec)
290 ebf38064 Iustin Pop
       , ("ChangeAll",       'C.iallocatorNevacAll)
291 ebf38064 Iustin Pop
       ])
292 e9aaa3c6 Iustin Pop
$(THH.makeJSONInstance ''EvacMode)