From 7c3c80fe373b3b0e20185f7eae1aa460e85088be Mon Sep 17 00:00:00 2001 From: Sebastian Krott Date: Thu, 28 Aug 2025 15:14:14 +0200 Subject: [PATCH 1/2] vmwareapi: Add `_get_external_customer_hostgroups` Add a new function `_get_external_customer_hostgroups` to standardize the handling of external customer hostgroups. Adjust `_get_instances_by_external_customer_vm_group` to make use of the additional filtering from `update_external_customer_placement`. Change-Id: I9038f2cf5ff75106bf0b4088a0966f602430e1a1 --- nova/virt/vmwareapi/vmops.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/nova/virt/vmwareapi/vmops.py b/nova/virt/vmwareapi/vmops.py index bde91a96b3f..b7e9a742769 100644 --- a/nova/virt/vmwareapi/vmops.py +++ b/nova/virt/vmwareapi/vmops.py @@ -1277,6 +1277,13 @@ def update_admin_vm_group_membership(self, instance, remove=False): vm_group_name, vm_ref, remove=remove) + def _get_external_customer_hostgroups(self): + hg_prefixes = tuple(prefix.removesuffix('-') + for prefix in CONF.external_customer_domain_name_prefixes) + hostgroups = [hg_name for hg_name in self._vc_state.hostgroups + if hg_name.startswith(hg_prefixes)] + return hostgroups + def _get_external_customer_vm_group_for_instance(self, instance, hostgroups): """Return the VmGroup name for the specific instance""" @@ -1316,7 +1323,7 @@ def _get_instances_by_external_customer_vm_group(self, context): instances = InstanceList.get_by_filters( context, filters, expected_attrs=['system_metadata']) - hostgroups = self._vc_state.hostgroups + hostgroups = self._get_external_customer_hostgroups() grouped_instances = defaultdict(list) for instance in instances: @@ -1329,10 +1336,7 @@ def _get_instances_by_external_customer_vm_group(self, context): def update_external_customer_placement(self, context, instance, remove=False): """Ensure DRS rules and VmGroup assignment for the instance""" - hg_prefixes = tuple(prefix.removesuffix('-') - for prefix in CONF.external_customer_domain_name_prefixes) - hostgroups = [hg_name for hg_name in self._vc_state.hostgroups - if hg_name.startswith(hg_prefixes)] + hostgroups = self._get_external_customer_hostgroups() if not hostgroups: # This cluster does not manage external customer VMs. From 21186677442762ccc3b75075997435286d83fc6c Mon Sep 17 00:00:00 2001 From: Sebastian Krott Date: Thu, 28 Aug 2025 15:19:58 +0200 Subject: [PATCH 2/2] vmareapi: extend `place_vm` for external customers Extend `place_vm` to consider external customer DRS rules. Change-Id: I1ddcbccc15c656ed2030e6f9aad12fff709f40e8 --- nova/virt/vmwareapi/vmops.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/nova/virt/vmwareapi/vmops.py b/nova/virt/vmwareapi/vmops.py index b7e9a742769..0e7db78ffab 100644 --- a/nova/virt/vmwareapi/vmops.py +++ b/nova/virt/vmwareapi/vmops.py @@ -4676,14 +4676,21 @@ def place_vm(self, context, instance, host_ref=None): config_spec.version = extra_specs.hw_version placement_spec.configSpec = config_spec - vm_group_name = self._get_admin_group_name_for_instance(instance) - if vm_group_name: + # Derive intended VM groups + vm_group_names = [ + self._get_admin_group_name_for_instance(instance), + self._get_external_customer_vm_group_for_instance( + instance, self._get_external_customer_hostgroups()) + ] + vm_group_names = [name for name in vm_group_names if name] + # Set DRS rules for intended VM groups + if vm_group_names: placement_rules = [] placement_spec.rules = placement_rules cluster_rules = cluster_util.fetch_cluster_rules(self._session, self._cluster) for rule in cluster_rules.values(): - if getattr(rule, "vmGroupName", None) == vm_group_name: + if getattr(rule, "vmGroupName", None) in vm_group_names: placement_rules.append(rule) result = self._session._call_method(self._session.vim, "PlaceVm",