root / test / hs / Test / Ganeti / TestHTools.hs @ 896cc964
History | View | Annotate | Download (4.9 kB)
1 | e1ee7d5a | Iustin Pop | {-# OPTIONS_GHC -fno-warn-orphans #-} |
---|---|---|---|
2 | e1ee7d5a | Iustin Pop | |
3 | e1ee7d5a | Iustin Pop | {-| Common functionality for htools-related unittests. |
4 | e1ee7d5a | Iustin Pop | |
5 | e1ee7d5a | Iustin Pop | -} |
6 | e1ee7d5a | Iustin Pop | |
7 | e1ee7d5a | Iustin Pop | {- |
8 | e1ee7d5a | Iustin Pop | |
9 | dde85e1e | Iustin Pop | Copyright (C) 2009, 2010, 2011, 2012, 2013 Google Inc. |
10 | e1ee7d5a | Iustin Pop | |
11 | e1ee7d5a | Iustin Pop | This program is free software; you can redistribute it and/or modify |
12 | e1ee7d5a | Iustin Pop | it under the terms of the GNU General Public License as published by |
13 | e1ee7d5a | Iustin Pop | the Free Software Foundation; either version 2 of the License, or |
14 | e1ee7d5a | Iustin Pop | (at your option) any later version. |
15 | e1ee7d5a | Iustin Pop | |
16 | e1ee7d5a | Iustin Pop | This program is distributed in the hope that it will be useful, but |
17 | e1ee7d5a | Iustin Pop | WITHOUT ANY WARRANTY; without even the implied warranty of |
18 | e1ee7d5a | Iustin Pop | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
19 | e1ee7d5a | Iustin Pop | General Public License for more details. |
20 | e1ee7d5a | Iustin Pop | |
21 | e1ee7d5a | Iustin Pop | You should have received a copy of the GNU General Public License |
22 | e1ee7d5a | Iustin Pop | along with this program; if not, write to the Free Software |
23 | e1ee7d5a | Iustin Pop | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
24 | e1ee7d5a | Iustin Pop | 02110-1301, USA. |
25 | e1ee7d5a | Iustin Pop | |
26 | e1ee7d5a | Iustin Pop | -} |
27 | e1ee7d5a | Iustin Pop | |
28 | dde85e1e | Iustin Pop | module Test.Ganeti.TestHTools |
29 | dde85e1e | Iustin Pop | ( nullIPolicy |
30 | dde85e1e | Iustin Pop | , defGroup |
31 | dde85e1e | Iustin Pop | , defGroupList |
32 | dde85e1e | Iustin Pop | , defGroupAssoc |
33 | dde85e1e | Iustin Pop | , createInstance |
34 | dde85e1e | Iustin Pop | , makeSmallCluster |
35 | dde85e1e | Iustin Pop | , setInstanceSmallerThanNode |
36 | dde85e1e | Iustin Pop | ) where |
37 | e1ee7d5a | Iustin Pop | |
38 | e1ee7d5a | Iustin Pop | import qualified Data.Map as Map |
39 | e1ee7d5a | Iustin Pop | |
40 | e1ee7d5a | Iustin Pop | import Test.Ganeti.TestCommon |
41 | e1ee7d5a | Iustin Pop | |
42 | e1ee7d5a | Iustin Pop | import qualified Ganeti.Constants as C |
43 | e1ee7d5a | Iustin Pop | import qualified Ganeti.HTools.Container as Container |
44 | e1ee7d5a | Iustin Pop | import qualified Ganeti.HTools.Group as Group |
45 | e1ee7d5a | Iustin Pop | import qualified Ganeti.HTools.Instance as Instance |
46 | e1ee7d5a | Iustin Pop | import qualified Ganeti.HTools.Loader as Loader |
47 | e1ee7d5a | Iustin Pop | import qualified Ganeti.HTools.Node as Node |
48 | e1ee7d5a | Iustin Pop | import qualified Ganeti.HTools.Types as Types |
49 | e1ee7d5a | Iustin Pop | |
50 | e1ee7d5a | Iustin Pop | -- * Helpers |
51 | e1ee7d5a | Iustin Pop | |
52 | e1ee7d5a | Iustin Pop | -- | Null iPolicy, and by null we mean very liberal. |
53 | e1ee7d5a | Iustin Pop | nullIPolicy :: Types.IPolicy |
54 | e1ee7d5a | Iustin Pop | nullIPolicy = Types.IPolicy |
55 | 41044e04 | Bernardo Dal Seno | { Types.iPolicyMinMaxISpecs = [Types.MinMaxISpecs |
56 | da5f09ef | Bernardo Dal Seno | { Types.minMaxISpecsMinSpec = Types.ISpec { Types.iSpecMemorySize = 0 |
57 | da5f09ef | Bernardo Dal Seno | , Types.iSpecCpuCount = 0 |
58 | da5f09ef | Bernardo Dal Seno | , Types.iSpecDiskSize = 0 |
59 | da5f09ef | Bernardo Dal Seno | , Types.iSpecDiskCount = 0 |
60 | da5f09ef | Bernardo Dal Seno | , Types.iSpecNicCount = 0 |
61 | da5f09ef | Bernardo Dal Seno | , Types.iSpecSpindleUse = 0 |
62 | da5f09ef | Bernardo Dal Seno | } |
63 | da5f09ef | Bernardo Dal Seno | , Types.minMaxISpecsMaxSpec = Types.ISpec |
64 | da5f09ef | Bernardo Dal Seno | { Types.iSpecMemorySize = maxBound |
65 | da5f09ef | Bernardo Dal Seno | , Types.iSpecCpuCount = maxBound |
66 | da5f09ef | Bernardo Dal Seno | , Types.iSpecDiskSize = maxBound |
67 | da5f09ef | Bernardo Dal Seno | , Types.iSpecDiskCount = C.maxDisks |
68 | da5f09ef | Bernardo Dal Seno | , Types.iSpecNicCount = C.maxNics |
69 | da5f09ef | Bernardo Dal Seno | , Types.iSpecSpindleUse = maxBound |
70 | da5f09ef | Bernardo Dal Seno | } |
71 | 41044e04 | Bernardo Dal Seno | }] |
72 | e1ee7d5a | Iustin Pop | , Types.iPolicyStdSpec = Types.ISpec { Types.iSpecMemorySize = Types.unitMem |
73 | e1ee7d5a | Iustin Pop | , Types.iSpecCpuCount = Types.unitCpu |
74 | e1ee7d5a | Iustin Pop | , Types.iSpecDiskSize = Types.unitDsk |
75 | e1ee7d5a | Iustin Pop | , Types.iSpecDiskCount = 1 |
76 | e1ee7d5a | Iustin Pop | , Types.iSpecNicCount = 1 |
77 | e1ee7d5a | Iustin Pop | , Types.iSpecSpindleUse = 1 |
78 | e1ee7d5a | Iustin Pop | } |
79 | e1ee7d5a | Iustin Pop | , Types.iPolicyDiskTemplates = [minBound..maxBound] |
80 | e1ee7d5a | Iustin Pop | , Types.iPolicyVcpuRatio = maxVcpuRatio -- somewhat random value, high |
81 | e1ee7d5a | Iustin Pop | -- enough to not impact us |
82 | e1ee7d5a | Iustin Pop | , Types.iPolicySpindleRatio = maxSpindleRatio |
83 | e1ee7d5a | Iustin Pop | } |
84 | e1ee7d5a | Iustin Pop | |
85 | dde85e1e | Iustin Pop | -- | Default group definition. |
86 | e1ee7d5a | Iustin Pop | defGroup :: Group.Group |
87 | e1ee7d5a | Iustin Pop | defGroup = flip Group.setIdx 0 $ |
88 | e1ee7d5a | Iustin Pop | Group.create "default" Types.defaultGroupID Types.AllocPreferred |
89 | c8b199db | Thomas Thrainer | [] nullIPolicy [] |
90 | e1ee7d5a | Iustin Pop | |
91 | dde85e1e | Iustin Pop | -- | Default group, as a (singleton) 'Group.List'. |
92 | e1ee7d5a | Iustin Pop | defGroupList :: Group.List |
93 | e1ee7d5a | Iustin Pop | defGroupList = Container.fromList [(Group.idx defGroup, defGroup)] |
94 | e1ee7d5a | Iustin Pop | |
95 | dde85e1e | Iustin Pop | -- | Default group, as a string map. |
96 | e1ee7d5a | Iustin Pop | defGroupAssoc :: Map.Map String Types.Gdx |
97 | e1ee7d5a | Iustin Pop | defGroupAssoc = Map.singleton (Group.uuid defGroup) (Group.idx defGroup) |
98 | e1ee7d5a | Iustin Pop | |
99 | e1ee7d5a | Iustin Pop | -- | Create an instance given its spec. |
100 | e1ee7d5a | Iustin Pop | createInstance :: Int -> Int -> Int -> Instance.Instance |
101 | e1ee7d5a | Iustin Pop | createInstance mem dsk vcpus = |
102 | 2724417c | Bernardo Dal Seno | Instance.create "inst-unnamed" mem dsk [Instance.Disk dsk Nothing] vcpus |
103 | 2724417c | Bernardo Dal Seno | Types.Running [] True (-1) (-1) Types.DTDrbd8 1 [] |
104 | e1ee7d5a | Iustin Pop | |
105 | e1ee7d5a | Iustin Pop | -- | Create a small cluster by repeating a node spec. |
106 | e1ee7d5a | Iustin Pop | makeSmallCluster :: Node.Node -> Int -> Node.List |
107 | e1ee7d5a | Iustin Pop | makeSmallCluster node count = |
108 | e1ee7d5a | Iustin Pop | let origname = Node.name node |
109 | e1ee7d5a | Iustin Pop | origalias = Node.alias node |
110 | e1ee7d5a | Iustin Pop | nodes = map (\idx -> node { Node.name = origname ++ "-" ++ show idx |
111 | e1ee7d5a | Iustin Pop | , Node.alias = origalias ++ "-" ++ show idx }) |
112 | e1ee7d5a | Iustin Pop | [1..count] |
113 | e1ee7d5a | Iustin Pop | fn = flip Node.buildPeers Container.empty |
114 | e1ee7d5a | Iustin Pop | namelst = map (\n -> (Node.name n, fn n)) nodes |
115 | e1ee7d5a | Iustin Pop | (_, nlst) = Loader.assignIndices namelst |
116 | e1ee7d5a | Iustin Pop | in nlst |
117 | e1ee7d5a | Iustin Pop | |
118 | e1ee7d5a | Iustin Pop | -- | Update an instance to be smaller than a node. |
119 | e1ee7d5a | Iustin Pop | setInstanceSmallerThanNode :: Node.Node |
120 | e1ee7d5a | Iustin Pop | -> Instance.Instance -> Instance.Instance |
121 | e1ee7d5a | Iustin Pop | setInstanceSmallerThanNode node inst = |
122 | fcfc0c2d | Bernardo Dal Seno | let new_dsk = Node.availDisk node `div` 2 |
123 | fcfc0c2d | Bernardo Dal Seno | in inst { Instance.mem = Node.availMem node `div` 2 |
124 | fcfc0c2d | Bernardo Dal Seno | , Instance.dsk = new_dsk |
125 | fcfc0c2d | Bernardo Dal Seno | , Instance.vcpus = Node.availCpu node `div` 2 |
126 | fcfc0c2d | Bernardo Dal Seno | , Instance.disks = [Instance.Disk new_dsk |
127 | fcfc0c2d | Bernardo Dal Seno | (if Node.exclStorage node |
128 | fcfc0c2d | Bernardo Dal Seno | then Just $ Node.fSpindles node `div` 2 |
129 | fcfc0c2d | Bernardo Dal Seno | else Nothing)] |
130 | fcfc0c2d | Bernardo Dal Seno | } |