'GetInstanceDisks' returns a list of disk objects for the given
instance. 'GetDiskInfo' returns information about a disk given its UUID.
These functions should be used instead of the Instance's disk method.

Also add the 'getDisk' and 'getInstDisks' functions in Haskell but leave
'getInstDisks' commented out, as it doesn't typecheck yet.

Signed-off-by: Ilias Tsitsimpis <[email protected]>
---
 lib/config.py        | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/Ganeti/Config.hs | 21 +++++++++++++++++++++
 2 files changed, 72 insertions(+)

diff --git a/lib/config.py b/lib/config.py
index 54df32e..f926e30 100644
--- a/lib/config.py
+++ b/lib/config.py
@@ -350,6 +350,57 @@ class ConfigWriter(object):
     nodegroup = self._UnlockedGetNodeGroup(node.group)
     return self._UnlockedGetGroupDiskParams(nodegroup)
 
+  def _UnlockedGetInstanceDisks(self, inst_uuid):
+    """Return the disks' info for the given instance
+
+    @type inst_uuid: string
+    @param inst_uuid: The UUID of the instance we want to know the disks for
+
+    @rtype: List of L{objects.Disk}
+    @return: A list with all the disks' info
+
+    """
+    instance = self._UnlockedGetInstanceInfo(inst_uuid)
+    if instance is None:
+      raise errors.ConfigurationError("Unknown instance '%s'" % inst_uuid)
+
+    return [self._UnlockedGetDiskInfo(disk_uuid)
+            for disk_uuid in instance.disks]
+
+  @_ConfigSync(shared=1)
+  def GetInstanceDisks(self, inst_uuid):
+    """Return the disks' info for the given instance
+
+    This is a simple wrapper over L{_UnlockedGetInstanceDisks}.
+
+    """
+    return self._UnlockedGetInstanceDisks(inst_uuid)
+
+  def _UnlockedGetDiskInfo(self, disk_uuid):
+    """Returns information about a disk.
+
+    It takes the information from the configuration file.
+
+    @param disk_uuid: UUID of the disk
+
+    @rtype: L{objects.Disk}
+    @return: the disk object
+
+    """
+    if disk_uuid not in self._ConfigData().disks:
+      return None
+
+    return self._ConfigData().disks[disk_uuid]
+
+  @_ConfigSync(shared=1)
+  def GetDiskInfo(self, disk_uuid):
+    """Returns information about a disk.
+
+    This is a simple wrapper over L{_UnlockedGetDiskInfo}.
+
+    """
+    return self._UnlockedGetDiskInfo(disk_uuid)
+
   def _UnlockedGetInstanceNodes(self, inst_uuid):
     """Get all disk-related nodes for an instance.
 
diff --git a/src/Ganeti/Config.hs b/src/Ganeti/Config.hs
index 790742e..bfffc2e 100644
--- a/src/Ganeti/Config.hs
+++ b/src/Ganeti/Config.hs
@@ -39,6 +39,7 @@ module Ganeti.Config
     , getOnlineNodes
     , getNode
     , getInstance
+    , getDisk
     , getGroup
     , getGroupNdParams
     , getGroupIpolicy
@@ -49,6 +50,8 @@ module Ganeti.Config
     , getInstPrimaryNode
     , getInstMinorsForNode
     , getInstAllNodes
+    , getInstDisks
+    , getInstDisksFromObj
     , getFilledInstHvParams
     , getFilledInstBeParams
     , getFilledInstOsParams
@@ -216,6 +219,12 @@ getInstance cfg name =
                               (instName . (M.!) instances) instances
                 in getItem "Instance" name by_name
 
+-- | Looks up a disk by uuid.
+getDisk :: ConfigData -> String -> ErrorResult Disk
+getDisk cfg name =
+  let disks = fromContainer (configDisks cfg)
+  in getItem "Disk" name disks
+
 -- | Looks up a node group by name or uuid.
 getGroup :: ConfigData -> String -> ErrorResult NodeGroup
 getGroup cfg name =
@@ -334,6 +343,18 @@ getInstAllNodes cfg name = do
   pNode <- getInstPrimaryNode cfg name
   return . nub $ pNode:diskNodes
 
+-- | Get disks for a given instance.
+-- The instance is specified by name or uuid.
+getInstDisks :: ConfigData -> String -> ErrorResult [Disk]
+getInstDisks cfg =
+  -- getInstance cfg iname >>= mapM (getDisk cfg) . instDisks
+  liftM instDisks . getInstance cfg
+
+-- | Get disks for a given instance object.
+getInstDisksFromObj :: ConfigData -> Instance -> ErrorResult [Disk]
+getInstDisksFromObj cfg =
+  getInstDisks cfg . instUuid
+
 -- | Filters DRBD minors for a given node.
 getDrbdMinorsForNode :: String -> Disk -> [(Int, String)]
 getDrbdMinorsForNode node disk =
-- 
1.9.1

Reply via email to