Skip to content

Commit f2c1035

Browse files
committed
Replace usage of LegacyEngineFacade
Switch to using oslo_db.sqlalchemy.enginefacade instead, as this is required for SQLAlchemy 2.x support. Change-Id: Ifcad28239b6907b8ca396d348cbfa54185355f68
1 parent 3e35eb0 commit f2c1035

14 files changed

Lines changed: 604 additions & 659 deletions

File tree

cloudkitty/common/db/alembic/env.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,11 @@ def run_migrations_online(target_metadata, version_table):
3232
:param target_metadata: Model's metadata used for autogenerate support.
3333
:param version_table: Override the default version table for alembic.
3434
"""
35-
engine = db.get_engine()
36-
with engine.connect() as connection:
37-
context.configure(connection=connection,
38-
target_metadata=target_metadata,
39-
version_table=version_table)
40-
with context.begin_transaction():
41-
context.run_migrations()
35+
with db.session_for_write() as session:
36+
engine = session.get_bind()
37+
with engine.connect() as connection:
38+
context.configure(connection=connection,
39+
target_metadata=target_metadata,
40+
version_table=version_table)
41+
with context.begin_transaction():
42+
context.run_migrations()

cloudkitty/db/__init__.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,26 @@
1313
# License for the specific language governing permissions and limitations
1414
# under the License.
1515
#
16-
from oslo_config import cfg
17-
from oslo_db.sqlalchemy import session
16+
import threading
1817

18+
from oslo_db.sqlalchemy import enginefacade
19+
20+
_CONTEXT = threading.local()
1921
_FACADE = None
2022

2123

2224
def _create_facade_lazily():
2325
global _FACADE
2426
if _FACADE is None:
25-
# FIXME(priteau): Remove autocommit=True (and ideally use of
26-
# LegacyEngineFacade) asap since it's not compatible with SQLAlchemy
27-
# 2.0.
28-
_FACADE = session.EngineFacade.from_config(cfg.CONF, sqlite_fk=True,
29-
autocommit=True)
27+
ctx = enginefacade.transaction_context()
28+
ctx.configure(sqlite_fk=True)
29+
_FACADE = ctx
3030
return _FACADE
3131

3232

33-
def get_engine():
34-
facade = _create_facade_lazily()
35-
return facade.get_engine()
33+
def session_for_read():
34+
return _create_facade_lazily().reader.using(_CONTEXT)
3635

3736

38-
def get_session(**kwargs):
39-
facade = _create_facade_lazily()
40-
return facade.get_session(**kwargs)
37+
def session_for_write():
38+
return _create_facade_lazily().writer.using(_CONTEXT)

cloudkitty/db/sqlalchemy/api.py

Lines changed: 74 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,15 @@ def get_backend():
3030
class State(api.State):
3131

3232
def get_state(self, name):
33-
session = db.get_session()
34-
q = utils.model_query(
35-
models.StateInfo,
36-
session)
37-
q = q.filter(models.StateInfo.name == name)
38-
return q.value(models.StateInfo.state)
33+
with db.session_for_read() as session:
34+
q = utils.model_query(
35+
models.StateInfo,
36+
session)
37+
q = q.filter(models.StateInfo.name == name)
38+
return q.value(models.StateInfo.state)
3939

4040
def set_state(self, name, state):
41-
session = db.get_session()
42-
with session.begin():
41+
with db.session_for_write() as session:
4342
try:
4443
q = utils.model_query(
4544
models.StateInfo,
@@ -55,16 +54,15 @@ def set_state(self, name, state):
5554
return db_state.state
5655

5756
def get_metadata(self, name):
58-
session = db.get_session()
59-
q = utils.model_query(
60-
models.StateInfo,
61-
session)
62-
q.filter(models.StateInfo.name == name)
63-
return q.value(models.StateInfo.s_metadata)
57+
with db.session_for_read() as session:
58+
q = utils.model_query(
59+
models.StateInfo,
60+
session)
61+
q.filter(models.StateInfo.name == name)
62+
return q.value(models.StateInfo.s_metadata)
6463

6564
def set_metadata(self, name, metadata):
66-
session = db.get_session()
67-
with session.begin():
65+
with db.session_for_write() as session:
6866
try:
6967
q = utils.model_query(
7068
models.StateInfo,
@@ -83,20 +81,19 @@ class ModuleInfo(api.ModuleInfo):
8381
"""Base class for module info management."""
8482

8583
def get_priority(self, name):
86-
session = db.get_session()
87-
q = utils.model_query(
88-
models.ModuleStateInfo,
89-
session)
90-
q = q.filter(models.ModuleStateInfo.name == name)
91-
res = q.value(models.ModuleStateInfo.priority)
92-
if res:
93-
return int(res)
94-
else:
95-
return 1
84+
with db.session_for_read() as session:
85+
q = utils.model_query(
86+
models.ModuleStateInfo,
87+
session)
88+
q = q.filter(models.ModuleStateInfo.name == name)
89+
res = q.value(models.ModuleStateInfo.priority)
90+
if res:
91+
return int(res)
92+
else:
93+
return 1
9694

9795
def set_priority(self, name, priority):
98-
session = db.get_session()
99-
with session.begin():
96+
with db.session_for_write() as session:
10097
try:
10198
q = utils.model_query(
10299
models.ModuleStateInfo,
@@ -113,20 +110,19 @@ def set_priority(self, name, priority):
113110
return int(db_state.priority)
114111

115112
def get_state(self, name):
116-
session = db.get_session()
117-
try:
118-
q = utils.model_query(
119-
models.ModuleStateInfo,
120-
session)
121-
q = q.filter(models.ModuleStateInfo.name == name)
122-
res = q.value(models.ModuleStateInfo.state)
123-
return bool(res)
124-
except sqlalchemy.orm.exc.NoResultFound:
125-
return None
113+
with db.session_for_read() as session:
114+
try:
115+
q = utils.model_query(
116+
models.ModuleStateInfo,
117+
session)
118+
q = q.filter(models.ModuleStateInfo.name == name)
119+
res = q.value(models.ModuleStateInfo.state)
120+
return bool(res)
121+
except sqlalchemy.orm.exc.NoResultFound:
122+
return None
126123

127124
def set_state(self, name, state):
128-
session = db.get_session()
129-
with session.begin():
125+
with db.session_for_write() as session:
130126
try:
131127
q = utils.model_query(
132128
models.ModuleStateInfo,
@@ -145,20 +141,19 @@ class ServiceToCollectorMapping(object):
145141
"""Base class for service to collector mapping."""
146142

147143
def get_mapping(self, service):
148-
session = db.get_session()
149-
try:
150-
q = utils.model_query(
151-
models.ServiceToCollectorMapping,
152-
session)
153-
q = q.filter(
154-
models.ServiceToCollectorMapping.service == service)
155-
return q.one()
156-
except sqlalchemy.orm.exc.NoResultFound:
157-
raise api.NoSuchMapping(service)
144+
with db.session_for_read() as session:
145+
try:
146+
q = utils.model_query(
147+
models.ServiceToCollectorMapping,
148+
session)
149+
q = q.filter(
150+
models.ServiceToCollectorMapping.service == service)
151+
return q.one()
152+
except sqlalchemy.orm.exc.NoResultFound:
153+
raise api.NoSuchMapping(service)
158154

159155
def set_mapping(self, service, collector):
160-
session = db.get_session()
161-
with session.begin():
156+
with db.session_for_write() as session:
162157
try:
163158
q = utils.model_query(
164159
models.ServiceToCollectorMapping,
@@ -176,37 +171,37 @@ def set_mapping(self, service, collector):
176171
return db_mapping
177172

178173
def list_services(self, collector=None):
179-
session = db.get_session()
180-
q = utils.model_query(
181-
models.ServiceToCollectorMapping,
182-
session)
183-
if collector:
184-
q = q.filter(
185-
models.ServiceToCollectorMapping.collector == collector)
186-
res = q.distinct().values(
187-
models.ServiceToCollectorMapping.service)
188-
return res
174+
with db.session_for_read() as session:
175+
q = utils.model_query(
176+
models.ServiceToCollectorMapping,
177+
session)
178+
if collector:
179+
q = q.filter(
180+
models.ServiceToCollectorMapping.collector == collector)
181+
res = q.distinct().values(
182+
models.ServiceToCollectorMapping.service)
183+
return res
189184

190185
def list_mappings(self, collector=None):
191-
session = db.get_session()
192-
q = utils.model_query(
193-
models.ServiceToCollectorMapping,
194-
session)
195-
if collector:
196-
q = q.filter(
197-
models.ServiceToCollectorMapping.collector == collector)
198-
res = q.all()
199-
return res
186+
with db.session_for_read() as session:
187+
q = utils.model_query(
188+
models.ServiceToCollectorMapping,
189+
session)
190+
if collector:
191+
q = q.filter(
192+
models.ServiceToCollectorMapping.collector == collector)
193+
res = q.all()
194+
return res
200195

201196
def delete_mapping(self, service):
202-
session = db.get_session()
203-
q = utils.model_query(
204-
models.ServiceToCollectorMapping,
205-
session)
206-
q = q.filter(models.ServiceToCollectorMapping.service == service)
207-
r = q.delete()
208-
if not r:
209-
raise api.NoSuchMapping(service)
197+
with db.session_for_write() as session:
198+
q = utils.model_query(
199+
models.ServiceToCollectorMapping,
200+
session)
201+
q = q.filter(models.ServiceToCollectorMapping.service == service)
202+
r = q.delete()
203+
if not r:
204+
raise api.NoSuchMapping(service)
210205

211206

212207
class DBAPIManager(object):

cloudkitty/rating/hash/db/sqlalchemy/alembic/models/f8c799db4aa0_fix_unnamed_constraints.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,11 @@ class HashMapBase(models.ModelBase):
2929
'mysql_engine': "InnoDB"}
3030
fk_to_resolve = {}
3131

32-
def save(self, session=None):
32+
def save(self):
3333
from cloudkitty import db
3434

35-
if session is None:
36-
session = db.get_session()
37-
38-
super(HashMapBase, self).save(session=session)
35+
with db.session_for_write() as session:
36+
super(HashMapBase, self).save(session=session)
3937

4038
def as_dict(self):
4139
d = {}

0 commit comments

Comments
 (0)