add newly added constraints to expire clear_expired_metering_data

- cascade deletes to metadata tables on meter deletion
- delete associations on object deletion
- add check to not delete user/project entries associated with Alarm

Change-Id: I24cbaea9ede6d142dc22eaf070b3f7d1f14b484a
Closes-Bug: #1258071
This commit is contained in:
Gordon Chung
2013-12-09 17:53:04 -05:00
parent 5472a1dba0
commit 13764537a4
4 changed files with 139 additions and 20 deletions

View File

@@ -279,28 +279,49 @@ class Connection(base.Connection):
:param ttl: Number of seconds to keep records for.
"""
session = sqlalchemy_session.get_session()
query = session.query(models.Meter.id)
end = timeutils.utcnow() - datetime.timedelta(seconds=ttl)
query = query.filter(models.Meter.timestamp < end)
query.delete()
with session.begin():
end = timeutils.utcnow() - datetime.timedelta(seconds=ttl)
meter_query = session.query(models.Meter)\
.filter(models.Meter.timestamp < end)
for meter_obj in meter_query.all():
session.delete(meter_obj)
query = session.query(models.User.id).filter(~models.User.id.in_(
session.query(models.Meter.user_id).group_by(models.Meter.user_id)
))
query.delete(synchronize_session='fetch')
query = session.query(models.User).filter(
~models.User.id.in_(session.query(models.Meter.user_id)
.group_by(models.Meter.user_id)),
~models.User.id.in_(session.query(models.Alarm.user_id)
.group_by(models.Alarm.user_id)),
~models.User.id.in_(session.query(models.AlarmChange.user_id)
.group_by(models.AlarmChange.user_id))
)
for user_obj in query.all():
session.delete(user_obj)
query = session.query(models.Project.id)\
.filter(~models.Project.id.in_(
session.query(models.Meter.project_id).group_by(
models.Meter.project_id)))
query.delete(synchronize_session='fetch')
query = session.query(models.Project)\
.filter(~models.Project.id.in_(
session.query(models.Meter.project_id)
.group_by(models.Meter.project_id)),
~models.Project.id.in_(
session.query(models.Alarm.project_id)
.group_by(models.Alarm.project_id)),
~models.Project.id.in_(
session.query(models.AlarmChange.project_id)
.group_by(models.AlarmChange.project_id)),
~models.Project.id.in_(
session.query(models.AlarmChange.on_behalf_of)
.group_by(models.AlarmChange.on_behalf_of))
)
for project_obj in query.all():
session.delete(project_obj)
query = session.query(models.Resource.id)\
.filter(~models.Resource.id.in_(
session.query(models.Meter.resource_id).group_by(
models.Meter.resource_id)))
query.delete(synchronize_session='fetch')
query = session.query(models.Resource)\
.filter(~models.Resource.id.in_(
session.query(models.Meter.resource_id).group_by(
models.Meter.resource_id)))
for res_obj in query.all():
session.delete(res_obj)
@staticmethod
def get_users(source=None):