Revision 1a82215d

b/Ganeti/HTools/Cluster.hs
780 780
        m_name = maximum . map (length . Node.name) $ snl
781 781
        helper = Node.list m_name
782 782
        header = printf
783
                 "%2s %-*s %5s %5s %5s %5s %5s %5s %5s %5s %3s %3s %7s %7s"
783
                 "%2s %-*s %5s %5s %5s %5s %5s %5s %5s %5s %3s %3s %7s %7s %7s"
784 784
                 " F" m_name "Name"
785 785
                 "t_mem" "n_mem" "i_mem" "x_mem" "f_mem" "r_mem"
786 786
                 "t_dsk" "f_dsk"
787
                 "pri" "sec" "p_fmem" "p_fdsk"
787
                 "pri" "sec" "p_fmem" "p_fdsk" "r_cpu"
788 788
    in unlines $ (header:map helper snl)
789 789

  
790 790
-- | Shows statistics for a given node list.
b/Ganeti/HTools/IAlloc.hs
79 79
    offline <- fromObj "offline" a
80 80
    drained <- fromObj "drained" a
81 81
    node <- (case offline of
82
               True -> return $ Node.create name 0 0 0 0 0 True
82
               True -> return $ Node.create name 0 0 0 0 0 0 True
83 83
               _ -> do
84 84
                 mtotal <- fromObj "total_memory" a
85
                 mnode <- fromObj "reserved_memory" a
86
                 mfree <- fromObj "free_memory" a
87
                 dtotal <- fromObj "total_disk" a
88
                 dfree <- fromObj "free_disk" a
85
                 mnode  <- fromObj "reserved_memory" a
86
                 mfree  <- fromObj "free_memory"  a
87
                 dtotal <- fromObj "total_disk"   a
88
                 dfree  <- fromObj "free_disk"    a
89
                 ctotal <- fromObj "total_cpus"   a
89 90
                 return $ Node.create n mtotal mnode mfree
90
                        dtotal dfree (offline || drained))
91
                        dtotal dfree ctotal (offline || drained))
91 92
    return (name, node)
92 93

  
93 94
-- | Top-level parser.
b/Ganeti/HTools/Loader.hs
100 100
                    sdx = Instance.snode inst
101 101
                    pold = fromJust $ lookup pdx accu
102 102
                    pnew = Node.setPri pold idx
103
                    pnew' = Node.addCpus pnew (Instance.vcpus inst)
103 104
                    ac1 = deleteBy assocEqual (pdx, pold) accu
104
                    ac2 = (pdx, pnew):ac1
105
                    ac2 = (pdx, pnew'):ac1
105 106
                in
106 107
                  if sdx /= Node.noSecondary then
107 108
                      let
b/Ganeti/HTools/Node.hs
26 26
-}
27 27

  
28 28
module Ganeti.HTools.Node
29
    ( Node(failN1, name, idx, t_mem, n_mem, f_mem, r_mem, t_dsk, f_dsk,
30
           p_mem, p_dsk, p_rem,
29
    ( Node(failN1, name, idx, t_mem, n_mem, f_mem, r_mem,
30
           t_dsk, f_dsk,
31
           t_cpu, u_cpu,
32
           p_mem, p_dsk, p_rem, p_cpu,
31 33
           plist, slist, offline)
32 34
    , List
33 35
    -- * Constructor
......
41 43
    , setFmem
42 44
    , setPri
43 45
    , setSec
46
    , addCpus
44 47
    -- * Instance (re)location
45 48
    , removePri
46 49
    , removeSec
......
72 75
                 , x_mem :: Int    -- ^ Unaccounted memory (MiB)
73 76
                 , t_dsk :: Double -- ^ Total disk space (MiB)
74 77
                 , f_dsk :: Int    -- ^ Free disk space (MiB)
78
                 , t_cpu :: Double -- ^ Total CPU count
79
                 , u_cpu :: Int    -- ^ Used VCPU count
75 80
                 , plist :: [T.Idx]-- ^ List of primary instance indices
76 81
                 , slist :: [T.Idx]-- ^ List of secondary instance indices
77 82
                 , idx :: T.Ndx    -- ^ Internal index for book-keeping
......
82 87
                 , p_mem :: Double -- ^ Percent of free memory
83 88
                 , p_dsk :: Double -- ^ Percent of free disk
84 89
                 , p_rem :: Double -- ^ Percent of reserved memory
90
                 , p_cpu :: Double -- ^ Ratio of virtual to physical CPUs
85 91
                 , offline :: Bool -- ^ Whether the node should not be used
86 92
                                   -- for allocations and skipped from
87 93
                                   -- score computations
......
109 115
--
110 116
-- The index and the peers maps are empty, and will be need to be
111 117
-- update later via the 'setIdx' and 'buildPeers' functions.
112
create :: String -> Double -> Int -> Int -> Double -> Int -> Bool -> Node
118
create :: String -> Double -> Int -> Int -> Double
119
       -> Int -> Double -> Bool -> Node
113 120
create name_init mem_t_init mem_n_init mem_f_init
114
       dsk_t_init dsk_f_init offline_init =
121
       dsk_t_init dsk_f_init cpu_t_init offline_init =
115 122
    Node
116 123
    {
117 124
      name  = name_init,
......
120 127
      f_mem = mem_f_init,
121 128
      t_dsk = dsk_t_init,
122 129
      f_dsk = dsk_f_init,
130
      t_cpu = cpu_t_init,
131
      u_cpu = 0,
123 132
      plist = [],
124 133
      slist = [],
125 134
      failN1 = True,
......
129 138
      p_mem = (fromIntegral mem_f_init) / mem_t_init,
130 139
      p_dsk = (fromIntegral dsk_f_init) / dsk_t_init,
131 140
      p_rem = 0,
141
      p_cpu = 0,
132 142
      offline = offline_init,
133 143
      x_mem = 0
134 144
    }
......
178 188
setSec :: Node -> T.Idx -> Node
179 189
setSec t idx = t { slist = idx:(slist t) }
180 190

  
191
-- | Add primary cpus to a node
192
addCpus :: Node -> Int -> Node
193
addCpus t count =
194
    let new_count = (u_cpu t) + count
195
    in t { u_cpu = new_count, p_cpu = (fromIntegral new_count) / (t_cpu t) }
196

  
181 197
-- * Update functions
182 198

  
183 199
-- | Sets the free memory.
......
282 298
        sl = slist t
283 299
        mp = p_mem t
284 300
        dp = p_dsk t
301
        cp = p_cpu t
285 302
        off = offline t
286 303
        fn = failN1 t
287 304
        tmem = t_mem t
......
290 307
        fmem = f_mem t
291 308
        imem = (truncate tmem) - nmem - xmem - fmem
292 309
    in
293
      printf " %c %-*s %5.0f %5d %5d %5d %5d %5d %5.0f %5d %3d %3d %.5f %.5f"
310
      printf " %c %-*s %5.0f %5d %5d %5d %5d %5d %5.0f %5d %3d %3d\
311
             \ %.5f %.5f %.5f"
294 312
                 (if off then '-' else if fn then '*' else ' ')
295 313
                 mname (name t) tmem nmem imem xmem fmem (r_mem t)
296 314
                 ((t_dsk t) / 1024) ((f_dsk t) `div` 1024)
297 315
                 (length pl) (length sl)
298
                 mp dp
316
                 mp dp cp
b/Ganeti/HTools/Rapi.hs
97 97
    name <- fromObj "name" a
98 98
    offline <- fromObj "offline" a
99 99
    node <- (case offline of
100
               True -> return $ Node.create name 0 0 0 0 0 True
100
               True -> return $ Node.create name 0 0 0 0 0 0 True
101 101
               _ -> do
102 102
                 drained <- fromObj "drained" a
103
                 mtotal <- fromObj "mtotal" a
104
                 mnode <- fromObj "mnode" a
105
                 mfree <- fromObj "mfree" a
106
                 dtotal <- fromObj "dtotal" a
107
                 dfree <- fromObj "dfree" a
103
                 mtotal  <- fromObj "mtotal"  a
104
                 mnode   <- fromObj "mnode"   a
105
                 mfree   <- fromObj "mfree"   a
106
                 dtotal  <- fromObj "dtotal"  a
107
                 dfree   <- fromObj "dfree"   a
108
                 ctotal  <- fromObj "ctotal"  a
108 109
                 return $ Node.create name mtotal mnode mfree
109
                        dtotal dfree (offline || drained))
110
                        dtotal dfree ctotal (offline || drained))
110 111
    return (name, node)
111 112

  
112 113
-- | Builds the cluster data from an URL.
b/Ganeti/HTools/Text.hs
49 49

  
50 50
-- | Load a node from a field list.
51 51
loadNode :: (Monad m) => [String] -> m (String, Node.Node)
52
loadNode (name:tm:nm:fm:td:fd:fo:[]) = do
52
loadNode (name:tm:nm:fm:td:fd:tc:fo:[]) = do
53 53
  new_node <-
54
      if any (== "?") [tm,nm,fm,td,fd] || fo == "Y" then
55
          return $ Node.create name 0 0 0 0 0 True
54
      if any (== "?") [tm,nm,fm,td,fd,tc] || fo == "Y" then
55
          return $ Node.create name 0 0 0 0 0 0 True
56 56
      else do
57 57
        vtm <- tryRead name tm
58 58
        vnm <- tryRead name nm
59 59
        vfm <- tryRead name fm
60 60
        vtd <- tryRead name td
61 61
        vfd <- tryRead name fd
62
        return $ Node.create name vtm vnm vfm vtd vfd False
62
        vtc <- tryRead name tc
63
        return $ Node.create name vtm vnm vfm vtd vfd vtc False
63 64
  return (name, new_node)
64 65
loadNode s = fail $ "Invalid/incomplete node data: '" ++ (show s) ++ "'"
65 66

  

Also available in: Unified diff