Resolve compatibility with oslo.db future (redux)

Build on change I957d2a9d7c875120bed0022ce1e953b2ec9f97cd by addressing
additional issues introduced by future breaking changes in oslo.db. As
with this change, the changes stem from the table returned from
'oslo_db.utils.get_table' being no longer bound to a 'Connection' or
'Engine'.

Change-Id: Ic28bef6ad4e47a86e423a10e8479b60134cbb0a5
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
Related-Bug: #1939716
This commit is contained in:
Stephen Finucane 2021-08-16 11:44:30 +01:00
parent ffe9f1456b
commit 9e002a77f2
4 changed files with 97 additions and 64 deletions

View File

@ -41,7 +41,8 @@ class TestOcataContract01Mixin(test_migrations.AlembicMigrationsMixin):
min_disk=0, min_disk=0,
min_ram=0, min_ram=0,
id='public_id_before_expand') id='public_id_before_expand')
images.insert().values(public_temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(public_temp))
# inserting a private image record # inserting a private image record
shared_temp = dict(deleted=False, shared_temp = dict(deleted=False,
@ -51,7 +52,8 @@ class TestOcataContract01Mixin(test_migrations.AlembicMigrationsMixin):
min_disk=0, min_disk=0,
min_ram=0, min_ram=0,
id='private_id_before_expand') id='private_id_before_expand')
images.insert().values(shared_temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(shared_temp))
data_migrations.migrate(engine=engine, release='ocata') data_migrations.migrate(engine=engine, release='ocata')

View File

@ -39,7 +39,8 @@ class TestOcataExpand01Mixin(test_migrations.AlembicMigrationsMixin):
min_disk=0, min_disk=0,
min_ram=0, min_ram=0,
id='public_id_before_expand') id='public_id_before_expand')
images.insert().values(public_temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(public_temp))
# inserting a private image record # inserting a private image record
shared_temp = dict(deleted=False, shared_temp = dict(deleted=False,
@ -49,7 +50,8 @@ class TestOcataExpand01Mixin(test_migrations.AlembicMigrationsMixin):
min_disk=0, min_disk=0,
min_ram=0, min_ram=0,
id='private_id_before_expand') id='private_id_before_expand')
images.insert().values(shared_temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(shared_temp))
def _check_ocata_expand01(self, engine, data): def _check_ocata_expand01(self, engine, data):
# check that after migration, 'visibility' column is introduced # check that after migration, 'visibility' column is introduced
@ -60,11 +62,12 @@ class TestOcataExpand01Mixin(test_migrations.AlembicMigrationsMixin):
self.assertTrue(images.c.visibility.nullable) self.assertTrue(images.c.visibility.nullable)
# tests visibility set to None for existing images # tests visibility set to None for existing images
rows = (images.select() with engine.connect() as conn:
.where(images.c.id.like('%_before_expand')) rows = conn.execute(
.order_by(images.c.id) images.select().where(
.execute() images.c.id.like('%_before_expand')
.fetchall()) ).order_by(images.c.id)
).fetchall()
self.assertEqual(2, len(rows)) self.assertEqual(2, len(rows))
# private image first # private image first
@ -76,11 +79,12 @@ class TestOcataExpand01Mixin(test_migrations.AlembicMigrationsMixin):
self.assertEqual('public_id_before_expand', rows[1]['id']) self.assertEqual('public_id_before_expand', rows[1]['id'])
self.assertIsNone(rows[1]['visibility']) self.assertIsNone(rows[1]['visibility'])
self._test_trigger_old_to_new(images) self._test_trigger_old_to_new(engine, images)
self._test_trigger_new_to_old(images) self._test_trigger_new_to_old(engine, images)
def _test_trigger_new_to_old(self, images): def _test_trigger_new_to_old(self, engine, images):
now = datetime.datetime.now() now = datetime.datetime.now()
# inserting a public image record after expand # inserting a public image record after expand
public_temp = dict(deleted=False, public_temp = dict(deleted=False,
created_at=now, created_at=now,
@ -89,7 +93,8 @@ class TestOcataExpand01Mixin(test_migrations.AlembicMigrationsMixin):
min_disk=0, min_disk=0,
min_ram=0, min_ram=0,
id='public_id_new_to_old') id='public_id_new_to_old')
images.insert().values(public_temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(public_temp))
# inserting a private image record after expand # inserting a private image record after expand
shared_temp = dict(deleted=False, shared_temp = dict(deleted=False,
@ -99,7 +104,8 @@ class TestOcataExpand01Mixin(test_migrations.AlembicMigrationsMixin):
min_disk=0, min_disk=0,
min_ram=0, min_ram=0,
id='private_id_new_to_old') id='private_id_new_to_old')
images.insert().values(shared_temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(shared_temp))
# inserting a shared image record after expand # inserting a shared image record after expand
shared_temp = dict(deleted=False, shared_temp = dict(deleted=False,
@ -109,14 +115,16 @@ class TestOcataExpand01Mixin(test_migrations.AlembicMigrationsMixin):
min_disk=0, min_disk=0,
min_ram=0, min_ram=0,
id='shared_id_new_to_old') id='shared_id_new_to_old')
images.insert().values(shared_temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(shared_temp))
# test visibility is set appropriately by the trigger for new images # test visibility is set appropriately by the trigger for new images
rows = (images.select() with engine.connect() as conn:
.where(images.c.id.like('%_new_to_old')) rows = conn.execute(
.order_by(images.c.id) images.select().where(
.execute() images.c.id.like('%_new_to_old')
.fetchall()) ).order_by(images.c.id)
).fetchall()
self.assertEqual(3, len(rows)) self.assertEqual(3, len(rows))
# private image first # private image first
@ -132,8 +140,9 @@ class TestOcataExpand01Mixin(test_migrations.AlembicMigrationsMixin):
self.assertEqual('shared_id_new_to_old', rows[2]['id']) self.assertEqual('shared_id_new_to_old', rows[2]['id'])
self.assertEqual('shared', rows[2]['visibility']) self.assertEqual('shared', rows[2]['visibility'])
def _test_trigger_old_to_new(self, images): def _test_trigger_old_to_new(self, engine, images):
now = datetime.datetime.now() now = datetime.datetime.now()
# inserting a public image record after expand # inserting a public image record after expand
public_temp = dict(deleted=False, public_temp = dict(deleted=False,
created_at=now, created_at=now,
@ -142,7 +151,9 @@ class TestOcataExpand01Mixin(test_migrations.AlembicMigrationsMixin):
min_disk=0, min_disk=0,
min_ram=0, min_ram=0,
id='public_id_old_to_new') id='public_id_old_to_new')
images.insert().values(public_temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(public_temp))
# inserting a private image record after expand # inserting a private image record after expand
shared_temp = dict(deleted=False, shared_temp = dict(deleted=False,
created_at=now, created_at=now,
@ -151,13 +162,17 @@ class TestOcataExpand01Mixin(test_migrations.AlembicMigrationsMixin):
min_disk=0, min_disk=0,
min_ram=0, min_ram=0,
id='private_id_old_to_new') id='private_id_old_to_new')
images.insert().values(shared_temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(shared_temp))
# tests visibility is set appropriately by the trigger for new images # tests visibility is set appropriately by the trigger for new images
rows = (images.select() with engine.connect() as conn:
.where(images.c.id.like('%_old_to_new')) rows = conn.execute(
.order_by(images.c.id) images.select().where(
.execute() images.c.id.like('%_old_to_new')
.fetchall()) ).order_by(images.c.id)
).fetchall()
self.assertEqual(2, len(rows)) self.assertEqual(2, len(rows))
# private image first # private image first
self.assertEqual(0, rows[0]['is_public']) self.assertEqual(0, rows[0]['is_public'])

View File

@ -38,7 +38,8 @@ class TestOcataMigrate01Mixin(test_migrations.AlembicMigrationsMixin):
min_disk=0, min_disk=0,
min_ram=0, min_ram=0,
id='public_id') id='public_id')
images.insert().values(public_temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(public_temp))
# inserting a non-public image record for 'shared' visibility test # inserting a non-public image record for 'shared' visibility test
shared_temp = dict(deleted=False, shared_temp = dict(deleted=False,
@ -48,7 +49,8 @@ class TestOcataMigrate01Mixin(test_migrations.AlembicMigrationsMixin):
min_disk=0, min_disk=0,
min_ram=0, min_ram=0,
id='shared_id') id='shared_id')
images.insert().values(shared_temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(shared_temp))
# inserting a non-public image records for 'private' visibility test # inserting a non-public image records for 'private' visibility test
private_temp = dict(deleted=False, private_temp = dict(deleted=False,
@ -58,7 +60,8 @@ class TestOcataMigrate01Mixin(test_migrations.AlembicMigrationsMixin):
min_disk=0, min_disk=0,
min_ram=0, min_ram=0,
id='private_id_1') id='private_id_1')
images.insert().values(private_temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(private_temp))
private_temp = dict(deleted=False, private_temp = dict(deleted=False,
created_at=now, created_at=now,
@ -67,7 +70,8 @@ class TestOcataMigrate01Mixin(test_migrations.AlembicMigrationsMixin):
min_disk=0, min_disk=0,
min_ram=0, min_ram=0,
id='private_id_2') id='private_id_2')
images.insert().values(private_temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(private_temp))
# adding an active as well as a deleted image member for checking # adding an active as well as a deleted image member for checking
# 'shared' visibility # 'shared' visibility
@ -77,7 +81,8 @@ class TestOcataMigrate01Mixin(test_migrations.AlembicMigrationsMixin):
member='fake_member_452', member='fake_member_452',
can_share=True, can_share=True,
id=45) id=45)
image_members.insert().values(temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(image_members.insert().values(temp))
temp = dict(deleted=True, temp = dict(deleted=True,
created_at=now, created_at=now,
@ -85,7 +90,8 @@ class TestOcataMigrate01Mixin(test_migrations.AlembicMigrationsMixin):
member='fake_member_453', member='fake_member_453',
can_share=True, can_share=True,
id=453) id=453)
image_members.insert().values(temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(image_members.insert().values(temp))
# adding an image member, but marking it deleted, # adding an image member, but marking it deleted,
# for testing 'private' visibility # for testing 'private' visibility
@ -95,7 +101,8 @@ class TestOcataMigrate01Mixin(test_migrations.AlembicMigrationsMixin):
member='fake_member_451', member='fake_member_451',
can_share=True, can_share=True,
id=451) id=451)
image_members.insert().values(temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(image_members.insert().values(temp))
# adding an active image member for the 'public' image, # adding an active image member for the 'public' image,
# to test it remains public regardless. # to test it remains public regardless.
@ -105,16 +112,18 @@ class TestOcataMigrate01Mixin(test_migrations.AlembicMigrationsMixin):
member='fake_member_450', member='fake_member_450',
can_share=True, can_share=True,
id=450) id=450)
image_members.insert().values(temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(image_members.insert().values(temp))
def _check_ocata_expand01(self, engine, data): def _check_ocata_expand01(self, engine, data):
images = db_utils.get_table(engine, 'images') images = db_utils.get_table(engine, 'images')
# check that visibility is null for existing images # check that visibility is null for existing images
rows = (images.select() with engine.connect() as conn:
.order_by(images.c.id) rows = conn.execute(
.execute() images.select().order_by(images.c.id)
.fetchall()) ).fetchall()
self.assertEqual(4, len(rows)) self.assertEqual(4, len(rows))
for row in rows: for row in rows:
self.assertIsNone(row['visibility']) self.assertIsNone(row['visibility'])
@ -123,10 +132,10 @@ class TestOcataMigrate01Mixin(test_migrations.AlembicMigrationsMixin):
data_migrations.migrate(engine) data_migrations.migrate(engine)
# check that visibility is set appropriately for all images # check that visibility is set appropriately for all images
rows = (images.select() with engine.connect() as conn:
.order_by(images.c.id) rows = conn.execute(
.execute() images.select().order_by(images.c.id)
.fetchall()) ).fetchall()
self.assertEqual(4, len(rows)) self.assertEqual(4, len(rows))
# private_id_1 has private visibility # private_id_1 has private visibility
self.assertEqual('private_id_1', rows[0]['id']) self.assertEqual('private_id_1', rows[0]['id'])
@ -167,10 +176,10 @@ class TestOcataMigrate01_EmptyDBMixin(test_migrations.AlembicMigrationsMixin):
images = db_utils.get_table(engine, 'images') images = db_utils.get_table(engine, 'images')
# check that there are no rows in the images table # check that there are no rows in the images table
rows = (images.select() with engine.connect() as conn:
.order_by(images.c.id) rows = conn.execute(
.execute() images.select().order_by(images.c.id)
.fetchall()) ).fetchall()
self.assertEqual(0, len(rows)) self.assertEqual(0, len(rows))
# run data migrations # run data migrations

View File

@ -40,7 +40,8 @@ class TestTrainMigrate01Mixin(test_migrations.AlembicMigrationsMixin):
min_ram=0, min_ram=0,
visibility='public', visibility='public',
id='image_1') id='image_1')
images.insert().values(image_1).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(image_1))
image_2 = dict(deleted=False, image_2 = dict(deleted=False,
created_at=now, created_at=now,
@ -49,7 +50,8 @@ class TestTrainMigrate01Mixin(test_migrations.AlembicMigrationsMixin):
min_ram=0, min_ram=0,
visibility='public', visibility='public',
id='image_2') id='image_2')
images.insert().values(image_2).execute() with engine.connect() as conn, conn.begin():
conn.execute(images.insert().values(image_2))
# adding records to image_locations tables # adding records to image_locations tables
temp = dict(deleted=False, temp = dict(deleted=False,
@ -58,7 +60,8 @@ class TestTrainMigrate01Mixin(test_migrations.AlembicMigrationsMixin):
value='image_location_1', value='image_location_1',
meta_data='{"backend": "fast"}', meta_data='{"backend": "fast"}',
id=1) id=1)
image_locations.insert().values(temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(image_locations.insert().values(temp))
temp = dict(deleted=False, temp = dict(deleted=False,
created_at=now, created_at=now,
@ -66,16 +69,18 @@ class TestTrainMigrate01Mixin(test_migrations.AlembicMigrationsMixin):
value='image_location_2', value='image_location_2',
meta_data='{"backend": "cheap"}', meta_data='{"backend": "cheap"}',
id=2) id=2)
image_locations.insert().values(temp).execute() with engine.connect() as conn, conn.begin():
conn.execute(image_locations.insert().values(temp))
def _check_train_expand01(self, engine, data): def _check_train_expand01(self, engine, data):
image_locations = db_utils.get_table(engine, 'image_locations') image_locations = db_utils.get_table(engine, 'image_locations')
# check that meta_data has 'backend' key for existing image_locations # check that meta_data has 'backend' key for existing image_locations
rows = (image_locations.select() with engine.connect() as conn:
.order_by(image_locations.c.id) rows = conn.execute(
.execute() image_locations.select().order_by(image_locations.c.id)
.fetchall()) ).fetchall()
self.assertEqual(2, len(rows)) self.assertEqual(2, len(rows))
for row in rows: for row in rows:
self.assertIn('"backend":', row['meta_data']) self.assertIn('"backend":', row['meta_data'])
@ -84,10 +89,11 @@ class TestTrainMigrate01Mixin(test_migrations.AlembicMigrationsMixin):
data_migrations.migrate(engine, release='train') data_migrations.migrate(engine, release='train')
# check that meta_data has 'backend' key replaced with 'store' # check that meta_data has 'backend' key replaced with 'store'
rows = (image_locations.select() with engine.connect() as conn:
.order_by(image_locations.c.id) rows = conn.execute(
.execute() image_locations.select().order_by(image_locations.c.id)
.fetchall()) ).fetchall()
self.assertEqual(2, len(rows)) self.assertEqual(2, len(rows))
for row in rows: for row in rows:
self.assertNotIn('"backend":', row['meta_data']) self.assertNotIn('"backend":', row['meta_data'])
@ -120,10 +126,11 @@ class TestTrainMigrate01_EmptyDBMixin(test_migrations.AlembicMigrationsMixin):
images = db_utils.get_table(engine, 'images') images = db_utils.get_table(engine, 'images')
# check that there are no rows in the images table # check that there are no rows in the images table
rows = (images.select() with engine.connect() as conn:
.order_by(images.c.id) rows = conn.execute(
.execute() images.select().order_by(images.c.id)
.fetchall()) ).fetchall()
self.assertEqual(0, len(rows)) self.assertEqual(0, len(rows))
# run data migrations # run data migrations