The patch 3c260845147c6dad35e37c03ba9a7556814f3f3f fixed a bug where
adding a new disk to an instance with deactivated disks activated the
disk. However, it also introduced some erroneous behaviour, preventing
disks from being added to online instances with --no-wait-for-sync.

In line with the original meaning of the patch, this patch disallows
adding disks to shutdown instances with --no-wait-for-sync, as the
disks should not be deactivated while syncing.

Signed-off-by: Hrvoje Ribicic <[email protected]>
---
 lib/cmdlib/instance.py              |  4 ++--
 test/py/cmdlib/instance_unittest.py | 16 +++++++++++++---
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/lib/cmdlib/instance.py b/lib/cmdlib/instance.py
index 480198d..3e5a2cd 100644
--- a/lib/cmdlib/instance.py
+++ b/lib/cmdlib/instance.py
@@ -2819,11 +2819,11 @@ class LUInstanceSetParams(LogicalUnit):
                                       constants.DT_EXT),
                                      errors.ECODE_INVAL)
 
-    if not self.op.wait_for_sync and self.instance.disks_active:
+    if not self.op.wait_for_sync and not self.instance.disks_active:
       for mod in self.diskmod:
         if mod[0] == constants.DDM_ADD:
           raise errors.OpPrereqError("Can't add a disk to an instance with"
-                                     " activated disks and"
+                                     " deactivated disks and"
                                      " --no-wait-for-sync given.",
                                      errors.ECODE_INVAL)
 
diff --git a/test/py/cmdlib/instance_unittest.py 
b/test/py/cmdlib/instance_unittest.py
index 245f023..2ecb816 100644
--- a/test/py/cmdlib/instance_unittest.py
+++ b/test/py/cmdlib/instance_unittest.py
@@ -2159,9 +2159,8 @@ class TestLUInstanceSetParams(CmdlibTestCase):
                                    constants.IDISK_SIZE: 1024
                                  }]],
                          wait_for_sync=False)
-    self.ExecOpCodeExpectOpPrereqError(
-      op, "Can't add a disk to an instance with activated disks"
-          " and --no-wait-for-sync given.")
+    self.ExecOpCode(op)
+    self.assertFalse(self.rpc.call_blockdev_shutdown.called)
 
   def testAddDiskDownInstance(self):
     op = self.CopyOpCode(self.op,
@@ -2173,6 +2172,17 @@ class TestLUInstanceSetParams(CmdlibTestCase):
 
     self.assertTrue(self.rpc.call_blockdev_shutdown.called)
 
+  def testAddDiskDownInstanceNoWaitForSync(self):
+    op = self.CopyOpCode(self.op,
+                         disks=[[constants.DDM_ADD, -1,
+                                 {
+                                   constants.IDISK_SIZE: 1024
+                                 }]],
+                         wait_for_sync=False)
+    self.ExecOpCodeExpectOpPrereqError(
+      op, "Can't add a disk to an instance with deactivated disks"
+          " and --no-wait-for-sync given.")
+
   def testAddDiskRunningInstance(self):
     op = self.CopyOpCode(self.running_op,
                          disks=[[constants.DDM_ADD, -1,
-- 
2.0.0.526.g5318336

Reply via email to