+-- | Loads a spec from a field list.
+loadISpec :: String -> [String] -> Result ISpec
+loadISpec owner [mem_s, cpu_c, dsk_s, dsk_c, nic_c, su] = do
+ xmem_s <- tryRead (owner ++ "/memsize") mem_s
+ xcpu_c <- tryRead (owner ++ "/cpucount") cpu_c
+ xdsk_s <- tryRead (owner ++ "/disksize") dsk_s
+ xdsk_c <- tryRead (owner ++ "/diskcount") dsk_c
+ xnic_c <- tryRead (owner ++ "/niccount") nic_c
+ xsu <- tryRead (owner ++ "/spindleuse") su
+ return $ ISpec xmem_s xcpu_c xdsk_s xdsk_c xnic_c xsu
+loadISpec owner s = fail $ "Invalid ispec data for " ++ owner ++ ": " ++ show s
+
+-- | Loads an ipolicy from a field list.
+loadIPolicy :: [String] -> Result (String, IPolicy)
+loadIPolicy [owner, stdspec, minspec, maxspec, dtemplates,
+ vcpu_ratio, spindle_ratio] = do
+ xstdspec <- loadISpec (owner ++ "/stdspec") (commaSplit stdspec)
+ xminspec <- loadISpec (owner ++ "/minspec") (commaSplit minspec)
+ xmaxspec <- loadISpec (owner ++ "/maxspec") (commaSplit maxspec)
+ xdts <- mapM diskTemplateFromRaw $ commaSplit dtemplates
+ xvcpu_ratio <- tryRead (owner ++ "/vcpu_ratio") vcpu_ratio
+ xspindle_ratio <- tryRead (owner ++ "/spindle_ratio") spindle_ratio
+ return $ (owner, IPolicy xstdspec xminspec xmaxspec xdts
+ xvcpu_ratio xspindle_ratio)
+loadIPolicy s = fail $ "Invalid ipolicy data: '" ++ show s ++ "'"
+
+loadOnePolicy :: (IPolicy, Group.List) -> String
+ -> Result (IPolicy, Group.List)
+loadOnePolicy (cpol, gl) line = do
+ (owner, ipol) <- loadIPolicy (sepSplit '|' line)
+ case owner of
+ "" -> return (ipol, gl) -- this is a cluster policy (no owner)
+ _ -> do
+ grp <- Container.findByName gl owner
+ let grp' = grp { Group.iPolicy = ipol }
+ gl' = Container.add (Group.idx grp') grp' gl
+ return (cpol, gl')
+
+-- | Loads all policies from the policy section
+loadAllIPolicies :: Group.List -> [String] -> Result (IPolicy, Group.List)
+loadAllIPolicies gl =
+ foldM loadOnePolicy (defIPolicy, gl)
+