LUInstanceSetParams: Update disk's “iv_name”
authorMichael Hanselmann <hansmi@google.com>
Wed, 15 Feb 2012 16:52:47 +0000 (17:52 +0100)
committerMichael Hanselmann <hansmi@google.com>
Fri, 17 Feb 2012 13:16:19 +0000 (14:16 +0100)
When modifications are made, disks may not have the same index anymore.
Updating all disks fixes this.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: René Nussbaumer <rn@google.com>

lib/cmdlib.py
test/ganeti.cmdlib_unittest.py

index 85e2959..b8a375c 100644 (file)
@@ -11894,6 +11894,16 @@ def ApplyContainerMods(kind, container, chgdesc, mods,
       chgdesc.extend(changes)
 
 
+def _UpdateIvNames(base_index, disks):
+  """Updates the C{iv_name} attribute of disks.
+
+  @type disks: list of L{objects.Disk}
+
+  """
+  for (idx, disk) in enumerate(disks):
+    disk.iv_name = "disk/%s" % (base_index + idx, )
+
+
 class _InstNicModPrivate:
   """Data structure for network interface modifications.
 
@@ -12699,6 +12709,7 @@ class LUInstanceSetParams(LogicalUnit):
     # Apply disk changes
     ApplyContainerMods("disk", instance.disks, result, self.diskmod,
                        self._CreateNewDisk, self._ModifyDisk, self._RemoveDisk)
+    _UpdateIvNames(0, instance.disks)
 
     if self.op.disk_template:
       if __debug__:
index 9d07fb4..df0ca4e 100755 (executable)
@@ -1039,11 +1039,16 @@ class TestGenerateDiskTemplate(unittest.TestCase):
       self.assertEqual(disk.mode, disk_info[idx][constants.IDISK_MODE])
       self.assertTrue(disk.children is None)
 
-    self.assertEqual(map(operator.attrgetter("iv_name"), result),
-      ["disk/%s" % i for i in range(base_index, base_index + len(disk_info))])
+    self._CheckIvNames(result, base_index, base_index + len(disk_info))
+    cmdlib._UpdateIvNames(base_index, result)
+    self._CheckIvNames(result, base_index, base_index + len(disk_info))
 
     return result
 
+  def _CheckIvNames(self, disks, base_index, end_index):
+    self.assertEqual(map(operator.attrgetter("iv_name"), disks),
+                     ["disk/%s" % i for i in range(base_index, end_index)])
+
   def testPlain(self):
     disk_info = [{
       constants.IDISK_SIZE: 1024,
@@ -1198,8 +1203,9 @@ class TestGenerateDiskTemplate(unittest.TestCase):
       self.assertEqual(disk.children[0].size, disk.size)
       self.assertEqual(disk.children[1].size, cmdlib.DRBD_META_SIZE)
 
-    self.assertEqual(map(operator.attrgetter("iv_name"), result),
-                     ["disk/0", "disk/1", "disk/2"])
+    self._CheckIvNames(result, 0, len(disk_info))
+    cmdlib._UpdateIvNames(0, result)
+    self._CheckIvNames(result, 0, len(disk_info))
 
     self.assertEqual(map(operator.attrgetter("logical_id"), result), [
       ("node1334.example.com", "node12272.example.com",