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

Reply via email to