`Session.autocommit` parameter is removed

Since [1] (in oslo.db>9.1.0), the ``Session.autocommit`` member
is removed and should not be considered. This patch removes this
dependency while keeping backwards compatibility. This code will
be removed in future releases.

Due to the neutron-lib dependency, this patch bumps the needed
library version to 3.1.0.

[1]https://review.opendev.org/c/openstack/oslo.db/+/804775

Depends-On: https://review.opendev.org/c/openstack/neutron-lib/+/851193

Closes-Bug: #1982818
Change-Id: Ibfcf9d5f6cd805f2d64fcd88049e2b43fedc3497
This commit is contained in:
Rodolfo Alonso Hernandez 2022-07-28 01:11:59 +02:00
parent 1b9e9a6c2c
commit 812ef0306f
6 changed files with 15 additions and 7 deletions

View File

@ -1040,7 +1040,8 @@ def is_session_active(session):
behaviour, this method checks if there is a transaction created and if behaviour, this method checks if there is a transaction created and if
the transaction has any active connection against the database server. the transaction has any active connection against the database server.
""" """
if session.autocommit: # old behaviour, to be removed with sqlalchemy 2.0 if getattr(session, 'autocommit', None):
# old behaviour, to be removed with sqlalchemy 2.0
return session.is_active return session.is_active
if not session.transaction: if not session.transaction:
return False return False

View File

@ -17,7 +17,6 @@ from unittest import mock
from neutron_lib import context from neutron_lib import context
from neutron.common import utils
from neutron.db import _utils as db_utils from neutron.db import _utils as db_utils
from neutron.tests.unit import testlib_api from neutron.tests.unit import testlib_api
@ -31,14 +30,11 @@ class TestCommonHelpFunctions(testlib_api.SqlTestCase):
def test__safe_creation_create_bindings_fails(self): def test__safe_creation_create_bindings_fails(self):
create_fn = mock.Mock(return_value={'id': 1234}) create_fn = mock.Mock(return_value={'id': 1234})
create_bindings = mock.Mock(side_effect=ValueError) create_bindings = mock.Mock(side_effect=ValueError)
tx_check = lambda i: setattr( delete_fn = mock.Mock()
self, '_active', utils.is_session_active(self.admin_ctx.session))
delete_fn = mock.Mock(side_effect=tx_check)
self.assertRaises(ValueError, db_utils.safe_creation, self.assertRaises(ValueError, db_utils.safe_creation,
self.admin_ctx, create_fn, delete_fn, self.admin_ctx, create_fn, delete_fn,
create_bindings) create_bindings)
delete_fn.assert_called_once_with(1234) delete_fn.assert_called_once_with(1234)
self.assertTrue(self._active)
def test__safe_creation_deletion_fails(self): def test__safe_creation_deletion_fails(self):
create_fn = mock.Mock(return_value={'id': 1234}) create_fn = mock.Mock(return_value={'id': 1234})

View File

@ -46,6 +46,7 @@ from neutron.db import agents_db
from neutron.db import l3_agentschedulers_db from neutron.db import l3_agentschedulers_db
from neutron.db import l3_hamode_db from neutron.db import l3_hamode_db
from neutron.objects import l3_hamode from neutron.objects import l3_hamode
from neutron.objects import network as network_obj
from neutron import quota from neutron import quota
from neutron.scheduler import l3_agent_scheduler from neutron.scheduler import l3_agent_scheduler
from neutron.services.revisions import revision_plugin from neutron.services.revisions import revision_plugin
@ -601,6 +602,7 @@ class L3HATestCase(L3HATestFramework):
def test_add_ha_port_subtransactions_blocked(self): def test_add_ha_port_subtransactions_blocked(self):
ctx = self.admin_ctx ctx = self.admin_ctx
with db_api.CONTEXT_WRITER.using(ctx): with db_api.CONTEXT_WRITER.using(ctx):
network_obj.Network(ctx).create()
self.assertRaises(RuntimeError, self.plugin.add_ha_port, self.assertRaises(RuntimeError, self.plugin.add_ha_port,
ctx, 'id', 'id', 'id') ctx, 'id', 'id', 'id')

View File

@ -53,6 +53,7 @@ from neutron.db import provisioning_blocks
from neutron.db import securitygroups_db as sg_db from neutron.db import securitygroups_db as sg_db
from neutron.db import segments_db from neutron.db import segments_db
from neutron.objects import base as base_obj from neutron.objects import base as base_obj
from neutron.objects import network as network_obj
from neutron.objects import ports as port_obj from neutron.objects import ports as port_obj
from neutron.objects import router as l3_obj from neutron.objects import router as l3_obj
from neutron.plugins.ml2.common import constants as ml2_consts from neutron.plugins.ml2.common import constants as ml2_consts
@ -3483,6 +3484,7 @@ class TestTransactionGuard(Ml2PluginV2TestCase):
plugin = directory.get_plugin() plugin = directory.get_plugin()
ctx = context.get_admin_context() ctx = context.get_admin_context()
with db_api.CONTEXT_WRITER.using(ctx): with db_api.CONTEXT_WRITER.using(ctx):
network_obj.Network(ctx).create()
with testtools.ExpectedException(RuntimeError): with testtools.ExpectedException(RuntimeError):
plugin.delete_network(ctx, 'id') plugin.delete_network(ctx, 'id')
@ -3490,6 +3492,7 @@ class TestTransactionGuard(Ml2PluginV2TestCase):
plugin = directory.get_plugin() plugin = directory.get_plugin()
ctx = context.get_admin_context() ctx = context.get_admin_context()
with db_api.CONTEXT_WRITER.using(ctx): with db_api.CONTEXT_WRITER.using(ctx):
network_obj.Network(ctx).create()
with testtools.ExpectedException(RuntimeError): with testtools.ExpectedException(RuntimeError):
plugin.delete_subnet(ctx, 'id') plugin.delete_subnet(ctx, 'id')

View File

@ -560,6 +560,12 @@ class TestMeteringPlugin(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
def test_delete_metering_label_does_not_clear_router_tenant_id(self): def test_delete_metering_label_does_not_clear_router_tenant_id(self):
tenant_id = '654f6b9d-0f36-4ae5-bd1b-01616794ca60' tenant_id = '654f6b9d-0f36-4ae5-bd1b-01616794ca60'
# TODO(ralonsoh): to investigate why the context in [1] has some value
# in session.transaction._connections, while during a normal operation,
# the ._connections value is empty.
# [1]https://github.com/openstack/neutron/blob/
# 1b9e9a6c2ccf7f9bc06429f53e5126f356ae3d4a/neutron/api/v2/base.py#L563
self.ctx.GUARD_TRANSACTION = False
with self.metering_label(tenant_id=tenant_id) as metering_label: with self.metering_label(tenant_id=tenant_id) as metering_label:
with self.router(tenant_id=tenant_id, set_context=True) as r: with self.router(tenant_id=tenant_id, set_context=True) as r:
router = self._show('routers', r['router']['id']) router = self._show('routers', r['router']['id'])

View File

@ -20,7 +20,7 @@ Jinja2>=2.10 # BSD License (3 clause)
keystonemiddleware>=5.1.0 # Apache-2.0 keystonemiddleware>=5.1.0 # Apache-2.0
netaddr>=0.7.18 # BSD netaddr>=0.7.18 # BSD
netifaces>=0.10.4 # MIT netifaces>=0.10.4 # MIT
neutron-lib>=2.21.0 # Apache-2.0 neutron-lib>=3.1.0 # Apache-2.0
python-neutronclient>=7.8.0 # Apache-2.0 python-neutronclient>=7.8.0 # Apache-2.0
tenacity>=6.0.0 # Apache-2.0 tenacity>=6.0.0 # Apache-2.0
SQLAlchemy>=1.4.23 # MIT SQLAlchemy>=1.4.23 # MIT