diff --git a/lib/cmdlib.py b/lib/cmdlib.py index c63ecf0aeea9f719e9424cfa7bd44c101887be5f..5af426c9738cbd489f5badef4ed1fe8014f61fb6 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -5733,7 +5733,7 @@ def _RemoveInstance(lu, feedback_fn, instance, ignore_failures): """ logging.info("Removing block devices for instance %s", instance.name) - if not _RemoveDisks(lu, instance): + if not _RemoveDisks(lu, instance, ignore_failures=ignore_failures): if not ignore_failures: raise errors.OpExecError("Can't remove instance's disks") feedback_fn("Warning: can't remove instance's disks") @@ -6862,7 +6862,7 @@ def _CreateDisks(lu, instance, to_skip=None, target_node=None): _CreateBlockDev(lu, node, instance, device, f_create, info, f_create) -def _RemoveDisks(lu, instance, target_node=None): +def _RemoveDisks(lu, instance, target_node=None, ignore_failures=False): """Remove all disks for an instance. This abstracts away some work from `AddInstance()` and @@ -6883,6 +6883,7 @@ def _RemoveDisks(lu, instance, target_node=None): logging.info("Removing block devices for instance %s", instance.name) all_result = True + ports_to_release = set() for device in instance.disks: if target_node: edata = [(target_node, device)] @@ -6898,8 +6899,11 @@ def _RemoveDisks(lu, instance, target_node=None): # if this is a DRBD disk, return its port to the pool if device.dev_type in constants.LDS_DRBD: - tcp_port = device.logical_id[2] - lu.cfg.AddTcpUdpPort(tcp_port) + ports_to_release.add(device.logical_id[2]) + + if all_result or ignore_failures: + for port in ports_to_release: + lu.cfg.AddTcpUdpPort(port) if instance.disk_template == constants.DT_FILE: file_storage_dir = os.path.dirname(instance.disks[0].logical_id[1])