Merge "Fix online upgrades for Bios/Traits"

This commit is contained in:
Zuul 2023-03-07 20:57:15 +00:00 committed by Gerrit Code Review
commit 8f6a0ce06e
3 changed files with 62 additions and 12 deletions

View File

@ -1834,6 +1834,9 @@ class Connection(api.Connection):
max_to_migrate = max_count or total_to_migrate
for model in sql_models:
use_node_id = False
if (not hasattr(model, 'id') and hasattr(model, 'node_id')):
use_node_id = True
version = mapping[model.__name__][0]
num_migrated = 0
with _session_for_write() as session:
@ -1847,13 +1850,27 @@ class Connection(api.Connection):
# max_to_migrate objects.
ids = []
for obj in query.slice(0, max_to_migrate):
ids.append(obj['id'])
num_migrated = (
session.query(model).
filter(sql.and_(model.id.in_(ids),
model.version != version)).
update({model.version: version},
synchronize_session=False))
if not use_node_id:
ids.append(obj['id'])
else:
# BIOSSettings, NodeTrait, NodeTag do not have id
# columns, fallback to node_id as they both have
# it.
ids.append(obj['node_id'])
if not use_node_id:
num_migrated = (
session.query(model).
filter(sql.and_(model.id.in_(ids),
model.version != version)).
update({model.version: version},
synchronize_session=False))
else:
num_migrated = (
session.query(model).
filter(sql.and_(model.node_id.in_(ids),
model.version != version)).
update({model.version: version},
synchronize_session=False))
else:
num_migrated = (
session.query(model).

View File

@ -226,6 +226,11 @@ class UpdateToLatestVersionsTestCase(base.DbTestCase):
for i in range(0, num_nodes):
node = utils.create_test_node(version=version,
uuid=uuidutils.generate_uuid())
# Create entries on the tables so we force field upgrades
utils.create_test_node_trait(node_id=node.id, trait='foo',
version='0.0')
utils.create_test_bios_setting(node_id=node.id, version='1.0')
nodes.append(node.uuid)
for uuid in nodes:
node = self.dbapi.get_node_by_uuid(uuid)
@ -238,10 +243,15 @@ class UpdateToLatestVersionsTestCase(base.DbTestCase):
return
nodes = self._create_nodes(5)
# Check/migrate 2, 10 remain.
self.assertEqual(
(5, 2), self.dbapi.update_to_latest_versions(self.context, 2))
(10, 2), self.dbapi.update_to_latest_versions(self.context, 2))
# Check/migrate 10, 8 migrated, 8 remain.
self.assertEqual(
(3, 3), self.dbapi.update_to_latest_versions(self.context, 10))
(8, 8), self.dbapi.update_to_latest_versions(self.context, 10))
# Just make sure it is still 0, 0 in case more things are added.
self.assertEqual(
(0, 0), self.dbapi.update_to_latest_versions(self.context, 10))
for uuid in nodes:
node = self.dbapi.get_node_by_uuid(uuid)
self.assertEqual(self.node_ver, node.version)
@ -250,10 +260,19 @@ class UpdateToLatestVersionsTestCase(base.DbTestCase):
if self.node_version_same:
# can't test if we don't have diff versions of the node
return
nodes = self._create_nodes(5)
vm_count = 5
nodes = self._create_nodes(vm_count)
# NOTE(TheJulia): Under current testing, 5 node will result in 10
# records implicitly needing to be migrated.
migrate_count = vm_count * 2
self.assertEqual(
(5, 5), self.dbapi.update_to_latest_versions(self.context, 5))
(migrate_count, migrate_count),
self.dbapi.update_to_latest_versions(self.context,
migrate_count))
self.assertEqual(
(0, 0), self.dbapi.update_to_latest_versions(self.context,
migrate_count))
for uuid in nodes:
node = self.dbapi.get_node_by_uuid(uuid)
self.assertEqual(self.node_ver, node.version)

View File

@ -0,0 +1,14 @@
---
fixes:
- |
Fixes an issue in the online upgrade logic where database models for
Node Traits and BIOS Settings resulted in an error when performing
the online data migration. This was because these tables were originally
created as extensions of the Nodes database table, and the schema
of the database was slightly different enough to result in an error
if there was data to migrate in these tables upon upgrade,
which would have occured if an early BIOS Setting adopter had
data in the database prior to upgrading to the Yoga release of Ironic.
The online upgrade parameter now subsitutes an alternate primary key name
name when applicable.