Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 19 additions & 8 deletions nova/virt/vmwareapi/vmops.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"""
Expand Down Expand Up @@ -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:
Expand All @@ -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.
Expand Down Expand Up @@ -4672,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",
Expand Down