diff --git a/Ganeti/HTools/IAlloc.hs b/Ganeti/HTools/IAlloc.hs index f6a27337089f88eb3b6f4fc353c135cfeef83736..241bbd8508c28eafc78dc683a9ffd8da2264912d 100644 --- a/Ganeti/HTools/IAlloc.hs +++ b/Ganeti/HTools/IAlloc.hs @@ -82,12 +82,12 @@ parseData body = do nlist <- fromObj "nodes" obj let ndata = fromJSObject nlist nobj <- (mapM (\(x,y) -> asJSObject y >>= parseNode x)) ndata - let (ktn, nl) = assignIndices Node.setIdx nobj + let (ktn, nl) = assignIndices nobj -- existing instance parsing ilist <- fromObj "instances" obj let idata = fromJSObject ilist iobj <- (mapM (\(x,y) -> asJSObject y >>= parseInstance ktn x)) idata - let (kti, il) = assignIndices Instance.setIdx iobj + let (kti, il) = assignIndices iobj optype <- fromObj "type" request rqtype <- case optype of diff --git a/Ganeti/HTools/Instance.hs b/Ganeti/HTools/Instance.hs index f7b9b42d43d4e4d623c2678077467d0b5be80796..8aecf72b4716bf8729a85fe3203ea2dd50f503dd 100644 --- a/Ganeti/HTools/Instance.hs +++ b/Ganeti/HTools/Instance.hs @@ -62,3 +62,7 @@ setIdx :: Instance -- ^ the original instance -> Int -- ^ new index -> Instance -- ^ the modified instance setIdx t i = t { idx = i } + +-- | Changes the name +-- This is used only during the building of the data structures. +setName t s = t {name = s} diff --git a/Ganeti/HTools/Loader.hs b/Ganeti/HTools/Loader.hs index 11f73b532bf8a3f7e944020b8c2af8d47db2f10c..4b9bc7b49bf12abd1d5bf5abeab5bb0e79795594 100644 --- a/Ganeti/HTools/Loader.hs +++ b/Ganeti/HTools/Loader.hs @@ -28,11 +28,11 @@ lookupNode ktn inst node = Nothing -> fail $ "Unknown node '" ++ node ++ "' for instance " ++ inst Just idx -> return idx -assignIndices :: (a -> Int -> a) - -> [(String, a)] +assignIndices :: (Element a) => + [(String, a)] -> (NameAssoc, [(Int, a)]) -assignIndices set_fn = - unzip . map (\ (idx, (k, v)) -> ((k, idx), (idx, set_fn v idx))) +assignIndices = + unzip . map (\ (idx, (k, v)) -> ((k, idx), (idx, setIdx v idx))) . zip [0..] -- | For each instance, add its index to its primary and secondary nodes diff --git a/Ganeti/HTools/Node.hs b/Ganeti/HTools/Node.hs index 228107e5b8227107a86eb53427612a77cbd8e1d8..9f54f03707c6bf9e27b4731667dd9d99db23decf 100644 --- a/Ganeti/HTools/Node.hs +++ b/Ganeti/HTools/Node.hs @@ -14,6 +14,7 @@ module Ganeti.HTools.Node -- ** Finalization after data loading , buildPeers , setIdx + , setName , setOffline , setXmem , setFmem @@ -102,6 +103,10 @@ create name_init mem_t_init mem_n_init mem_f_init setIdx :: Node -> Int -> Node setIdx t i = t {idx = i} +-- | Changes the name +-- This is used only during the building of the data structures. +setName t s = t {name = s} + -- | Sets the offline attribute setOffline :: Node -> Bool -> Node setOffline t val = t { offline = val } diff --git a/Ganeti/HTools/Rapi.hs b/Ganeti/HTools/Rapi.hs index 6f20e7bf4553967a1ae6d707f84c81e598fe624a..ac0ff44fad9addf2ccf011954ed1da97922d12aa 100644 --- a/Ganeti/HTools/Rapi.hs +++ b/Ganeti/HTools/Rapi.hs @@ -92,7 +92,7 @@ loadData master = do -- IO monad inst_body <- getUrl $ printf "%s/2/instances?bulk=1" url return $ do -- Result monad node_data <- node_body >>= getNodes - let (node_names, node_idx) = assignIndices Node.setIdx node_data + let (node_names, node_idx) = assignIndices node_data inst_data <- inst_body >>= getInstances node_names - let (inst_names, inst_idx) = assignIndices Instance.setIdx inst_data + let (inst_names, inst_idx) = assignIndices inst_data return (node_names, node_idx, inst_names, inst_idx) diff --git a/Ganeti/HTools/Text.hs b/Ganeti/HTools/Text.hs index 03ff5cf6b5e3d44f1acc7a5591ea6b8698a5bb33..7c85db3fe3402b0ce79e48f185f40a31997786f7 100644 --- a/Ganeti/HTools/Text.hs +++ b/Ganeti/HTools/Text.hs @@ -64,13 +64,14 @@ This function converts a text in tabular format as generated by supplied conversion function. -} -loadTabular :: (Monad m) => String -> ([String] -> m (String, a)) - -> (a -> Int -> a) -> m ([(String, Int)], [(Int, a)]) -loadTabular text_data convert_fn set_fn = do +loadTabular :: (Monad m, Element a) => + String -> ([String] -> m (String, a)) + -> m ([(String, Int)], [(Int, a)]) +loadTabular text_data convert_fn = do let lines_data = lines text_data rows = map (sepSplit '|') lines_data kerows <- mapM convert_fn rows - return $ assignIndices set_fn kerows + return $ assignIndices kerows loadData :: String -- ^ Node data in string format -> String -- ^ Instance data in string format @@ -81,7 +82,7 @@ loadData nfile ifile = do -- IO monad idata <- readFile ifile return $ do {- node file: name t_mem n_mem f_mem t_disk f_disk -} - (ktn, nl) <- loadTabular ndata loadNode Node.setIdx + (ktn, nl) <- loadTabular ndata loadNode {- instance file: name mem disk status pnode snode -} - (kti, il) <- loadTabular idata (loadInst ktn) Instance.setIdx + (kti, il) <- loadTabular idata (loadInst ktn) return (ktn, nl, kti, il) diff --git a/Ganeti/HTools/Types.hs b/Ganeti/HTools/Types.hs index 0a248028e0e791751f5a6d41a9abe8a00ecfcf27..8bae7c3d038c8e444f880a85ef743a427c1e2b7b 100644 --- a/Ganeti/HTools/Types.hs +++ b/Ganeti/HTools/Types.hs @@ -39,3 +39,24 @@ instance Monad Result where (>>=) (Ok x) fn = fn x return = Ok fail = Bad + +-- | A generic class for nodes and instances +class Element a where + name :: a -> String + idx :: a -> Int + setName :: a -> String -> a + setIdx :: a -> Int -> a + +-- Let's make nodes elements of the cluster +instance Element Node.Node where + name = Node.name + idx = Node.idx + setName = Node.setName + setIdx = Node.setIdx + +-- And instances too +instance Element Instance.Instance where + name = Instance.name + idx = Instance.idx + setName = Instance.setName + setIdx = Instance.setIdx