root / htools / Ganeti / HTools / Types.hs @ e1dde6ad
History | View | Annotate | Download (11.3 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 | a07343b2 | Iustin Pop | , ISpec(..) |
76 | a07343b2 | Iustin Pop | , IPolicy(..) |
77 | d02f941e | Iustin Pop | , defIPolicy |
78 | 304f9292 | Iustin Pop | , rspecFromISpec |
79 | ebf38064 | Iustin Pop | ) where |
80 | e4c5beaf | Iustin Pop | |
81 | 2d0ca2c5 | Iustin Pop | import qualified Data.Map as M |
82 | a07343b2 | Iustin Pop | import Text.JSON (makeObj, readJSON, showJSON) |
83 | 2d0ca2c5 | Iustin Pop | |
84 | 2e5eb96a | Iustin Pop | import qualified Ganeti.Constants as C |
85 | e9aaa3c6 | Iustin Pop | import qualified Ganeti.THH as THH |
86 | 0c37d1e4 | Iustin Pop | import Ganeti.BasicTypes |
87 | a07343b2 | Iustin Pop | import Ganeti.HTools.JSON |
88 | 2e5eb96a | Iustin Pop | |
89 | 9188aeef | Iustin Pop | -- | The instance index type. |
90 | 608efcce | Iustin Pop | type Idx = Int |
91 | 608efcce | Iustin Pop | |
92 | 9188aeef | Iustin Pop | -- | The node index type. |
93 | 608efcce | Iustin Pop | type Ndx = Int |
94 | 608efcce | Iustin Pop | |
95 | 0dc1bf87 | Iustin Pop | -- | The group index type. |
96 | 0dc1bf87 | Iustin Pop | type Gdx = Int |
97 | 0dc1bf87 | Iustin Pop | |
98 | 9188aeef | Iustin Pop | -- | The type used to hold name-to-idx mappings. |
99 | 2d0ca2c5 | Iustin Pop | type NameAssoc = M.Map String Int |
100 | e4c5beaf | Iustin Pop | |
101 | 92e32d76 | Iustin Pop | -- | A separate name for the cluster score type. |
102 | 92e32d76 | Iustin Pop | type Score = Double |
103 | 92e32d76 | Iustin Pop | |
104 | 2180829f | Iustin Pop | -- | A separate name for a weight metric. |
105 | 2180829f | Iustin Pop | type Weight = Double |
106 | 2180829f | Iustin Pop | |
107 | 0dc1bf87 | Iustin Pop | -- | The Group UUID type. |
108 | c4d98278 | Iustin Pop | type GroupID = String |
109 | c4d98278 | Iustin Pop | |
110 | f3f76ccc | Iustin Pop | -- | Default group UUID (just a string, not a real UUID). |
111 | f3f76ccc | Iustin Pop | defaultGroupID :: GroupID |
112 | f3f76ccc | Iustin Pop | defaultGroupID = "00000000-0000-0000-0000-000000000000" |
113 | f3f76ccc | Iustin Pop | |
114 | 89c758c6 | Iustin Pop | -- | Instance disk template type. |
115 | 89c758c6 | Iustin Pop | $(THH.declareSADT "DiskTemplate" |
116 | 89c758c6 | Iustin Pop | [ ("DTDiskless", 'C.dtDiskless) |
117 | 89c758c6 | Iustin Pop | , ("DTFile", 'C.dtFile) |
118 | 89c758c6 | Iustin Pop | , ("DTSharedFile", 'C.dtSharedFile) |
119 | 89c758c6 | Iustin Pop | , ("DTPlain", 'C.dtPlain) |
120 | 89c758c6 | Iustin Pop | , ("DTBlock", 'C.dtBlock) |
121 | 89c758c6 | Iustin Pop | , ("DTDrbd8", 'C.dtDrbd8) |
122 | 89c758c6 | Iustin Pop | ]) |
123 | 89c758c6 | Iustin Pop | $(THH.makeJSONInstance ''DiskTemplate) |
124 | 89c758c6 | Iustin Pop | |
125 | 0dc1bf87 | Iustin Pop | -- | The Group allocation policy type. |
126 | 73206d0a | Iustin Pop | -- |
127 | 73206d0a | Iustin Pop | -- Note that the order of constructors is important as the automatic |
128 | 73206d0a | Iustin Pop | -- Ord instance will order them in the order they are defined, so when |
129 | 73206d0a | Iustin Pop | -- changing this data type be careful about the interaction with the |
130 | 73206d0a | Iustin Pop | -- desired sorting order. |
131 | e9aaa3c6 | Iustin Pop | $(THH.declareSADT "AllocPolicy" |
132 | ebf38064 | Iustin Pop | [ ("AllocPreferred", 'C.allocPolicyPreferred) |
133 | ebf38064 | Iustin Pop | , ("AllocLastResort", 'C.allocPolicyLastResort) |
134 | ebf38064 | Iustin Pop | , ("AllocUnallocable", 'C.allocPolicyUnallocable) |
135 | ebf38064 | Iustin Pop | ]) |
136 | e9aaa3c6 | Iustin Pop | $(THH.makeJSONInstance ''AllocPolicy) |
137 | b2ba4669 | Iustin Pop | |
138 | 3771d104 | Agata Murawska | -- | The Instance real state type. |
139 | 3771d104 | Agata Murawska | $(THH.declareSADT "InstanceStatus" |
140 | ebf38064 | Iustin Pop | [ ("AdminDown", 'C.inststAdmindown) |
141 | ebf38064 | Iustin Pop | , ("AdminOffline", 'C.inststAdminoffline) |
142 | ebf38064 | Iustin Pop | , ("ErrorDown", 'C.inststErrordown) |
143 | ebf38064 | Iustin Pop | , ("ErrorUp", 'C.inststErrorup) |
144 | ebf38064 | Iustin Pop | , ("NodeDown", 'C.inststNodedown) |
145 | ebf38064 | Iustin Pop | , ("NodeOffline", 'C.inststNodeoffline) |
146 | ebf38064 | Iustin Pop | , ("Running", 'C.inststRunning) |
147 | ebf38064 | Iustin Pop | , ("WrongNode", 'C.inststWrongnode) |
148 | ebf38064 | Iustin Pop | ]) |
149 | 3771d104 | Agata Murawska | $(THH.makeJSONInstance ''InstanceStatus) |
150 | 3771d104 | Agata Murawska | |
151 | 1f9066c0 | Iustin Pop | -- | The resource spec type. |
152 | 1f9066c0 | Iustin Pop | data RSpec = RSpec |
153 | ebf38064 | Iustin Pop | { rspecCpu :: Int -- ^ Requested VCPUs |
154 | ebf38064 | Iustin Pop | , rspecMem :: Int -- ^ Requested memory |
155 | ebf38064 | Iustin Pop | , rspecDsk :: Int -- ^ Requested disk |
156 | ebf38064 | Iustin Pop | } deriving (Show, Read, Eq) |
157 | 1f9066c0 | Iustin Pop | |
158 | a07343b2 | Iustin Pop | |
159 | a07343b2 | Iustin Pop | -- | Instance specification type. |
160 | a07343b2 | Iustin Pop | $(THH.buildObject "ISpec" "iSpec" |
161 | a07343b2 | Iustin Pop | [ THH.renameField "MemorySize" $ THH.simpleField "memory-size" [t| Int |] |
162 | a07343b2 | Iustin Pop | , THH.renameField "CpuCount" $ THH.simpleField "cpu-count" [t| Int |] |
163 | a07343b2 | Iustin Pop | , THH.renameField "DiskSize" $ THH.simpleField "disk-size" [t| Int |] |
164 | a07343b2 | Iustin Pop | , THH.renameField "DiskCount" $ THH.simpleField "disk-count" [t| Int |] |
165 | a07343b2 | Iustin Pop | , THH.renameField "NicCount" $ THH.simpleField "nic-count" [t| Int |] |
166 | a07343b2 | Iustin Pop | ]) |
167 | a07343b2 | Iustin Pop | |
168 | d02f941e | Iustin Pop | -- | The default minimum ispec. |
169 | d02f941e | Iustin Pop | defMinISpec :: ISpec |
170 | d02f941e | Iustin Pop | defMinISpec = ISpec { iSpecMemorySize = C.ipolicyDefaultsMinMemorySize |
171 | d02f941e | Iustin Pop | , iSpecCpuCount = C.ipolicyDefaultsMinCpuCount |
172 | d02f941e | Iustin Pop | , iSpecDiskSize = C.ipolicyDefaultsMinDiskSize |
173 | d02f941e | Iustin Pop | , iSpecDiskCount = C.ipolicyDefaultsMinDiskCount |
174 | d02f941e | Iustin Pop | , iSpecNicCount = C.ipolicyDefaultsMinNicCount |
175 | d02f941e | Iustin Pop | } |
176 | d02f941e | Iustin Pop | |
177 | d02f941e | Iustin Pop | -- | The default standard ispec. |
178 | d02f941e | Iustin Pop | defStdISpec :: ISpec |
179 | d02f941e | Iustin Pop | defStdISpec = ISpec { iSpecMemorySize = C.ipolicyDefaultsStdMemorySize |
180 | d02f941e | Iustin Pop | , iSpecCpuCount = C.ipolicyDefaultsStdCpuCount |
181 | d02f941e | Iustin Pop | , iSpecDiskSize = C.ipolicyDefaultsStdDiskSize |
182 | d02f941e | Iustin Pop | , iSpecDiskCount = C.ipolicyDefaultsStdDiskCount |
183 | d02f941e | Iustin Pop | , iSpecNicCount = C.ipolicyDefaultsStdNicCount |
184 | d02f941e | Iustin Pop | } |
185 | d02f941e | Iustin Pop | |
186 | d02f941e | Iustin Pop | -- | The default max ispec. |
187 | d02f941e | Iustin Pop | defMaxISpec :: ISpec |
188 | d02f941e | Iustin Pop | defMaxISpec = ISpec { iSpecMemorySize = C.ipolicyDefaultsMaxMemorySize |
189 | d02f941e | Iustin Pop | , iSpecCpuCount = C.ipolicyDefaultsMaxCpuCount |
190 | d02f941e | Iustin Pop | , iSpecDiskSize = C.ipolicyDefaultsMaxDiskSize |
191 | d02f941e | Iustin Pop | , iSpecDiskCount = C.ipolicyDefaultsMaxDiskCount |
192 | d02f941e | Iustin Pop | , iSpecNicCount = C.ipolicyDefaultsMaxNicCount |
193 | d02f941e | Iustin Pop | } |
194 | d02f941e | Iustin Pop | |
195 | a07343b2 | Iustin Pop | -- | Instance policy type. |
196 | a07343b2 | Iustin Pop | $(THH.buildObject "IPolicy" "iPolicy" |
197 | a07343b2 | Iustin Pop | [ THH.renameField "StdSpec" $ THH.simpleField "std" [t| ISpec |] |
198 | a07343b2 | Iustin Pop | , THH.renameField "MinSpec" $ THH.simpleField "min" [t| ISpec |] |
199 | a07343b2 | Iustin Pop | , THH.renameField "MaxSpec" $ THH.simpleField "max" [t| ISpec |] |
200 | fc42a408 | Iustin Pop | , THH.renameField "DiskTemplates" $ |
201 | fc42a408 | Iustin Pop | THH.simpleField "disk_templates" [t| [DiskTemplate] |] |
202 | a07343b2 | Iustin Pop | ]) |
203 | a07343b2 | Iustin Pop | |
204 | 304f9292 | Iustin Pop | -- | Converts an ISpec type to a RSpec one. |
205 | 304f9292 | Iustin Pop | rspecFromISpec :: ISpec -> RSpec |
206 | 304f9292 | Iustin Pop | rspecFromISpec ispec = RSpec { rspecCpu = iSpecCpuCount ispec |
207 | 304f9292 | Iustin Pop | , rspecMem = iSpecMemorySize ispec |
208 | 304f9292 | Iustin Pop | , rspecDsk = iSpecDiskSize ispec |
209 | 304f9292 | Iustin Pop | } |
210 | 304f9292 | Iustin Pop | |
211 | d02f941e | Iustin Pop | -- | The default instance policy. |
212 | d02f941e | Iustin Pop | defIPolicy :: IPolicy |
213 | d02f941e | Iustin Pop | defIPolicy = IPolicy { iPolicyStdSpec = defStdISpec |
214 | d02f941e | Iustin Pop | , iPolicyMinSpec = defMinISpec |
215 | d02f941e | Iustin Pop | , iPolicyMaxSpec = defMaxISpec |
216 | fc42a408 | Iustin Pop | -- hardcoding here since Constants.hs exports the |
217 | fc42a408 | Iustin Pop | -- string values, not the actual type; and in |
218 | fc42a408 | Iustin Pop | -- htools, we are mostly looking at DRBD |
219 | fc42a408 | Iustin Pop | , iPolicyDiskTemplates = [DTDrbd8, DTPlain] |
220 | d02f941e | Iustin Pop | } |
221 | d02f941e | Iustin Pop | |
222 | 2180829f | Iustin Pop | -- | The dynamic resource specs of a machine (i.e. load or load |
223 | 2180829f | Iustin Pop | -- capacity, as opposed to size). |
224 | 2180829f | Iustin Pop | data DynUtil = DynUtil |
225 | ebf38064 | Iustin Pop | { cpuWeight :: Weight -- ^ Standardised CPU usage |
226 | ebf38064 | Iustin Pop | , memWeight :: Weight -- ^ Standardised memory load |
227 | ebf38064 | Iustin Pop | , dskWeight :: Weight -- ^ Standardised disk I\/O usage |
228 | ebf38064 | Iustin Pop | , netWeight :: Weight -- ^ Standardised network usage |
229 | ebf38064 | Iustin Pop | } deriving (Show, Read, Eq) |
230 | 2180829f | Iustin Pop | |
231 | 525bfb36 | Iustin Pop | -- | Initial empty utilisation. |
232 | 2180829f | Iustin Pop | zeroUtil :: DynUtil |
233 | 2180829f | Iustin Pop | zeroUtil = DynUtil { cpuWeight = 0, memWeight = 0 |
234 | 2180829f | Iustin Pop | , dskWeight = 0, netWeight = 0 } |
235 | 2180829f | Iustin Pop | |
236 | 525bfb36 | Iustin Pop | -- | Base utilisation (used when no actual utilisation data is |
237 | 525bfb36 | Iustin Pop | -- supplied). |
238 | ee9724b9 | Iustin Pop | baseUtil :: DynUtil |
239 | ee9724b9 | Iustin Pop | baseUtil = DynUtil { cpuWeight = 1, memWeight = 1 |
240 | ee9724b9 | Iustin Pop | , dskWeight = 1, netWeight = 1 } |
241 | ee9724b9 | Iustin Pop | |
242 | 525bfb36 | Iustin Pop | -- | Sum two utilisation records. |
243 | 2180829f | Iustin Pop | addUtil :: DynUtil -> DynUtil -> DynUtil |
244 | 2180829f | Iustin Pop | addUtil (DynUtil a1 a2 a3 a4) (DynUtil b1 b2 b3 b4) = |
245 | ebf38064 | Iustin Pop | DynUtil (a1+b1) (a2+b2) (a3+b3) (a4+b4) |
246 | 2180829f | Iustin Pop | |
247 | 525bfb36 | Iustin Pop | -- | Substracts one utilisation record from another. |
248 | 2180829f | Iustin Pop | subUtil :: DynUtil -> DynUtil -> DynUtil |
249 | 2180829f | Iustin Pop | subUtil (DynUtil a1 a2 a3 a4) (DynUtil b1 b2 b3 b4) = |
250 | ebf38064 | Iustin Pop | DynUtil (a1-b1) (a2-b2) (a3-b3) (a4-b4) |
251 | 2180829f | Iustin Pop | |
252 | 66dac8e0 | Iustin Pop | -- | The description of an instance placement. It contains the |
253 | 66dac8e0 | Iustin Pop | -- instance index, the new primary and secondary node, the move being |
254 | 66dac8e0 | Iustin Pop | -- performed and the score of the cluster after the move. |
255 | 66dac8e0 | Iustin Pop | type Placement = (Idx, Ndx, Ndx, IMove, Score) |
256 | 92e32d76 | Iustin Pop | |
257 | 525bfb36 | Iustin Pop | -- | An instance move definition. |
258 | 92e32d76 | Iustin Pop | data IMove = Failover -- ^ Failover the instance (f) |
259 | 92e32d76 | Iustin Pop | | ReplacePrimary Ndx -- ^ Replace primary (f, r:np, f) |
260 | 92e32d76 | Iustin Pop | | ReplaceSecondary Ndx -- ^ Replace secondary (r:ns) |
261 | 92e32d76 | Iustin Pop | | ReplaceAndFailover Ndx -- ^ Replace secondary, failover (r:np, f) |
262 | 92e32d76 | Iustin Pop | | FailoverAndReplace Ndx -- ^ Failover, replace secondary (f, r:ns) |
263 | 6bc39970 | Iustin Pop | deriving (Show, Read) |
264 | 92e32d76 | Iustin Pop | |
265 | 0e8ae201 | Iustin Pop | -- | Formatted solution output for one move (involved nodes and |
266 | 525bfb36 | Iustin Pop | -- commands. |
267 | 924f9c16 | Iustin Pop | type MoveJob = ([Ndx], Idx, IMove, [String]) |
268 | 0e8ae201 | Iustin Pop | |
269 | 525bfb36 | Iustin Pop | -- | Unknown field in table output. |
270 | 82ea2874 | Iustin Pop | unknownField :: String |
271 | 82ea2874 | Iustin Pop | unknownField = "<unknown field>" |
272 | 82ea2874 | Iustin Pop | |
273 | 525bfb36 | Iustin Pop | -- | A list of command elements. |
274 | 0e8ae201 | Iustin Pop | type JobSet = [MoveJob] |
275 | 0e8ae201 | Iustin Pop | |
276 | 135a6c6a | Iustin Pop | -- | Connection timeout (when using non-file methods). |
277 | 135a6c6a | Iustin Pop | connTimeout :: Int |
278 | 135a6c6a | Iustin Pop | connTimeout = 15 |
279 | 135a6c6a | Iustin Pop | |
280 | 135a6c6a | Iustin Pop | -- | The default timeout for queries (when using non-file methods). |
281 | 135a6c6a | Iustin Pop | queryTimeout :: Int |
282 | 135a6c6a | Iustin Pop | queryTimeout = 60 |
283 | 135a6c6a | Iustin Pop | |
284 | f4c0b8c5 | Iustin Pop | -- | Default vcpu-to-pcpu ratio (randomly chosen value). |
285 | f4c0b8c5 | Iustin Pop | defVcpuRatio :: Double |
286 | f4c0b8c5 | Iustin Pop | defVcpuRatio = 64 |
287 | f4c0b8c5 | Iustin Pop | |
288 | f4c0b8c5 | Iustin Pop | -- | Default max disk usage ratio. |
289 | f4c0b8c5 | Iustin Pop | defReservedDiskRatio :: Double |
290 | f4c0b8c5 | Iustin Pop | defReservedDiskRatio = 0 |
291 | f4c0b8c5 | Iustin Pop | |
292 | 1e3dccc8 | Iustin Pop | -- | Base memory unit. |
293 | 1e3dccc8 | Iustin Pop | unitMem :: Int |
294 | 1e3dccc8 | Iustin Pop | unitMem = 64 |
295 | 1e3dccc8 | Iustin Pop | |
296 | 1e3dccc8 | Iustin Pop | -- | Base disk unit. |
297 | 1e3dccc8 | Iustin Pop | unitDsk :: Int |
298 | 1e3dccc8 | Iustin Pop | unitDsk = 256 |
299 | 1e3dccc8 | Iustin Pop | |
300 | 1e3dccc8 | Iustin Pop | -- | Base vcpus unit. |
301 | 1e3dccc8 | Iustin Pop | unitCpu :: Int |
302 | 1e3dccc8 | Iustin Pop | unitCpu = 1 |
303 | 1e3dccc8 | Iustin Pop | |
304 | 525bfb36 | Iustin Pop | -- | Reason for an operation's falure. |
305 | f2280553 | Iustin Pop | data FailMode = FailMem -- ^ Failed due to not enough RAM |
306 | f2280553 | Iustin Pop | | FailDisk -- ^ Failed due to not enough disk |
307 | f2280553 | Iustin Pop | | FailCPU -- ^ Failed due to not enough CPU capacity |
308 | f2280553 | Iustin Pop | | FailN1 -- ^ Failed due to not passing N1 checks |
309 | 5f0b9579 | Iustin Pop | | FailTags -- ^ Failed due to tag exclusion |
310 | 6bc39970 | Iustin Pop | deriving (Eq, Enum, Bounded, Show, Read) |
311 | f2280553 | Iustin Pop | |
312 | 525bfb36 | Iustin Pop | -- | List with failure statistics. |
313 | 478df686 | Iustin Pop | type FailStats = [(FailMode, Int)] |
314 | 478df686 | Iustin Pop | |
315 | 525bfb36 | Iustin Pop | -- | Either-like data-type customized for our failure modes. |
316 | a30b473c | Iustin Pop | -- |
317 | a30b473c | Iustin Pop | -- The failure values for this monad track the specific allocation |
318 | a30b473c | Iustin Pop | -- failures, so this is not a general error-monad (compare with the |
319 | a30b473c | Iustin Pop | -- 'Result' data type). One downside is that this type cannot encode a |
320 | a30b473c | Iustin Pop | -- generic failure mode, hence 'fail' for this monad is not defined |
321 | a30b473c | Iustin Pop | -- and will cause an exception. |
322 | f2280553 | Iustin Pop | data OpResult a = OpFail FailMode -- ^ Failed operation |
323 | f2280553 | Iustin Pop | | OpGood a -- ^ Success operation |
324 | 6bc39970 | Iustin Pop | deriving (Show, Read) |
325 | f2280553 | Iustin Pop | |
326 | f2280553 | Iustin Pop | instance Monad OpResult where |
327 | ebf38064 | Iustin Pop | (OpGood x) >>= fn = fn x |
328 | ebf38064 | Iustin Pop | (OpFail y) >>= _ = OpFail y |
329 | ebf38064 | Iustin Pop | return = OpGood |
330 | f2280553 | Iustin Pop | |
331 | a30b473c | Iustin Pop | -- | Conversion from 'OpResult' to 'Result'. |
332 | a30b473c | Iustin Pop | opToResult :: OpResult a -> Result a |
333 | a30b473c | Iustin Pop | opToResult (OpFail f) = Bad $ show f |
334 | a30b473c | Iustin Pop | opToResult (OpGood v) = Ok v |
335 | a30b473c | Iustin Pop | |
336 | 9188aeef | Iustin Pop | -- | A generic class for items that have updateable names and indices. |
337 | 497e30a1 | Iustin Pop | class Element a where |
338 | ebf38064 | Iustin Pop | -- | Returns the name of the element |
339 | ebf38064 | Iustin Pop | nameOf :: a -> String |
340 | ebf38064 | Iustin Pop | -- | Returns all the known names of the element |
341 | ebf38064 | Iustin Pop | allNames :: a -> [String] |
342 | ebf38064 | Iustin Pop | -- | Returns the index of the element |
343 | ebf38064 | Iustin Pop | idxOf :: a -> Int |
344 | ebf38064 | Iustin Pop | -- | Updates the alias of the element |
345 | ebf38064 | Iustin Pop | setAlias :: a -> String -> a |
346 | ebf38064 | Iustin Pop | -- | Compute the alias by stripping a given suffix (domain) from |
347 | ebf38064 | Iustin Pop | -- the name |
348 | ebf38064 | Iustin Pop | computeAlias :: String -> a -> a |
349 | ebf38064 | Iustin Pop | computeAlias dom e = setAlias e alias |
350 | ebf38064 | Iustin Pop | where alias = take (length name - length dom) name |
351 | ebf38064 | Iustin Pop | name = nameOf e |
352 | ebf38064 | Iustin Pop | -- | Updates the index of the element |
353 | ebf38064 | Iustin Pop | setIdx :: a -> Int -> a |
354 | 1fe412bb | Iustin Pop | |
355 | 1fe412bb | Iustin Pop | -- | The iallocator node-evacuate evac_mode type. |
356 | e9aaa3c6 | Iustin Pop | $(THH.declareSADT "EvacMode" |
357 | ebf38064 | Iustin Pop | [ ("ChangePrimary", 'C.iallocatorNevacPri) |
358 | ebf38064 | Iustin Pop | , ("ChangeSecondary", 'C.iallocatorNevacSec) |
359 | ebf38064 | Iustin Pop | , ("ChangeAll", 'C.iallocatorNevacAll) |
360 | ebf38064 | Iustin Pop | ]) |
361 | e9aaa3c6 | Iustin Pop | $(THH.makeJSONInstance ''EvacMode) |