Add python-glanceclient dependency, tox version constraint, and

workaround for Nova scheduler_hints bug

This patch adds python-glanceclient as a direct dependency. Previously
it was installed indirectly via heat-translator, but starting from
heat-translator 3.4.0 it was removed from its requirements. This
caused Tacker CI failures with "ModuleNotFoundError: glanceclient".

This patch also adds a version constraint for tox to avoid versions
>= 4.48.0, which cause CI failures during the pre-devstack task with
"AttributeError: 'Parsed' object has no attribute 'config_format'".

Additionally, this patch adds a temporary workaround for a Nova bug in
microversion 2.100 where scheduler_hints.group is returned as a list
in GET server responses, but Nova expects it to be a string during
rebuild. This mismatch causes Heat stack updates to fail.

The workaround removes scheduler_hints from nested VDU templates
during change_vnfpkg rolling update operations and disables VDU
IDs validation.

Workaround Impact:

1) Allows change_vnfpkg rolling updates to complete successfully.
2) Heat may replace servers instead of updating them in place.
3) VDU IDs may change after the change_vnfpkg operation.

This workaround should be removed after the Nova bug is fixed.
Related Nova bug: https://bugs.launchpad.net/nova/+bug/2139275

Closes-Bug: https://bugs.launchpad.net/tacker/+bug/2143398
Closes-Bug: https://bugs.launchpad.net/tacker/+bug/2143583
Closes-Bug: https://bugs.launchpad.net/tacker/+bug/2139268
Change-Id: I7e7122ededb9694c57fd37b0d8109efb9fefac08
Signed-off-by: Shivam Shukla <shivam.shukla3@india.nec.com>
This commit is contained in:
Shivam Shukla
2026-02-01 18:23:33 +00:00
parent 559eb974ee
commit 98a82a5c99
4 changed files with 55 additions and 4 deletions
+1
View File
@@ -37,6 +37,7 @@ oslo.versionedobjects>=1.33.3 # Apache-2.0
openstacksdk>=0.44.0 # Apache-2.0
python-barbicanclient>=4.5.2 # Apache-2.0
python-heatclient>=1.10.0 # Apache-2.0
python-glanceclient>=4.8.0 # Apache-2.0
python-keystoneclient>=3.8.0 # Apache-2.0
python-neutronclient>=6.7.0 # Apache-2.0
python-novaclient>=9.1.0 # Apache-2.0
@@ -554,6 +554,47 @@ class Openstack(object):
base_files = heat_client.get_files(stack_name)
base_files.update(fields['files'])
# TODO(shivam): Remove this workaround once Nova microversion
# 2.100 bug is fixed. This temporarily removes scheduler_hints
# from nested templates during rolling updates to avoid Nova's
# scheduler_hints.group type mismatch error (list vs string).
# The Nova bug causes scheduler_hints.group to be returned as a list
# in GET server responses but expected as a string in rebuild requests.
# Related Nova bug: https://bugs.launchpad.net/nova/+bug/2139275
for file_name, file_content in base_files.items():
if file_name.endswith(('.yaml', '.yml')):
try:
nested_template = yaml.safe_load(file_content)
modified = False
if 'resources' in nested_template:
for res_name, res_value in (
nested_template['resources'].items()):
if (
res_value.get('type') == 'OS::Nova::Server'
and 'properties' in res_value
and 'scheduler_hints'
in res_value['properties']
):
del res_value['properties']['scheduler_hints']
modified = True
LOG.info(
"Removed scheduler_hints from %s:%s "
"to workaround Nova microversion "
"2.100 bug",
file_name,
res_name
)
if modified:
base_files[file_name] = yaml.dump(nested_template)
except Exception as e:
LOG.warning(
"Could not process %s to remove scheduler_hints: %s",
file_name,
e
)
base_parameters = heat_client.get_parameters(stack_name)
# NOTE: Using json.loads because parameters['nfv'] is string
base_nfv_dict = json.loads(base_parameters.get('nfv', '{}'))
@@ -392,11 +392,19 @@ class IndividualVnfcMgmtBasicMinTest(base_v2.BaseSolV2Test):
'CHANGE_VNFPKG', expected_inst_attrs, inst_id)
# check vnfdId
self.assertEqual(self.upd_new_min_vnfd_id, inst_17['vnfdId'])
# TODO(shivam): Temporarily skip VNFC IDs check after change_vnfpkg
# due to Nova microversion 2.100 workaround. The workaround removes
# scheduler_hints from templates, which may cause Heat to replace
# servers instead of updating them in-place, resulting in new VDU IDs.
# Once the Nova bug is fixed and the workaround is removed, this
# assertion should be restored to check for VNFC ID equality.
# check ids of VDU are not changed
self.assertEqual(self._get_vnfc_id(inst_15, 'VDU1', 0),
self._get_vnfc_id(inst_17, 'VDU1', 0))
self.assertEqual(self._get_vnfc_id(inst_15, 'VDU2', 0),
self._get_vnfc_id(inst_17, 'VDU2', 0))
# self.assertEqual(self._get_vnfc_id(inst_15, 'VDU1', 0),
# self._get_vnfc_id(inst_17, 'VDU1', 0))
# self.assertEqual(self._get_vnfc_id(inst_15, 'VDU2', 0),
# self._get_vnfc_id(inst_17, 'VDU2', 0))
# check image of VDU1 is changed
self.assertNotEqual(self._get_vnfc_image(inst_15, 'VDU1', 0),
self._get_vnfc_image(inst_17, 'VDU1', 0))
+1
View File
@@ -1,6 +1,7 @@
[tox]
envlist = py310,py39,py38,py36,pep8,docs
minversion = 4.11.0
requires = tox<4.48.0
ignore_basepython_conflict = True
[testenv]