diff --git a/lib/config.py b/lib/config.py index a6f3d6905133cf78f4e297fa3de09fe14b860d44..dbb0083878e0eaf9dab4337064665009c8a26c7e 100644 --- a/lib/config.py +++ b/lib/config.py @@ -227,6 +227,34 @@ class ConfigWriter: return result + def _CheckDiskIDs(self, disk, l_ids, p_ids): + """Compute duplicate disk IDs + + @type disk: L{objects.Disk} + @param disk: the disk at which to start searching + @type l_ids: list + @param l_ids: list of current logical ids + @type p_ids: list + @param p_ids: list of current physical ids + @rtype: list + @return: a list of error messages + + """ + result = [] + if disk.logical_id in l_ids: + result.append("duplicate logical id %s" % str(disk.logical_id)) + else: + l_ids.append(disk.logical_id) + if disk.physical_id in p_ids: + result.append("duplicate physical id %s" % str(disk.physical_id)) + else: + p_ids.append(disk.physical_id) + + if disk.children: + for child in disk.children: + result.extend(self._CheckDiskIDs(child, l_ids, p_ids)) + return result + def _UnlockedVerifyConfig(self): """Verify function. @@ -239,6 +267,8 @@ class ConfigWriter: seen_macs = [] ports = {} data = self._config_data + seen_lids = [] + seen_pids = [] for instance_name in data.instances: instance = data.instances[instance_name] if instance.primary_node not in data.nodes: @@ -273,6 +303,7 @@ class ConfigWriter: for idx, disk in enumerate(instance.disks): result.extend(["instance '%s' disk %d error: %s" % (instance.name, idx, msg) for msg in disk.Verify()]) + result.extend(self._CheckDiskIDs(disk, seen_lids, seen_pids)) # cluster-wide pool of free ports for free_port in data.cluster.tcpudp_port_pool: