Revision 0c8cef35 htools/Ganeti/HTools/Cluster.hs

b/htools/Ganeti/HTools/Cluster.hs
395 395
                new_inst, old_sdx, old_pdx)
396 396
  in new_nl
397 397

  
398
-- Failover to any (fa)
399
applyMove nl inst (FailoverToAny new_pdx) = do
400
  let (old_pdx, old_sdx, old_pnode, _) = instanceNodes nl inst
401
      new_pnode = Container.find new_pdx nl
402
      force_failover = Node.offline old_pnode
403
  new_pnode' <- Node.addPriEx force_failover new_pnode inst
404
  let old_pnode' = Node.removePri old_pnode inst
405
      inst' = Instance.setPri inst new_pdx
406
      nl' = Container.addTwo old_pdx old_pnode' new_pdx new_pnode' nl
407
  return (nl', inst', new_pdx, old_sdx)
408

  
398 409
-- Replace the primary (f:, r:np, f)
399 410
applyMove nl inst (ReplacePrimary new_pdx) =
400 411
  let (old_pdx, old_sdx, old_p, old_s) = instanceNodes nl inst
......
520 531

  
521 532
possibleMoves MirrorNone _ _ _ = []
522 533

  
523
possibleMoves MirrorExternal _ _ _ = []
534
possibleMoves MirrorExternal _ False _ = []
535

  
536
possibleMoves MirrorExternal _ True tdx =
537
  [ FailoverToAny tdx ]
524 538

  
525 539
possibleMoves MirrorInternal _ False tdx =
526 540
  [ ReplaceSecondary tdx ]
......
1215 1229
computeMoves i inam mv c d =
1216 1230
  case mv of
1217 1231
    Failover -> ("f", [mig])
1232
    FailoverToAny _ -> (printf "fa:%s" c, [mig_any])
1218 1233
    FailoverAndReplace _ -> (printf "f r:%s" d, [mig, rep d])
1219 1234
    ReplaceSecondary _ -> (printf "r:%s" d, [rep d])
1220 1235
    ReplaceAndFailover _ -> (printf "r:%s f" c, [rep c, mig])
1221 1236
    ReplacePrimary _ -> (printf "f r:%s f" c, [mig, rep c, mig])
1222 1237
  where morf = if Instance.isRunning i then "migrate" else "failover"
1223 1238
        mig = printf "%s -f %s" morf inam::String
1239
        mig_any = printf "%s -f -n %s %s" morf c inam
1224 1240
        rep n = printf "replace-disks -n %s %s" n inam
1225 1241

  
1226 1242
-- | Converts a placement to string format.
......
1374 1390
      iname = Instance.name inst
1375 1391
      lookNode  = Just . Container.nameOf nl
1376 1392
      opF = OpCodes.OpInstanceMigrate iname True False True Nothing
1393
      opFA n = OpCodes.OpInstanceMigrate iname True False True (lookNode n)
1377 1394
      opR n = OpCodes.OpInstanceReplaceDisks iname (lookNode n)
1378 1395
              OpCodes.ReplaceNewSecondary [] Nothing
1379 1396
  in case move of
1380 1397
       Failover -> [ opF ]
1398
       FailoverToAny np -> [ opFA np ]
1381 1399
       ReplacePrimary np -> [ opF, opR np, opF ]
1382 1400
       ReplaceSecondary ns -> [ opR ns ]
1383 1401
       ReplaceAndFailover np -> [ opR np, opF ]

Also available in: Unified diff