Fix typo in LUGroupAssignNodes
[ganeti-local] / lib / bdev.py
index 3352885..7904eea 100644 (file)
@@ -230,6 +230,20 @@ class BlockDev(object):
         result = result and child.SetSyncSpeed(speed)
     return result
 
+  def PauseResumeSync(self, pause):
+    """Pause/Resume the sync of the mirror.
+
+    In case this is not a mirroring device, this is no-op.
+
+    @param pause: Wheater to pause or resume
+
+    """
+    result = True
+    if self._children:
+      for child in self._children:
+        result = result and child.PauseResumeSync(pause)
+    return result
+
   def GetSyncStatus(self):
     """Returns the sync status of the device.
 
@@ -488,24 +502,26 @@ class LogicalVolume(BlockDev):
     @param filter_readonly: whether to skip over readonly VGs
 
     @rtype: list
-    @return: list of tuples (free_space, name) with free_space in mebibytes
+    @return: list of tuples (free_space, total_size, name) with free_space in
+             MiB
 
     """
     try:
-      info = cls._GetVolumeInfo("vgs", ["vg_name", "vg_free", "vg_attr"])
+      info = cls._GetVolumeInfo("vgs", ["vg_name", "vg_free", "vg_attr",
+                                        "vg_size"])
     except errors.GenericError, err:
       logging.error("Can't get VG information: %s", err)
       return None
 
     data = []
-    for vg_name, vg_free, vg_attr in info:
+    for vg_name, vg_free, vg_attr, vg_size in info:
       # (possibly) skip over vgs which are not writable
       if filter_readonly and vg_attr[0] == "r":
         continue
       # (possibly) skip over vgs which are not in the right volume group(s)
       if vg_names and vg_name not in vg_names:
         continue
-      data.append((float(vg_free), vg_name))
+      data.append((float(vg_free), float(vg_size), vg_name))
 
     return data
 
@@ -692,6 +708,8 @@ class LogicalVolume(BlockDev):
   def Snapshot(self, size):
     """Create a snapshot copy of an lvm block device.
 
+    @returns: tuple (vg, lv)
+
     """
     snap_name = self._lv_name + ".snap"
 
@@ -702,7 +720,7 @@ class LogicalVolume(BlockDev):
     vg_info = self.GetVGInfo([self._vg_name])
     if not vg_info:
       _ThrowError("Can't compute VG info for vg %s", self._vg_name)
-    free_size, _ = vg_info[0]
+    free_size, _, _ = vg_info[0]
     if free_size < size:
       _ThrowError("Not enough free space: required %s,"
                   " available %s", size, free_size)
@@ -713,7 +731,7 @@ class LogicalVolume(BlockDev):
       _ThrowError("command: %s error: %s - %s",
                   result.cmd, result.fail_reason, result.output)
 
-    return snap_name
+    return (self._vg_name, snap_name)
 
   def SetInfo(self, text):
     """Update metadata with info text.
@@ -1484,6 +1502,30 @@ class DRBD8(BaseDRBD):
     children_result = super(DRBD8, self).SetSyncSpeed(kbytes)
     return self._SetMinorSyncSpeed(self.minor, kbytes) and children_result
 
+  def PauseResumeSync(self, pause):
+    """Pauses or resumes the sync of a DRBD device.
+
+    @param pause: Wether to pause or resume
+    @return: the success of the operation
+
+    """
+    if self.minor is None:
+      logging.info("Not attached during PauseSync")
+      return False
+
+    children_result = super(DRBD8, self).PauseResumeSync(pause)
+
+    if pause:
+      cmd = "pause-sync"
+    else:
+      cmd = "resume-sync"
+
+    result = utils.RunCmd(["drbdsetup", self.dev_path, cmd])
+    if result.failed:
+      logging.error("Can't %s: %s - %s", cmd,
+                    result.fail_reason, result.output)
+    return not result.failed and children_result
+
   def GetProcStatus(self):
     """Return device data from /proc.