X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/4b98ac2932e6a530a02f499dc18eaf3cd471cf54..2ee88aeb76a2430ec0c7f86629bf66cfd0b6f564:/lib/config.py diff --git a/lib/config.py b/lib/config.py index dbb0083..7ebcf92 100644 --- a/lib/config.py +++ b/lib/config.py @@ -79,6 +79,7 @@ class ConfigWriter: self._cfg_file = cfg_file self._temporary_ids = set() self._temporary_drbds = {} + self._temporary_macs = set() # Note: in order to prevent errors when resolving our name in # _DistributeConfig, we compute it here once and reuse it; it's # better to raise an error before starting to modify the config @@ -110,11 +111,12 @@ class ConfigWriter: byte2 = random.randrange(0, 256) byte3 = random.randrange(0, 256) mac = "%s:%02x:%02x:%02x" % (prefix, byte1, byte2, byte3) - if mac not in all_macs: + if mac not in all_macs and mac not in self._temporary_macs: break retries -= 1 else: raise errors.ConfigurationError("Can't generate unique MAC") + self._temporary_macs.add(mac) return mac @locking.ssynchronized(_config_lock, shared=1) @@ -126,7 +128,7 @@ class ConfigWriter: """ all_macs = self._AllMACs() - return mac in all_macs + return mac in all_macs or mac in self._temporary_macs @locking.ssynchronized(_config_lock, shared=1) def GenerateDRBDSecret(self): @@ -241,14 +243,16 @@ class ConfigWriter: """ 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.logical_id is not None: + 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 is not None: + 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: @@ -683,10 +687,18 @@ class ConfigWriter: all_lvs = instance.MapLVsByNode() logging.info("Instance '%s' DISK_LAYOUT: %s", instance.name, all_lvs) + all_macs = self._AllMACs() + for nic in instance.nics: + if nic.mac in all_macs: + raise errors.ConfigurationError("Cannot add instance %s:" + " MAC address '%s' already in use." % (instance.name, nic.mac)) + instance.serial_no = 1 self._config_data.instances[instance.name] = instance self._config_data.cluster.serial_no += 1 self._UnlockedReleaseDRBDMinors(instance.name) + for nic in instance.nics: + self._temporary_macs.discard(nic.mac) self._WriteConfig() def _SetInstanceStatus(self, instance_name, status): @@ -815,7 +827,7 @@ class ConfigWriter: """Get the configuration of all instances. @rtype: dict - @returns: dict of (instance, instance_info), where instance_info is what + @return: dict of (instance, instance_info), where instance_info is what would GetInstanceInfo return for the node """ @@ -1054,10 +1066,12 @@ class ConfigWriter: result = rpc.RpcRunner.call_upload_file(node_list, self._cfg_file, address_list=addr_list) - for node in node_list: - if not result[node]: - logging.error("copy of file %s to node %s failed", - self._cfg_file, node) + for to_node, to_result in result.items(): + msg = to_result.RemoteFailMsg() + if msg: + msg = ("Copy of file %s to node %s failed: %s" % + (self._cfg_file, to_node, msg)) + logging.error(msg) bad = True return not bad @@ -1116,8 +1130,10 @@ class ConfigWriter: node_data = fn(node_names) cluster = self._config_data.cluster + cluster_tags = fn(cluster.GetTags()) return { constants.SS_CLUSTER_NAME: cluster.cluster_name, + constants.SS_CLUSTER_TAGS: cluster_tags, constants.SS_FILE_STORAGE_DIR: cluster.file_storage_dir, constants.SS_MASTER_CANDIDATES: mc_data, constants.SS_MASTER_IP: cluster.master_ip, @@ -1236,5 +1252,7 @@ class ConfigWriter: if isinstance(target, objects.Instance): self._UnlockedReleaseDRBDMinors(target.name) + for nic in target.nics: + self._temporary_macs.discard(nic.mac) self._WriteConfig()