db: Use the same connection throughout test
This necessitates using a raw connection [1] to enable foreign keys, due SQLAlchemy 2.0 wrapping mostly everything in transactions which in-turn limits our ability to do this easily on a non-global basis. [1] https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.execute Change-Id: Id6d4219ea2be797e4da6c43b3a950983f3fc951f Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
parent
4062e02a22
commit
9927bdc9b3
@ -34,9 +34,15 @@ class PurgeDeletedTest(test.TestCase):
|
|||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(PurgeDeletedTest, self).setUp()
|
super(PurgeDeletedTest, self).setUp()
|
||||||
|
|
||||||
self.context = context.get_admin_context()
|
self.context = context.get_admin_context()
|
||||||
|
|
||||||
|
# enable foreign keys
|
||||||
self.engine = db_api.get_engine()
|
self.engine = db_api.get_engine()
|
||||||
self.conn = self.engine.connect()
|
if self.engine.url.get_dialect() == sqlite.dialect:
|
||||||
|
with self.engine.connect() as conn:
|
||||||
|
conn.connection.execute("PRAGMA foreign_keys = ON")
|
||||||
|
|
||||||
self.volumes = sqlalchemyutils.get_table(
|
self.volumes = sqlalchemyutils.get_table(
|
||||||
self.engine, "volumes")
|
self.engine, "volumes")
|
||||||
# The volume_metadata table has a FK of volume_id
|
# The volume_metadata table has a FK of volume_id
|
||||||
@ -64,46 +70,48 @@ class PurgeDeletedTest(test.TestCase):
|
|||||||
self.uuidstrs = []
|
self.uuidstrs = []
|
||||||
for unused in range(6):
|
for unused in range(6):
|
||||||
self.uuidstrs.append(uuid.uuid4().hex)
|
self.uuidstrs.append(uuid.uuid4().hex)
|
||||||
|
|
||||||
# Add 6 rows to table
|
# Add 6 rows to table
|
||||||
for uuidstr in self.uuidstrs:
|
with db_api.main_context_manager.writer.using(self.context):
|
||||||
ins_stmt = self.volumes.insert().values(id=uuidstr,
|
for uuidstr in self.uuidstrs:
|
||||||
volume_type_id=uuidstr)
|
ins_stmt = self.volumes.insert().values(id=uuidstr,
|
||||||
self.conn.execute(ins_stmt)
|
volume_type_id=uuidstr)
|
||||||
ins_stmt = self.vm.insert().values(volume_id=uuidstr)
|
self.context.session.execute(ins_stmt)
|
||||||
self.conn.execute(ins_stmt)
|
ins_stmt = self.vm.insert().values(volume_id=uuidstr)
|
||||||
ins_stmt = self.vgm.insert().values(
|
self.context.session.execute(ins_stmt)
|
||||||
volume_id=uuidstr, key='image_name', value='test')
|
ins_stmt = self.vgm.insert().values(
|
||||||
self.conn.execute(ins_stmt)
|
volume_id=uuidstr, key='image_name', value='test')
|
||||||
|
self.context.session.execute(ins_stmt)
|
||||||
|
|
||||||
ins_stmt = self.vol_types.insert().values(id=uuidstr)
|
ins_stmt = self.vol_types.insert().values(id=uuidstr)
|
||||||
self.conn.execute(ins_stmt)
|
self.context.session.execute(ins_stmt)
|
||||||
ins_stmt = self.vol_type_proj.insert().\
|
ins_stmt = self.vol_type_proj.insert().\
|
||||||
values(volume_type_id=uuidstr)
|
values(volume_type_id=uuidstr)
|
||||||
self.conn.execute(ins_stmt)
|
self.context.session.execute(ins_stmt)
|
||||||
|
|
||||||
ins_stmt = self.snapshots.insert().values(
|
ins_stmt = self.snapshots.insert().values(
|
||||||
id=uuidstr, volume_id=uuidstr,
|
id=uuidstr, volume_id=uuidstr,
|
||||||
volume_type_id=uuidstr)
|
volume_type_id=uuidstr)
|
||||||
self.conn.execute(ins_stmt)
|
self.context.session.execute(ins_stmt)
|
||||||
ins_stmt = self.sm.insert().values(snapshot_id=uuidstr)
|
ins_stmt = self.sm.insert().values(snapshot_id=uuidstr)
|
||||||
self.conn.execute(ins_stmt)
|
self.context.session.execute(ins_stmt)
|
||||||
|
|
||||||
ins_stmt = self.vgm.insert().values(
|
ins_stmt = self.vgm.insert().values(
|
||||||
snapshot_id=uuidstr, key='image_name', value='test')
|
snapshot_id=uuidstr, key='image_name', value='test')
|
||||||
self.conn.execute(ins_stmt)
|
self.context.session.execute(ins_stmt)
|
||||||
|
|
||||||
ins_stmt = self.qos.insert().values(
|
ins_stmt = self.qos.insert().values(
|
||||||
id=uuidstr, key='QoS_Specs_Name', value='test')
|
id=uuidstr, key='QoS_Specs_Name', value='test')
|
||||||
self.conn.execute(ins_stmt)
|
self.context.session.execute(ins_stmt)
|
||||||
|
|
||||||
ins_stmt = self.vol_types.insert().values(
|
ins_stmt = self.vol_types.insert().values(
|
||||||
id=uuid.uuid4().hex, qos_specs_id=uuidstr)
|
id=uuid.uuid4().hex, qos_specs_id=uuidstr)
|
||||||
self.conn.execute(ins_stmt)
|
self.context.session.execute(ins_stmt)
|
||||||
|
|
||||||
ins_stmt = self.qos.insert().values(
|
ins_stmt = self.qos.insert().values(
|
||||||
id=uuid.uuid4().hex, specs_id=uuidstr, key='desc',
|
id=uuid.uuid4().hex, specs_id=uuidstr, key='desc',
|
||||||
value='test')
|
value='test')
|
||||||
self.conn.execute(ins_stmt)
|
self.context.session.execute(ins_stmt)
|
||||||
|
|
||||||
# Set 5 of them deleted
|
# Set 5 of them deleted
|
||||||
# 2 are 60 days ago, 2 are 20 days ago, one is just now.
|
# 2 are 60 days ago, 2 are 20 days ago, one is just now.
|
||||||
@ -218,50 +226,48 @@ class PurgeDeletedTest(test.TestCase):
|
|||||||
self.vol_types.c.qos_specs_id.in_(self.uuidstrs[4:6])).values(
|
self.vol_types.c.qos_specs_id.in_(self.uuidstrs[4:6])).values(
|
||||||
deleted_at=older, deleted=True)
|
deleted_at=older, deleted=True)
|
||||||
|
|
||||||
self.conn.execute(make_vol_now)
|
with db_api.main_context_manager.writer.using(self.context):
|
||||||
self.conn.execute(make_vol_old)
|
self.context.session.execute(make_vol_now)
|
||||||
self.conn.execute(make_vol_older)
|
self.context.session.execute(make_vol_old)
|
||||||
self.conn.execute(make_vol_meta_now)
|
self.context.session.execute(make_vol_older)
|
||||||
self.conn.execute(make_vol_meta_old)
|
self.context.session.execute(make_vol_meta_now)
|
||||||
self.conn.execute(make_vol_meta_older)
|
self.context.session.execute(make_vol_meta_old)
|
||||||
|
self.context.session.execute(make_vol_meta_older)
|
||||||
|
|
||||||
self.conn.execute(make_vol_types_now)
|
self.context.session.execute(make_vol_types_now)
|
||||||
self.conn.execute(make_vol_types_old)
|
self.context.session.execute(make_vol_types_old)
|
||||||
self.conn.execute(make_vol_types_older)
|
self.context.session.execute(make_vol_types_older)
|
||||||
self.conn.execute(make_vol_type_proj_now)
|
self.context.session.execute(make_vol_type_proj_now)
|
||||||
self.conn.execute(make_vol_type_proj_old)
|
self.context.session.execute(make_vol_type_proj_old)
|
||||||
self.conn.execute(make_vol_type_proj_older)
|
self.context.session.execute(make_vol_type_proj_older)
|
||||||
|
|
||||||
self.conn.execute(make_snap_now)
|
self.context.session.execute(make_snap_now)
|
||||||
self.conn.execute(make_snap_old)
|
self.context.session.execute(make_snap_old)
|
||||||
self.conn.execute(make_snap_older)
|
self.context.session.execute(make_snap_older)
|
||||||
self.conn.execute(make_snap_meta_now)
|
self.context.session.execute(make_snap_meta_now)
|
||||||
self.conn.execute(make_snap_meta_old)
|
self.context.session.execute(make_snap_meta_old)
|
||||||
self.conn.execute(make_snap_meta_older)
|
self.context.session.execute(make_snap_meta_older)
|
||||||
|
|
||||||
self.conn.execute(make_vol_glance_meta_now)
|
self.context.session.execute(make_vol_glance_meta_now)
|
||||||
self.conn.execute(make_vol_glance_meta_old)
|
self.context.session.execute(make_vol_glance_meta_old)
|
||||||
self.conn.execute(make_vol_glance_meta_older)
|
self.context.session.execute(make_vol_glance_meta_older)
|
||||||
self.conn.execute(make_snap_glance_meta_now)
|
self.context.session.execute(make_snap_glance_meta_now)
|
||||||
self.conn.execute(make_snap_glance_meta_old)
|
self.context.session.execute(make_snap_glance_meta_old)
|
||||||
self.conn.execute(make_snap_glance_meta_older)
|
self.context.session.execute(make_snap_glance_meta_older)
|
||||||
|
|
||||||
self.conn.execute(make_qos_now)
|
self.context.session.execute(make_qos_now)
|
||||||
self.conn.execute(make_qos_old)
|
self.context.session.execute(make_qos_old)
|
||||||
self.conn.execute(make_qos_older)
|
self.context.session.execute(make_qos_older)
|
||||||
|
|
||||||
self.conn.execute(make_qos_child_record_now)
|
self.context.session.execute(make_qos_child_record_now)
|
||||||
self.conn.execute(make_qos_child_record_old)
|
self.context.session.execute(make_qos_child_record_old)
|
||||||
self.conn.execute(make_qos_child_record_older)
|
self.context.session.execute(make_qos_child_record_older)
|
||||||
|
|
||||||
self.conn.execute(make_vol_types1_now)
|
self.context.session.execute(make_vol_types1_now)
|
||||||
self.conn.execute(make_vol_types1_old)
|
self.context.session.execute(make_vol_types1_old)
|
||||||
self.conn.execute(make_vol_types1_older)
|
self.context.session.execute(make_vol_types1_older)
|
||||||
|
|
||||||
def test_purge_deleted_rows_in_zero_age_in(self):
|
def test_purge_deleted_rows_in_zero_age_in(self):
|
||||||
dialect = self.engine.url.get_dialect()
|
|
||||||
if dialect == sqlite.dialect:
|
|
||||||
self.conn.exec_driver_sql("PRAGMA foreign_keys = ON")
|
|
||||||
# Purge at age_in_days=0, should delete one more row
|
# Purge at age_in_days=0, should delete one more row
|
||||||
db.purge_deleted_rows(self.context, age_in_days=0)
|
db.purge_deleted_rows(self.context, age_in_days=0)
|
||||||
|
|
||||||
@ -288,9 +294,6 @@ class PurgeDeletedTest(test.TestCase):
|
|||||||
self.assertEqual(2, qos_rows)
|
self.assertEqual(2, qos_rows)
|
||||||
|
|
||||||
def test_purge_deleted_rows_old(self):
|
def test_purge_deleted_rows_old(self):
|
||||||
dialect = self.engine.url.get_dialect()
|
|
||||||
if dialect == sqlite.dialect:
|
|
||||||
self.conn.exec_driver_sql("PRAGMA foreign_keys = ON")
|
|
||||||
# Purge at 30 days old, should only delete 2 rows
|
# Purge at 30 days old, should only delete 2 rows
|
||||||
db.purge_deleted_rows(self.context, age_in_days=30)
|
db.purge_deleted_rows(self.context, age_in_days=30)
|
||||||
|
|
||||||
@ -317,9 +320,6 @@ class PurgeDeletedTest(test.TestCase):
|
|||||||
self.assertEqual(8, qos_rows)
|
self.assertEqual(8, qos_rows)
|
||||||
|
|
||||||
def test_purge_deleted_rows_older(self):
|
def test_purge_deleted_rows_older(self):
|
||||||
dialect = self.engine.url.get_dialect()
|
|
||||||
if dialect == sqlite.dialect:
|
|
||||||
self.conn.exec_driver_sql("PRAGMA foreign_keys = ON")
|
|
||||||
# Purge at 10 days old now, should delete 2 more rows
|
# Purge at 10 days old now, should delete 2 more rows
|
||||||
db.purge_deleted_rows(self.context, age_in_days=10)
|
db.purge_deleted_rows(self.context, age_in_days=10)
|
||||||
|
|
||||||
@ -354,25 +354,24 @@ class PurgeDeletedTest(test.TestCase):
|
|||||||
age_in_days='ten')
|
age_in_days='ten')
|
||||||
|
|
||||||
def test_purge_deleted_rows_integrity_failure(self):
|
def test_purge_deleted_rows_integrity_failure(self):
|
||||||
dialect = self.engine.url.get_dialect()
|
|
||||||
if dialect == sqlite.dialect:
|
|
||||||
self.conn.exec_driver_sql("PRAGMA foreign_keys = ON")
|
|
||||||
|
|
||||||
# add new entry in volume and volume_admin_metadata for
|
# add new entry in volume and volume_admin_metadata for
|
||||||
# integrity check
|
# integrity check
|
||||||
uuid_str = uuid.uuid4().hex
|
uuid_str = uuid.uuid4().hex
|
||||||
ins_stmt = self.volumes.insert().values(id=uuid_str,
|
ins_stmt = self.volumes.insert().values(id=uuid_str,
|
||||||
volume_type_id=uuid_str)
|
volume_type_id=uuid_str)
|
||||||
self.conn.execute(ins_stmt)
|
with db_api.main_context_manager.writer.using(self.context):
|
||||||
|
self.context.session.execute(ins_stmt)
|
||||||
ins_stmt = self.vm.insert().values(volume_id=uuid_str)
|
ins_stmt = self.vm.insert().values(volume_id=uuid_str)
|
||||||
self.conn.execute(ins_stmt)
|
with db_api.main_context_manager.writer.using(self.context):
|
||||||
|
self.context.session.execute(ins_stmt)
|
||||||
|
|
||||||
# set volume record to deleted 20 days ago
|
# set volume record to deleted 20 days ago
|
||||||
old = timeutils.utcnow() - datetime.timedelta(days=20)
|
old = timeutils.utcnow() - datetime.timedelta(days=20)
|
||||||
make_old = self.volumes.update().where(
|
make_old = self.volumes.update().where(
|
||||||
self.volumes.c.id.in_([uuid_str])).values(deleted_at=old,
|
self.volumes.c.id.in_([uuid_str])).values(deleted_at=old,
|
||||||
deleted=True)
|
deleted=True)
|
||||||
self.conn.execute(make_old)
|
with db_api.main_context_manager.writer.using(self.context):
|
||||||
|
self.context.session.execute(make_old)
|
||||||
|
|
||||||
# Verify that purge_deleted_rows fails due to Foreign Key constraint
|
# Verify that purge_deleted_rows fails due to Foreign Key constraint
|
||||||
self.assertRaises(db_exc.DBReferenceError, db.purge_deleted_rows,
|
self.assertRaises(db_exc.DBReferenceError, db.purge_deleted_rows,
|
||||||
|
Loading…
Reference in New Issue
Block a user