Merge "Use soft_delete() methods in DB api"
This commit is contained in:
commit
49e5304990
@ -23,6 +23,9 @@ import datetime
|
|||||||
import sys
|
import sys
|
||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
|
# NOTE(uglide): Required to override default oslo_db Query class
|
||||||
|
import manila.db.sqlalchemy.query # noqa
|
||||||
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
from oslo_db import exception as db_exception
|
from oslo_db import exception as db_exception
|
||||||
from oslo_db import options as db_options
|
from oslo_db import options as db_options
|
||||||
@ -34,7 +37,6 @@ from oslo_utils import uuidutils
|
|||||||
import six
|
import six
|
||||||
from sqlalchemy import or_
|
from sqlalchemy import or_
|
||||||
from sqlalchemy.orm import joinedload
|
from sqlalchemy.orm import joinedload
|
||||||
from sqlalchemy.sql.expression import literal_column
|
|
||||||
from sqlalchemy.sql.expression import true
|
from sqlalchemy.sql.expression import true
|
||||||
from sqlalchemy.sql import func
|
from sqlalchemy.sql import func
|
||||||
|
|
||||||
@ -995,10 +997,7 @@ def reservation_commit(context, reservations, project_id=None, user_id=None):
|
|||||||
if reservation.delta >= 0:
|
if reservation.delta >= 0:
|
||||||
usage.reserved -= reservation.delta
|
usage.reserved -= reservation.delta
|
||||||
usage.in_use += reservation.delta
|
usage.in_use += reservation.delta
|
||||||
reservation_query.update({'deleted': 1,
|
reservation_query.soft_delete(synchronize_session=False)
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')},
|
|
||||||
synchronize_session=False)
|
|
||||||
|
|
||||||
|
|
||||||
@require_context
|
@require_context
|
||||||
@ -1012,10 +1011,7 @@ def reservation_rollback(context, reservations, project_id=None, user_id=None):
|
|||||||
usage = usages[reservation.resource]
|
usage = usages[reservation.resource]
|
||||||
if reservation.delta >= 0:
|
if reservation.delta >= 0:
|
||||||
usage.reserved -= reservation.delta
|
usage.reserved -= reservation.delta
|
||||||
reservation_query.update({'deleted': 1,
|
reservation_query.soft_delete(synchronize_session=False)
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')},
|
|
||||||
synchronize_session=False)
|
|
||||||
|
|
||||||
|
|
||||||
@require_admin_context
|
@require_admin_context
|
||||||
@ -1025,29 +1021,17 @@ def quota_destroy_all_by_project_and_user(context, project_id, user_id):
|
|||||||
model_query(context, models.ProjectUserQuota, session=session,
|
model_query(context, models.ProjectUserQuota, session=session,
|
||||||
read_deleted="no").\
|
read_deleted="no").\
|
||||||
filter_by(project_id=project_id).\
|
filter_by(project_id=project_id).\
|
||||||
filter_by(user_id=user_id).\
|
filter_by(user_id=user_id).soft_delete(synchronize_session=False)
|
||||||
update({'deleted': 1,
|
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')},
|
|
||||||
synchronize_session=False)
|
|
||||||
|
|
||||||
model_query(context, models.QuotaUsage,
|
model_query(context, models.QuotaUsage,
|
||||||
session=session, read_deleted="no").\
|
session=session, read_deleted="no").\
|
||||||
filter_by(project_id=project_id).\
|
filter_by(project_id=project_id).\
|
||||||
filter_by(user_id=user_id).\
|
filter_by(user_id=user_id).soft_delete(synchronize_session=False)
|
||||||
update({'deleted': 1,
|
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')},
|
|
||||||
synchronize_session=False)
|
|
||||||
|
|
||||||
model_query(context, models.Reservation,
|
model_query(context, models.Reservation,
|
||||||
session=session, read_deleted="no").\
|
session=session, read_deleted="no").\
|
||||||
filter_by(project_id=project_id).\
|
filter_by(project_id=project_id).\
|
||||||
filter_by(user_id=user_id).\
|
filter_by(user_id=user_id).soft_delete(synchronize_session=False)
|
||||||
update({'deleted': 1,
|
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')},
|
|
||||||
synchronize_session=False)
|
|
||||||
|
|
||||||
|
|
||||||
@require_admin_context
|
@require_admin_context
|
||||||
@ -1057,34 +1041,22 @@ def quota_destroy_all_by_project(context, project_id):
|
|||||||
model_query(context, models.Quota, session=session,
|
model_query(context, models.Quota, session=session,
|
||||||
read_deleted="no").\
|
read_deleted="no").\
|
||||||
filter_by(project_id=project_id).\
|
filter_by(project_id=project_id).\
|
||||||
update({'deleted': 1,
|
soft_delete(synchronize_session=False)
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')},
|
|
||||||
synchronize_session=False)
|
|
||||||
|
|
||||||
model_query(context, models.ProjectUserQuota, session=session,
|
model_query(context, models.ProjectUserQuota, session=session,
|
||||||
read_deleted="no").\
|
read_deleted="no").\
|
||||||
filter_by(project_id=project_id).\
|
filter_by(project_id=project_id).\
|
||||||
update({'deleted': 1,
|
soft_delete(synchronize_session=False)
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')},
|
|
||||||
synchronize_session=False)
|
|
||||||
|
|
||||||
model_query(context, models.QuotaUsage,
|
model_query(context, models.QuotaUsage,
|
||||||
session=session, read_deleted="no").\
|
session=session, read_deleted="no").\
|
||||||
filter_by(project_id=project_id).\
|
filter_by(project_id=project_id).\
|
||||||
update({'deleted': 1,
|
soft_delete(synchronize_session=False)
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')},
|
|
||||||
synchronize_session=False)
|
|
||||||
|
|
||||||
model_query(context, models.Reservation,
|
model_query(context, models.Reservation,
|
||||||
session=session, read_deleted="no").\
|
session=session, read_deleted="no").\
|
||||||
filter_by(project_id=project_id).\
|
filter_by(project_id=project_id).\
|
||||||
update({'deleted': 1,
|
soft_delete(synchronize_session=False)
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')},
|
|
||||||
synchronize_session=False)
|
|
||||||
|
|
||||||
|
|
||||||
@require_admin_context
|
@require_admin_context
|
||||||
@ -1101,10 +1073,7 @@ def reservation_expire(context):
|
|||||||
reservation.usage.reserved -= reservation.delta
|
reservation.usage.reserved -= reservation.delta
|
||||||
session.add(reservation.usage)
|
session.add(reservation.usage)
|
||||||
|
|
||||||
reservation_query.update({'deleted': 1,
|
reservation_query.soft_delete(synchronize_session=False)
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')},
|
|
||||||
synchronize_session=False)
|
|
||||||
|
|
||||||
|
|
||||||
################
|
################
|
||||||
@ -1313,15 +1282,9 @@ def share_get_all_by_share_server(context, share_server_id, filters=None,
|
|||||||
def share_delete(context, share_id):
|
def share_delete(context, share_id):
|
||||||
session = get_session()
|
session = get_session()
|
||||||
share_ref = share_get(context, share_id, session)
|
share_ref = share_get(context, share_id, session)
|
||||||
share_ref.update({'deleted': True,
|
share_ref.soft_delete(session=session, update_status=True)
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at'),
|
|
||||||
'status': 'deleted'})
|
|
||||||
session.query(models.ShareMetadata).\
|
session.query(models.ShareMetadata).\
|
||||||
filter_by(share_id=share_id).\
|
filter_by(share_id=share_id).soft_delete()
|
||||||
update({'deleted': 1,
|
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')})
|
|
||||||
session.query(models.ShareExportLocations).\
|
session.query(models.ShareExportLocations).\
|
||||||
filter_by(share_id=share_id).soft_delete()
|
filter_by(share_id=share_id).soft_delete()
|
||||||
|
|
||||||
@ -1382,11 +1345,8 @@ def share_access_delete(context, access_id):
|
|||||||
session = get_session()
|
session = get_session()
|
||||||
with session.begin():
|
with session.begin():
|
||||||
session.query(models.ShareAccessMapping).\
|
session.query(models.ShareAccessMapping).\
|
||||||
filter_by(id=access_id).\
|
filter_by(id=access_id).soft_delete(update_status=True,
|
||||||
update({'deleted': access_id,
|
status_field_name='state')
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at'),
|
|
||||||
'state': models.ShareAccessMapping.STATE_DELETED})
|
|
||||||
|
|
||||||
|
|
||||||
@require_context
|
@require_context
|
||||||
@ -1438,11 +1398,7 @@ def share_snapshot_destroy(context, snapshot_id):
|
|||||||
session = get_session()
|
session = get_session()
|
||||||
with session.begin():
|
with session.begin():
|
||||||
session.query(models.ShareSnapshot).\
|
session.query(models.ShareSnapshot).\
|
||||||
filter_by(id=snapshot_id).\
|
filter_by(id=snapshot_id).soft_delete(update_status=True)
|
||||||
update({'status': 'deleted',
|
|
||||||
'deleted': snapshot_id,
|
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')})
|
|
||||||
|
|
||||||
|
|
||||||
@require_context
|
@require_context
|
||||||
@ -1578,10 +1534,7 @@ def share_metadata_get(context, share_id):
|
|||||||
@require_share_exists
|
@require_share_exists
|
||||||
def share_metadata_delete(context, share_id, key):
|
def share_metadata_delete(context, share_id, key):
|
||||||
_share_metadata_get_query(context, share_id).\
|
_share_metadata_get_query(context, share_id).\
|
||||||
filter_by(key=key).\
|
filter_by(key=key).soft_delete()
|
||||||
update({'deleted': 1,
|
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')})
|
|
||||||
|
|
||||||
|
|
||||||
@require_context
|
@require_context
|
||||||
@ -1625,8 +1578,7 @@ def _share_metadata_update(context, share_id, metadata, delete, session=None):
|
|||||||
meta_ref = _share_metadata_get_item(context, share_id,
|
meta_ref = _share_metadata_get_item(context, share_id,
|
||||||
meta_key,
|
meta_key,
|
||||||
session=session)
|
session=session)
|
||||||
meta_ref.update({'deleted': 1})
|
meta_ref.soft_delete(session=session)
|
||||||
meta_ref.save(session=session)
|
|
||||||
|
|
||||||
meta_ref = None
|
meta_ref = None
|
||||||
|
|
||||||
@ -1978,10 +1930,7 @@ def share_server_delete(context, id):
|
|||||||
with session.begin():
|
with session.begin():
|
||||||
server_ref = share_server_get(context, id, session=session)
|
server_ref = share_server_get(context, id, session=session)
|
||||||
share_server_backend_details_delete(context, id, session=session)
|
share_server_backend_details_delete(context, id, session=session)
|
||||||
server_ref.update({'deleted': server_ref.id,
|
server_ref.soft_delete(session=session, update_status=True)
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at'),
|
|
||||||
'status': constants.STATUS_DELETED})
|
|
||||||
|
|
||||||
|
|
||||||
@require_context
|
@require_context
|
||||||
@ -2419,15 +2368,9 @@ def share_type_destroy(context, id):
|
|||||||
id)
|
id)
|
||||||
raise exception.ShareTypeInUse(share_type_id=id)
|
raise exception.ShareTypeInUse(share_type_id=id)
|
||||||
model_query(context, models.ShareTypeExtraSpecs, session=session).\
|
model_query(context, models.ShareTypeExtraSpecs, session=session).\
|
||||||
filter_by(share_type_id=id).update(
|
filter_by(share_type_id=id).soft_delete()
|
||||||
{'deleted': 1,
|
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')})
|
|
||||||
model_query(context, models.ShareTypes, session=session).\
|
model_query(context, models.ShareTypes, session=session).\
|
||||||
filter_by(id=id).update(
|
filter_by(id=id).soft_delete()
|
||||||
{'deleted': id,
|
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')})
|
|
||||||
|
|
||||||
|
|
||||||
def _share_type_access_query(context, session=None):
|
def _share_type_access_query(context, session=None):
|
||||||
@ -2519,10 +2462,7 @@ def share_type_extra_specs_delete(context, share_type_id, key):
|
|||||||
with session.begin():
|
with session.begin():
|
||||||
_share_type_extra_specs_get_item(context, share_type_id, key, session)
|
_share_type_extra_specs_get_item(context, share_type_id, key, session)
|
||||||
_share_type_extra_specs_query(context, share_type_id, session).\
|
_share_type_extra_specs_query(context, share_type_id, session).\
|
||||||
filter_by(key=key).\
|
filter_by(key=key).soft_delete()
|
||||||
update({'deleted': 1,
|
|
||||||
'deleted_at': timeutils.utcnow(),
|
|
||||||
'updated_at': literal_column('updated_at')})
|
|
||||||
|
|
||||||
|
|
||||||
@require_context
|
@require_context
|
||||||
|
@ -47,6 +47,14 @@ class ManilaBase(models.ModelBase,
|
|||||||
model_dict[k] = v
|
model_dict[k] = v
|
||||||
return model_dict
|
return model_dict
|
||||||
|
|
||||||
|
def soft_delete(self, session, update_status=False,
|
||||||
|
status_field_name='status'):
|
||||||
|
"""Mark this object as deleted."""
|
||||||
|
if update_status:
|
||||||
|
setattr(self, status_field_name, constants.STATUS_DELETED)
|
||||||
|
|
||||||
|
return super(ManilaBase, self).soft_delete(session)
|
||||||
|
|
||||||
|
|
||||||
class Service(BASE, ManilaBase):
|
class Service(BASE, ManilaBase):
|
||||||
"""Represents a running service on a host."""
|
"""Represents a running service on a host."""
|
||||||
|
40
manila/db/sqlalchemy/query.py
Normal file
40
manila/db/sqlalchemy/query.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# Copyright 2015 Mirantis Inc.
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from oslo_db.sqlalchemy import orm
|
||||||
|
import sqlalchemy
|
||||||
|
|
||||||
|
from manila.common import constants
|
||||||
|
|
||||||
|
|
||||||
|
class Query(orm.Query):
|
||||||
|
def soft_delete(self, synchronize_session='evaluate', update_status=False,
|
||||||
|
status_field_name='status'):
|
||||||
|
if update_status:
|
||||||
|
setattr(self, status_field_name, constants.STATUS_DELETED)
|
||||||
|
|
||||||
|
return super(Query, self).soft_delete(synchronize_session)
|
||||||
|
|
||||||
|
|
||||||
|
def get_maker(engine, autocommit=True, expire_on_commit=False):
|
||||||
|
"""Return a SQLAlchemy sessionmaker using the given engine."""
|
||||||
|
return sqlalchemy.orm.sessionmaker(bind=engine,
|
||||||
|
class_=orm.Session,
|
||||||
|
autocommit=autocommit,
|
||||||
|
expire_on_commit=expire_on_commit,
|
||||||
|
query_cls=Query)
|
||||||
|
|
||||||
|
# NOTE(uglide): Monkey patch oslo_db get_maker() function to use custom Query
|
||||||
|
orm.get_maker = get_maker
|
@ -21,6 +21,7 @@ import six
|
|||||||
|
|
||||||
from manila import context
|
from manila import context
|
||||||
from manila.db.sqlalchemy import api
|
from manila.db.sqlalchemy import api
|
||||||
|
from manila import exception
|
||||||
from manila import test
|
from manila import test
|
||||||
|
|
||||||
|
|
||||||
@ -187,3 +188,16 @@ class SQLAlchemyAPIShareTestCase(test.TestCase):
|
|||||||
self.ctxt, test_host, test_id)
|
self.ctxt, test_host, test_id)
|
||||||
|
|
||||||
self.assertEqual({}, actual_result)
|
self.assertEqual({}, actual_result)
|
||||||
|
|
||||||
|
def test_custom_query(self):
|
||||||
|
share = api.share_create(self.ctxt, {'host': 'foobar'})
|
||||||
|
test_access_values = {
|
||||||
|
'share_id': share['id'],
|
||||||
|
'access_type': 'ip',
|
||||||
|
'access_to': 'fake',
|
||||||
|
}
|
||||||
|
share_access = api.share_access_create(self.ctxt, test_access_values)
|
||||||
|
|
||||||
|
api.share_access_delete(self.ctxt, share_access.id)
|
||||||
|
self.assertRaises(exception.NotFound, api.share_access_get,
|
||||||
|
self.ctxt, share_access.id)
|
||||||
|
Loading…
Reference in New Issue
Block a user