Allow overriding the field list in -p
[ganeti-local] / Ganeti / HTools / Cluster.hs
index d8337ae..9a94d0b 100644 (file)
@@ -195,23 +195,30 @@ compDetailedCV nl =
         (offline, nodes) = partition Node.offline all_nodes
         mem_l = map Node.pMem nodes
         dsk_l = map Node.pDsk nodes
+        -- metric: memory covariance
         mem_cv = varianceCoeff mem_l
+        -- metric: disk covariance
         dsk_cv = varianceCoeff dsk_l
         n1_l = length $ filter Node.failN1 nodes
+        -- metric: ratio of failN1 nodes
         n1_score = fromIntegral n1_l /
                    fromIntegral (length nodes)::Double
         res_l = map Node.pRem nodes
+        -- metric: reserved memory covariance
         res_cv = varianceCoeff res_l
         offline_inst = sum . map (\n -> (length . Node.pList $ n) +
                                         (length . Node.sList $ n)) $ offline
         online_inst = sum . map (\n -> (length . Node.pList $ n) +
                                        (length . Node.sList $ n)) $ nodes
+        -- metric: ratio of instances on offline nodes
         off_score = if offline_inst == 0
                     then 0::Double
                     else fromIntegral offline_inst /
                          fromIntegral (offline_inst + online_inst)::Double
         cpu_l = map Node.pCpu nodes
+        -- metric: covariance of vcpu/pcpu ratio
         cpu_cv = varianceCoeff cpu_l
+        -- metrics: covariance of cpu, memory, disk and network load
         (c_load, m_load, d_load, n_load) = unzip4 $
             map (\n ->
                      let DynUtil c1 m1 d1 n1 = Node.utilLoad n
@@ -652,30 +659,39 @@ printSolution nl il sol =
       unzip $ zipWith (printSolutionLine nl il nmlen imlen) sol [1..]
 
 -- | Print the node list.
-printNodes :: Node.List -> String
-printNodes nl =
-    let snl = sortBy (compare `on` Node.idx) (Container.elems nl)
-        header = ["F", "Name"
-                 , "t_mem", "n_mem", "i_mem", "x_mem", "f_mem", "r_mem"
-                 , "t_dsk", "f_dsk", "pcpu", "vcpu", "pri",  "sec"
-                 , "p_fmem", "p_fdsk", "r_cpu"
-                 , "lCpu", "lMem", "lDsk", "lNet" ]
-        isnum = False:False:repeat True
+printNodes :: Node.List -> [String] -> String
+printNodes nl fs =
+    let fields = if null fs
+                 then Node.defaultFields
+                 else fs
+        snl = sortBy (compare `on` Node.idx) (Container.elems nl)
+        (header, isnum) = unzip $ map Node.showHeader fields
     in unlines . map ((:) ' ' .  intercalate " ") $
-       formatTable (header:map Node.list snl) isnum
+       formatTable (header:map (Node.list fields) snl) isnum
 
 -- | Print the instance list.
 printInsts :: Node.List -> Instance.List -> String
 printInsts nl il =
     let sil = sortBy (compare `on` Instance.idx) (Container.elems il)
-        helper inst = [ (Instance.name inst)
-                      , (Container.nameOf nl (Instance.pNode inst))
+        helper inst = [ if Instance.running inst then "R" else " "
+                      , Instance.name inst
+                      , Container.nameOf nl (Instance.pNode inst)
                       , (let sdx = Instance.sNode inst
                          in if sdx == Node.noSecondary
                             then  ""
-                            else Container.nameOf nl sdx) ]
-        header = ["Name", "Pri_node", "Sec_node"]
-        isnum = repeat False
+                            else Container.nameOf nl sdx)
+                      , printf "%3d" $ Instance.vcpus inst
+                      , printf "%5d" $ Instance.mem inst
+                      , printf "%5d" $ Instance.dsk inst `div` 1024
+                      , printf "%5.3f" lC
+                      , printf "%5.3f" lM
+                      , printf "%5.3f" lD
+                      , printf "%5.3f" lN
+                      ]
+            where DynUtil lC lM lD lN = Instance.util inst
+        header = [ "F", "Name", "Pri_node", "Sec_node", "vcpu", "mem"
+                 , "dsk", "lCpu", "lMem", "lDsk", "lNet" ]
+        isnum = False:False:False:False:repeat True
     in unlines . map ((:) ' ' . intercalate " ") $
        formatTable (header:map helper sil) isnum