Statistics
| Branch: | Tag: | Revision:

root / test / hs / Test / Ganeti / TestHTools.hs @ 93f1e606

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
          }