Skip to content

Commit 3631f0e

Browse files
committed
Rebase SqlAlchemy_2.0 Support
1 parent b195aa3 commit 3631f0e

49 files changed

Lines changed: 1324 additions & 1181 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.travis.yml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
language: python
2+
dist: jammy
23

34
matrix:
45
include:
5-
- python: 2.7
6+
- python: 3.8
67
env:
7-
- TOX_ENV=py27
8-
- python: 2.7
8+
- TOX_ENV=py38
9+
- python: 3.10
910
env:
10-
- TOX_ENV=pep8
11-
- python: 3.6
11+
- TOX_ENV=py310
12+
- python: 3.12
1213
env:
13-
- TOX_ENV=py36
14-
- python: 3.6
14+
- TOX_ENV=py312
15+
- python: 3.10
1516
env:
1617
- TOX_ENV=pep8
1718
install:

aim/agent/aid/service.py

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -235,51 +235,50 @@ def _send_heartbeat(self, aim_ctx):
235235
def get_vnodes_value(self, aim_ctx):
236236
dbsession = aim_ctx.store.db_session
237237
dbsession.get_bind()
238-
with dbsession.begin(subtransactions=True):
238+
with dbsession.begin():
239239
aim_consistent_hashring_params_table = sa.Table(
240240
'aim_consistent_hashring_params', sa.MetaData(),
241241
sa.Column('value', sa.Integer, nullable=False),
242242
sa.Column('name', sa.String(16), nullable=False,
243243
primary_key=True))
244-
query = (sa.select([aim_consistent_hashring_params_table.c.value]).
245-
where(aim_consistent_hashring_params_table.c.name
246-
== 'vnodes'))
244+
query = (sa.select(aim_consistent_hashring_params_table.c.value).
245+
where(aim_consistent_hashring_params_table.c.name ==
246+
'vnodes'))
247247
result = dbsession.execute(query).fetchone()
248248
vnodes_value = result[0] if result else DEFAULT_VNODES_HASHRING
249249
return vnodes_value
250250

251251
def _calculate_tenants(self, aim_ctx):
252-
with aim_ctx.store.begin(subtransactions=True):
253-
# Refresh this agent
254-
self.agent = self.manager.get(aim_ctx, self.agent)
255-
if not self.single_aid:
256-
down_time = self.agent.down_time(aim_ctx)
257-
if max(0, down_time or 0) > self.max_down_time:
258-
utils.perform_harakiri(LOG, "Agent has been down for %s "
259-
"seconds." % down_time)
260-
# Get peers
261-
agents = [
262-
x for x in self.manager.find(aim_ctx, resource.Agent,
263-
admin_state_up=True)
264-
if not x.is_down(aim_ctx)]
265-
# Validate agent version
266-
if not agents:
267-
return []
268-
max_version = max(agents, key=lambda x: x.version).version
269-
if self._major_vercompare(self.agent.version, max_version) < 0:
270-
LOG.error("Agent version is outdated: Current %s Required "
271-
"%s" % (self.agent.version, max_version))
272-
return []
273-
# Purge outdated agents
274-
agents = [x for x in agents if
275-
self._major_vercompare(x.version, max_version) == 0]
276-
else:
277-
agents = [self.agent]
278-
result = self._tenant_assignation_algorithm(aim_ctx, agents)
279-
# Store result in DB
280-
self.agent.hash_trees = result
281-
self.manager.create(aim_ctx, self.agent, overwrite=True)
282-
return result
252+
# Refresh this agent
253+
self.agent = self.manager.get(aim_ctx, self.agent)
254+
if not self.single_aid:
255+
down_time = self.agent.down_time(aim_ctx)
256+
if max(0, down_time or 0) > self.max_down_time:
257+
utils.perform_harakiri(LOG, "Agent has been down for %s "
258+
"seconds." % down_time)
259+
# Get peers
260+
agents = [
261+
x for x in self.manager.find(aim_ctx, resource.Agent,
262+
admin_state_up=True)
263+
if not x.is_down(aim_ctx)]
264+
# Validate agent version
265+
if not agents:
266+
return []
267+
max_version = max(agents, key=lambda x: x.version).version
268+
if self._major_vercompare(self.agent.version, max_version) < 0:
269+
LOG.error("Agent version is outdated: Current %s Required "
270+
"%s" % (self.agent.version, max_version))
271+
return []
272+
# Purge outdated agents
273+
agents = [x for x in agents if
274+
self._major_vercompare(x.version, max_version) == 0]
275+
else:
276+
agents = [self.agent]
277+
result = self._tenant_assignation_algorithm(aim_ctx, agents)
278+
# Store result in DB
279+
self.agent.hash_trees = result
280+
self.manager.create(aim_ctx, self.agent, overwrite=True)
281+
return result
283282

284283
def _tenant_assignation_algorithm(self, aim_ctx, agents):
285284
# TODO(ivar): just randomly hash each tenant to agents for now. This

aim/agent/aid/universes/aci/converter.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -414,8 +414,8 @@ def l3ext_next_hop_converter(object_dict, otype, helper,
414414
return []
415415
for index, attr in enumerate(destination_identity_attributes):
416416
res_dict[attr] = id[index]
417-
if (object_dict.get('type') == 'prefix' and object_dict.get('nhAddr')
418-
and object_dict.get('pref')):
417+
if (object_dict.get('type') == 'prefix' and object_dict.
418+
get('nhAddr') and object_dict.get('pref')):
419419
res_dict['next_hop_list'] = [{'addr': object_dict['nhAddr'],
420420
'preference': object_dict['pref']}]
421421
result.append(default_to_resource(res_dict, helper, to_aim=True))

aim/agent/aid/universes/aim_universe.py

Lines changed: 34 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,9 @@ def observe(self, context):
9494
if utils.get_time() > self._scheduled_recovery:
9595
for root in served_tenants:
9696
self.manager.recover_root_errors(context, root)
97-
htdbl.cleanup_zombie_status_objects(context, served_tenants)
98-
self.schedule_next_recovery()
97+
with context.store.db_session.begin():
98+
htdbl.cleanup_zombie_status_objects(context, served_tenants)
99+
self.schedule_next_recovery()
99100
htdbl.catch_up_with_action_log(context.store, served_tenants)
100101
# REVISIT(ivar): what if a root is marked as needs_reset? we could
101102
# avoid syncing it altogether
@@ -115,11 +116,9 @@ def get_optimized_state(self, context, other_state,
115116
def cleanup_state(self, context, key):
116117
# Only delete if state is still empty. Never remove a tenant if there
117118
# are leftovers.
118-
with context.store.begin(subtransactions=True):
119-
# There could still be logs, but they will re-create the
120-
# tenants in the next iteration.
121-
self.tree_manager.delete_by_root_rn(context, key, if_empty=True)
122-
super(AimDbUniverse, self).cleanup_state(context, key)
119+
# There could still be logs, but they will re-create the
120+
# tenants in the next iteration.
121+
self.tree_manager.delete_by_root_rn(context, key, if_empty=True)
123122

124123
def _get_state(self, context, tree=tree_manager.CONFIG_TREE):
125124
return self.tree_manager.find_changed(
@@ -228,33 +227,32 @@ def _push_resource(self, context, resource, method, monitored):
228227
[resource])
229228
resource = self._converter.convert(resource)[0]
230229
resource.monitored = monitored
231-
with context.store.begin(subtransactions=True):
232-
if isinstance(resource, aim_resource.AciRoot):
233-
# Roots should not be created by the
234-
# AIM monitored universe.
235-
# NOTE(ivar): there are contention cases
236-
# where a user might delete a Root object
237-
# right before the AIM Monitored Universe
238-
# pushes an update on it. If we run a
239-
# simple "create overwrite" this would
240-
# re-create the object and AID would keep
241-
# monitoring said root. by only updating
242-
# roots and never creating them, we give
243-
# full control over which trees to monitor
244-
# to the user.
245-
ext = context.store.extract_attributes
246-
obj = self.manager.update(
247-
context, resource, fix_ownership=monitored,
248-
**ext(resource, "other"))
249-
if obj:
250-
# Declare victory for the update
251-
self.creation_succeeded(resource)
252-
else:
253-
self.manager.create(
254-
context, resource, overwrite=True,
255-
fix_ownership=monitored)
256-
# Declare victory for the created object
230+
if isinstance(resource, aim_resource.AciRoot):
231+
# Roots should not be created by the
232+
# AIM monitored universe.
233+
# NOTE(ivar): there are contention cases
234+
# where a user might delete a Root object
235+
# right before the AIM Monitored Universe
236+
# pushes an update on it. If we run a
237+
# simple "create overwrite" this would
238+
# re-create the object and AID would keep
239+
# monitoring said root. by only updating
240+
# roots and never creating them, we give
241+
# full control over which trees to monitor
242+
# to the user.
243+
ext = context.store.extract_attributes
244+
obj = self.manager.update(
245+
context, resource, fix_ownership=monitored,
246+
**ext(resource, "other"))
247+
if obj:
248+
# Declare victory for the update
257249
self.creation_succeeded(resource)
250+
else:
251+
self.manager.create(
252+
context, resource, overwrite=True,
253+
fix_ownership=monitored)
254+
# Declare victory for the created object
255+
self.creation_succeeded(resource)
258256
else:
259257
if isinstance(resource, aim_resource.AciRoot) and monitored:
260258
# Monitored Universe doesn't delete Tenant
@@ -264,10 +262,9 @@ def _push_resource(self, context, resource, method, monitored):
264262
return
265263
if monitored:
266264
# Only delete a resource if monitored
267-
with context.store.begin(subtransactions=True):
268-
existing = self.manager.get(context, resource)
269-
if existing and existing.monitored:
270-
self.manager.delete(context, resource)
265+
existing = self.manager.get(context, resource)
266+
if existing and existing.monitored:
267+
self.manager.delete(context, resource)
271268
else:
272269
self.manager.delete(context, resource)
273270

aim/aim_lib/db/model.py

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -52,42 +52,59 @@ class CloneL3Out(model_base.Base):
5252

5353
class CloneL3OutManager(object):
5454

55-
def set(self, context, source, clone):
55+
def _set(self, context, source, clone):
5656
"""Store L3outside clone key and the relationship to its source
5757
5858
:param context: AIM context
5959
:param source: L3Outside AIM resource
6060
:param clone: L3Outside AIM resource
6161
:return:
6262
"""
63-
with context.db_session.begin(subtransactions=True):
64-
obj = CloneL3Out(source_tenant_name=source.tenant_name,
65-
source_name=source.name,
66-
tenant_name=clone.tenant_name,
67-
name=clone.name)
68-
context.db_session.add(obj)
63+
obj = CloneL3Out(source_tenant_name=source.tenant_name,
64+
source_name=source.name,
65+
tenant_name=clone.tenant_name,
66+
name=clone.name)
67+
context.db_session.add(obj)
6968

70-
def get(self, context, clone):
69+
def set(self, context, source, clone):
70+
if not context.store.db_session.in_transaction():
71+
with context.store.db_session.begin():
72+
self._set(context, source, clone)
73+
else:
74+
self._set(context, source, clone)
75+
76+
def _get(self, context, clone):
7177
rows = self._find_query(context, tenant_name=clone.tenant_name,
7278
name=clone.name).all()
7379
return rows
7480

75-
def get_clones(self, context, source):
81+
def get(self, context, clone):
82+
if not context.store.db_session.in_transaction():
83+
with context.store.db_session.begin():
84+
return self._get(context, clone)
85+
return self._get(context, clone)
86+
87+
def _get_clones(self, context, source):
7688
"""Given a source, find its clones' identity attributes
7789
7890
:param context: AIM context
7991
:param source: L3Outside AIM resource
8092
:return: list of tuples where the first position is the clone L3Out
8193
tenant_name and the second is its name.
8294
"""
83-
with context.db_session.begin(subtransactions=True):
84-
result = []
85-
db_objs = self._find_query(
86-
context, source_tenant_name=source.tenant_name,
87-
source_name=source.name).all()
88-
for db_obj in db_objs:
89-
result.append((db_obj.tenant_name, db_obj.name))
90-
return result
95+
result = []
96+
db_objs = self._find_query(
97+
context, source_tenant_name=source.tenant_name,
98+
source_name=source.name).all()
99+
for db_obj in db_objs:
100+
result.append((db_obj.tenant_name, db_obj.name))
101+
return result
102+
103+
def get_clones(self, context, source):
104+
if not context.store.db_session.in_transaction():
105+
with context.store.db_session.begin():
106+
return self._get_clones(context, source)
107+
return self._get_clones(context, source)
91108

92109
def _find_query(self, context, **kwargs):
93110
query = context.db_session.query(CloneL3Out)

0 commit comments

Comments
 (0)