diff --git a/lib/config.py b/lib/config.py index 8c5fda9cb046b7e11e3bf16c60be19f003259ac3..97b3939ee23f36447f22a9f0753065e3c5303ea4 100644 --- a/lib/config.py +++ b/lib/config.py @@ -133,6 +133,26 @@ def _MatchNameComponentIgnoreCase(short_name, names): return utils.MatchNameComponent(short_name, names, case_sensitive=False) +def _CheckInstanceDiskIvNames(disks): + """Checks if instance's disks' C{iv_name} attributes are in order. + + @type disks: list of L{objects.Disk} + @param disks: List of disks + @rtype: list of tuples; (int, string, string) + @return: List of wrongly named disks, each tuple contains disk index, + expected and actual name + + """ + result = [] + + for (idx, disk) in enumerate(disks): + exp_iv_name = "disk/%s" % idx + if disk.iv_name != exp_iv_name: + result.append((idx, exp_iv_name, disk.iv_name)) + + return result + + class ConfigWriter: """The interface to the cluster configuration. @@ -510,6 +530,15 @@ class ConfigWriter: (instance.name, idx, msg) for msg in disk.Verify()]) result.extend(self._CheckDiskIDs(disk, seen_lids, seen_pids)) + wrong_names = _CheckInstanceDiskIvNames(instance.disks) + if wrong_names: + tmp = "; ".join(("name of disk %s should be '%s', but is '%s'" % + (idx, exp_name, actual_name)) + for (idx, exp_name, actual_name) in wrong_names) + + result.append("Instance '%s' has wrongly named disks: %s" % + (instance.name, tmp)) + # cluster-wide pool of free ports for free_port in cluster.tcpudp_port_pool: if free_port not in ports: diff --git a/test/ganeti.config_unittest.py b/test/ganeti.config_unittest.py index e82872c6b0e1ff40fc5302924d65970dd8e83b7b..9a3e27bcc3a4d9b13cf0906f729c7b9d65acd643 100755 --- a/test/ganeti.config_unittest.py +++ b/test/ganeti.config_unittest.py @@ -39,6 +39,7 @@ from ganeti import objects from ganeti import utils from ganeti import netutils from ganeti import compat +from ganeti import cmdlib from ganeti.config import TemporaryReservationManager @@ -382,5 +383,28 @@ class TestTRM(unittest.TestCase): self.assertFalse(t.Reserved("a")) +class TestCheckInstanceDiskIvNames(unittest.TestCase): + @staticmethod + def _MakeDisks(names): + return [objects.Disk(iv_name=name) for name in names] + + def testNoError(self): + disks = self._MakeDisks(["disk/0", "disk/1"]) + self.assertEqual(config._CheckInstanceDiskIvNames(disks), []) + cmdlib._UpdateIvNames(0, disks) + self.assertEqual(config._CheckInstanceDiskIvNames(disks), []) + + def testWrongNames(self): + disks = self._MakeDisks(["disk/1", "disk/3", "disk/2"]) + self.assertEqual(config._CheckInstanceDiskIvNames(disks), [ + (0, "disk/0", "disk/1"), + (1, "disk/1", "disk/3"), + ]) + + # Fix names + cmdlib._UpdateIvNames(0, disks) + self.assertEqual(config._CheckInstanceDiskIvNames(disks), []) + + if __name__ == '__main__': testutils.GanetiTestProgram()