diff --git a/htools/Ganeti/HTools/QC.hs b/htools/Ganeti/HTools/QC.hs index e4cd394d02f05b7d7a301015e68c26fac7b186b9..31b745bf8847b4b3ef5eb025147b3eabfe1f4ed4 100644 --- a/htools/Ganeti/HTools/QC.hs +++ b/htools/Ganeti/HTools/QC.hs @@ -754,11 +754,12 @@ testSuite "Instance" prop_Text_Load_Instance name mem dsk vcpus status (NonEmpty pnode) snode - (NonNegative pdx) (NonNegative sdx) autobal dt = + (NonNegative pdx) (NonNegative sdx) autobal dt su = pnode /= snode && pdx /= sdx ==> let vcpus_s = show vcpus dsk_s = show dsk mem_s = show mem + su_s = show su status_s = Types.instanceStatusToRaw status ndx = if null snode then [(pnode, pdx)] @@ -769,7 +770,7 @@ prop_Text_Load_Instance name mem dsk vcpus status sdt = Types.diskTemplateToRaw dt inst = Text.loadInst nl [name, mem_s, dsk_s, vcpus_s, status_s, - sbal, pnode, snode, sdt, tags] + sbal, pnode, snode, sdt, tags, su_s] fail1 = Text.loadInst nl [name, mem_s, dsk_s, vcpus_s, status_s, sbal, pnode, pnode, tags] @@ -789,10 +790,11 @@ prop_Text_Load_Instance name mem dsk vcpus status then Node.noSecondary else sdx) && Instance.autoBalance i == autobal && + Instance.spindleUsage i == su && Types.isBad fail1 prop_Text_Load_InstanceFail ktn fields = - length fields /= 10 ==> + length fields /= 10 && length fields /= 11 ==> case Text.loadInst nl fields of Types.Ok _ -> failTest "Managed to load instance from invalid data" Types.Bad msg -> printTestCase ("Unrecognised error message: " ++ msg) $ diff --git a/htools/Ganeti/HTools/Text.hs b/htools/Ganeti/HTools/Text.hs index fc943e996eb9bf60a5ae6bda5b856703c5fcb3f4..957758cb4352d83d9941ab7876c34f21665744d8 100644 --- a/htools/Ganeti/HTools/Text.hs +++ b/htools/Ganeti/HTools/Text.hs @@ -102,12 +102,12 @@ serializeInstance nl inst = snode = (if sidx == Node.noSecondary then "" else Container.nameOf nl sidx) - in printf "%s|%d|%d|%d|%s|%s|%s|%s|%s|%s" + in printf "%s|%d|%d|%d|%s|%s|%s|%s|%s|%s|%d" iname (Instance.mem inst) (Instance.dsk inst) (Instance.vcpus inst) (instanceStatusToRaw (Instance.runSt inst)) (if Instance.autoBalance inst then "Y" else "N") pnode snode (diskTemplateToRaw (Instance.diskTemplate inst)) - (intercalate "," (Instance.tags inst)) + (intercalate "," (Instance.tags inst)) (Instance.spindleUsage inst) -- | Generate instance file data from instance objects. serializeInstances :: Node.List -> Instance.List -> String @@ -206,7 +206,7 @@ loadInst :: NameAssoc -- ^ Association list with the current nodes -- instance name and -- the instance object loadInst ktn [ name, mem, dsk, vcpus, status, auto_bal, pnode, snode - , dt, tags ] = do + , dt, tags, su ] = do pidx <- lookupNode ktn name pnode sidx <- if null snode then return Node.noSecondary @@ -222,12 +222,18 @@ loadInst ktn [ name, mem, dsk, vcpus, status, auto_bal, pnode, snode "' for instance " ++ name disk_template <- annotateResult ("Instance " ++ name) (diskTemplateFromRaw dt) + spindle_usage <- tryRead name su when (sidx == pidx) $ fail $ "Instance " ++ name ++ " has same primary and secondary node - " ++ pnode let vtags = commaSplit tags newinst = Instance.create name vmem vdsk vvcpus vstatus vtags - auto_balance pidx sidx disk_template 1 + auto_balance pidx sidx disk_template spindle_usage return (name, newinst) + +loadInst ktn [ name, mem, dsk, vcpus, status, auto_bal, pnode, snode + , dt, tags ] = loadInst ktn [ name, mem, dsk, vcpus, status, + auto_bal, pnode, snode, dt, tags, + "1" ] loadInst _ s = fail $ "Invalid/incomplete instance data: '" ++ show s ++ "'" -- | Loads a spec from a field list.