for an instance. Signed-off-by: BSRK Aditya <[email protected]> --- src/Ganeti/WConfd/ConfigModifications.hs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/src/Ganeti/WConfd/ConfigModifications.hs b/src/Ganeti/WConfd/ConfigModifications.hs index ecb4860..019ca35 100644 --- a/src/Ganeti/WConfd/ConfigModifications.hs +++ b/src/Ganeti/WConfd/ConfigModifications.hs @@ -44,10 +44,12 @@ import Control.Lens.Traversal (mapMOf) import Data.Maybe (isJust) import Language.Haskell.TH (Name) import Text.Printf (printf) +import qualified Data.Map as M import Ganeti.BasicTypes (GenericResult(..)) import Ganeti.Errors (GanetiException(..)) -import Ganeti.JSON (alterContainerL, lookupContainer) +import Ganeti.JSON (GenericContainer(..), Container + , alterContainerL, lookupContainer) import Ganeti.Locking.Locks (ClientId, ciIdentifier) import Ganeti.Logging.Lifted (logDebug) import Ganeti.Objects @@ -58,6 +60,7 @@ import qualified Ganeti.WConfd.TempRes as T type DiskUUID = String type InstanceUUID = String +type NodeUUID = String -- * Accessor functions @@ -76,6 +79,27 @@ getInstanceByUUID cs uuid = lookupContainer uuid (configInstances . csConfigData $ cs) +-- * getters + +getInstanceLVsByNode' :: InstanceUUID + -> ConfigState + -> GenericResult GanetiException (Container [String]) +getInstanceLVsByNode' iUuid cs = do + inst <- getInstanceByUUID cs iUuid + nUuid <- maybe + (Bad $ ConfigurationError "Could not retrive primary node of instance") + Ok (instPrimaryNode inst) + disks <- mapM (getDiskByUUID cs) (instDisks inst) + return . GenericContainer $ mapLVsByNode nUuid disks + where mapLVsByNode :: NodeUUID -> [Disk] -> M.Map NodeUUID [String] + mapLVsByNode nUuid disks = M.unionsWith (++) $ map + (\disk -> case diskLogicalId disk of + Just (LIDPlain lv) -> M.singleton nUuid [convert lv] + Just (LIDDrbd8 nUuid1 nUuid2 _ _ _ _) -> M.unionWith (++) + (mapLVsByNode nUuid1 (diskChildren disk)) + (mapLVsByNode nUuid2 (diskChildren disk)) + _ -> mapLVsByNode nUuid (diskChildren disk)) disks + convert (LogicalVolume lvG lvV) = lvG ++ "/" ++ lvV -- | Add a new instance to the configuration, release DRBD minors, -- and commit temporary IPs, all while temporarily holding the config -- lock. Return True upon success and False if the config lock was not -- 1.7.10.4
