Statistics
| Branch: | Tag: | Revision:

root / htools / Ganeti / HTools / Instance.hs @ 0e09422b

History | View | Annotate | Download (6.1 kB)

1
{-| Module describing an instance.
2

    
3
The instance data type holds very few fields, the algorithm
4
intelligence is in the "Node" and "Cluster" modules.
5

    
6
-}
7

    
8
{-
9

    
10
Copyright (C) 2009, 2010, 2011 Google Inc.
11

    
12
This program is free software; you can redistribute it and/or modify
13
it under the terms of the GNU General Public License as published by
14
the Free Software Foundation; either version 2 of the License, or
15
(at your option) any later version.
16

    
17
This program is distributed in the hope that it will be useful, but
18
WITHOUT ANY WARRANTY; without even the implied warranty of
19
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
General Public License for more details.
21

    
22
You should have received a copy of the GNU General Public License
23
along with this program; if not, write to the Free Software
24
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25
02110-1301, USA.
26

    
27
-}
28

    
29
module Ganeti.HTools.Instance
30
    ( Instance(..)
31
    , AssocList
32
    , List
33
    , create
34
    , setIdx
35
    , setName
36
    , setAlias
37
    , setPri
38
    , setSec
39
    , setBoth
40
    , setMovable
41
    , specOf
42
    , shrinkByType
43
    , runningStates
44
    ) where
45

    
46
import qualified Ganeti.HTools.Types as T
47
import qualified Ganeti.HTools.Container as Container
48
import qualified Ganeti.Constants as C
49

    
50
-- * Type declarations
51

    
52
-- | The instance type.
53
data Instance = Instance
54
    { name         :: String    -- ^ The instance name
55
    , alias        :: String    -- ^ The shortened name
56
    , mem          :: Int       -- ^ Memory of the instance
57
    , dsk          :: Int       -- ^ Disk size of instance
58
    , vcpus        :: Int       -- ^ Number of VCPUs
59
    , running      :: Bool      -- ^ Is the instance running?
60
    , runSt        :: String    -- ^ Original (text) run status
61
    , pNode        :: T.Ndx     -- ^ Original primary node
62
    , sNode        :: T.Ndx     -- ^ Original secondary node
63
    , idx          :: T.Idx     -- ^ Internal index
64
    , util         :: T.DynUtil -- ^ Dynamic resource usage
65
    , movable      :: Bool      -- ^ Can the instance be moved?
66
    , autoBalance  :: Bool      -- ^ Is the instance auto-balanced?
67
    , tags         :: [String]  -- ^ List of instance tags
68
    } deriving (Show, Read)
69

    
70
instance T.Element Instance where
71
    nameOf   = name
72
    idxOf    = idx
73
    setAlias = setAlias
74
    setIdx   = setIdx
75
    allNames n = [name n, alias n]
76

    
77
-- | Constant holding the running instance states.
78
runningStates :: [String]
79
runningStates = [C.inststRunning, C.inststErrorup]
80

    
81
-- | A simple name for the int, instance association list.
82
type AssocList = [(T.Idx, Instance)]
83

    
84
-- | A simple name for an instance map.
85
type List = Container.Container Instance
86

    
87
-- * Initialization
88

    
89
-- | Create an instance.
90
--
91
-- Some parameters are not initialized by function, and must be set
92
-- later (via 'setIdx' for example).
93
create :: String -> Int -> Int -> Int -> String
94
       -> [String] -> Bool -> T.Ndx -> T.Ndx -> Instance
95
create name_init mem_init dsk_init vcpus_init run_init tags_init
96
       auto_balance_init pn sn =
97
    Instance { name = name_init
98
             , alias = name_init
99
             , mem = mem_init
100
             , dsk = dsk_init
101
             , vcpus = vcpus_init
102
             , running = run_init `elem` runningStates
103
             , runSt = run_init
104
             , pNode = pn
105
             , sNode = sn
106
             , idx = -1
107
             , util = T.baseUtil
108
             , tags = tags_init
109
             , movable = True
110
             , autoBalance = auto_balance_init
111
             }
112

    
113
-- | Changes the index.
114
--
115
-- This is used only during the building of the data structures.
116
setIdx :: Instance -- ^ The original instance
117
       -> T.Idx    -- ^ New index
118
       -> Instance -- ^ The modified instance
119
setIdx t i = t { idx = i }
120

    
121
-- | Changes the name.
122
--
123
-- This is used only during the building of the data structures.
124
setName :: Instance -- ^ The original instance
125
        -> String   -- ^ New name
126
        -> Instance -- ^ The modified instance
127
setName t s = t { name = s, alias = s }
128

    
129
-- | Changes the alias.
130
--
131
-- This is used only during the building of the data structures.
132
setAlias :: Instance -- ^ The original instance
133
         -> String   -- ^ New alias
134
         -> Instance -- ^ The modified instance
135
setAlias t s = t { alias = s }
136

    
137
-- * Update functions
138

    
139
-- | Changes the primary node of the instance.
140
setPri :: Instance  -- ^ the original instance
141
        -> T.Ndx    -- ^ the new primary node
142
        -> Instance -- ^ the modified instance
143
setPri t p = t { pNode = p }
144

    
145
-- | Changes the secondary node of the instance.
146
setSec :: Instance  -- ^ the original instance
147
        -> T.Ndx    -- ^ the new secondary node
148
        -> Instance -- ^ the modified instance
149
setSec t s = t { sNode = s }
150

    
151
-- | Changes both nodes of the instance.
152
setBoth :: Instance  -- ^ the original instance
153
         -> T.Ndx    -- ^ new primary node index
154
         -> T.Ndx    -- ^ new secondary node index
155
         -> Instance -- ^ the modified instance
156
setBoth t p s = t { pNode = p, sNode = s }
157

    
158
setMovable :: Instance -- ^ The original instance
159
           -> Bool     -- ^ New movable flag
160
           -> Instance -- ^ The modified instance
161
setMovable t m = t { movable = m }
162

    
163
-- | Try to shrink the instance based on the reason why we can't
164
-- allocate it.
165
shrinkByType :: Instance -> T.FailMode -> T.Result Instance
166
shrinkByType inst T.FailMem = let v = mem inst - T.unitMem
167
                              in if v < T.unitMem
168
                                 then T.Bad "out of memory"
169
                                 else T.Ok inst { mem = v }
170
shrinkByType inst T.FailDisk = let v = dsk inst - T.unitDsk
171
                               in if v < T.unitDsk
172
                                  then T.Bad "out of disk"
173
                                  else T.Ok inst { dsk = v }
174
shrinkByType inst T.FailCPU = let v = vcpus inst - T.unitCpu
175
                              in if v < T.unitCpu
176
                                 then T.Bad "out of vcpus"
177
                                 else T.Ok inst { vcpus = v }
178
shrinkByType _ f = T.Bad $ "Unhandled failure mode " ++ show f
179

    
180
-- | Return the spec of an instance.
181
specOf :: Instance -> T.RSpec
182
specOf Instance { mem = m, dsk = d, vcpus = c } =
183
    T.RSpec { T.rspecCpu = c, T.rspecMem = m, T.rspecDsk = d }