With the new format for cmdline arguments, the user is able to add a
disk to an instance at a specific index. But filebased disks' filenames
have the form "{0}/disk{1}" where '{0}' is the file_storage_dir and
'{1}' is the index of the disk. So if an instance has 3 disks and we
try to create a new one at index 1, the operation will fail because the
filename "{0}/disk1" already exists.This patch fixes the above problem and also makes the naming of file and sharedfile disks uniform with other templates. Signed-off-by: Ilias Tsitsimpis <[email protected]> --- lib/cmdlib/instance_storage.py | 6 ++++-- test/py/ganeti.cmdlib_unittest.py | 12 +++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/cmdlib/instance_storage.py b/lib/cmdlib/instance_storage.py index b1fea8b..c22bedb 100644 --- a/lib/cmdlib/instance_storage.py +++ b/lib/cmdlib/instance_storage.py @@ -52,6 +52,8 @@ _DISK_TEMPLATE_NAME_PREFIX = { constants.DT_PLAIN: "", constants.DT_RBD: ".rbd", constants.DT_EXT: ".ext", + constants.DT_FILE: ".file", + constants.DT_SHARED_FILE: ".sharedfile", } @@ -470,8 +472,8 @@ def GenerateDiskTemplate( elif template_name in (constants.DT_FILE, constants.DT_SHARED_FILE): logical_id_fn = \ lambda _, disk_index, disk: (file_driver, - "%s/disk%d" % (file_storage_dir, - disk_index)) + "%s/%s" % (file_storage_dir, + names[idx])) elif template_name == constants.DT_BLOCK: logical_id_fn = \ lambda idx, disk_index, disk: (constants.BLOCKDEV_DRIVER_MANUAL, diff --git a/test/py/ganeti.cmdlib_unittest.py b/test/py/ganeti.cmdlib_unittest.py index 21b2c26..95c8f6f 100755 --- a/test/py/ganeti.cmdlib_unittest.py +++ b/test/py/ganeti.cmdlib_unittest.py @@ -23,6 +23,7 @@ import os +import re import unittest import tempfile import shutil @@ -1282,11 +1283,12 @@ class TestGenerateDiskTemplate(unittest.TestCase): req_file_storage=self._AllowFileStorage, req_shr_file_storage=self._AllowFileStorage) - self.assertEqual(map(operator.attrgetter("logical_id"), result), [ - (constants.FD_BLKTAP, "/tmp/disk2"), - (constants.FD_BLKTAP, "/tmp/disk3"), - (constants.FD_BLKTAP, "/tmp/disk4"), - ]) + for (idx, disk) in enumerate(result): + (file_driver, file_storage_dir) = disk.logical_id + dir_fmt = "^/tmp/.*\.%s\.disk%d$" % (disk_template, idx + 2) + self.assertEqual(file_driver, constants.FD_BLKTAP) + # FIXME: use assertIsNotNone when py 2.7 is minimum supported version + self.assertNotEqual(re.match(dir_fmt, file_storage_dir), None) def testBlock(self): disk_info = [{ -- 1.8.5.3
signature.asc
Description: Digital signature
