diff options
author | Zuul <zuul@review.opendev.org> | 2023-05-09 16:45:52 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2023-05-09 16:45:52 +0000 |
commit | 2f2f98dd100fc462efcbe6e2aa8afdc698569936 (patch) | |
tree | 06af1558c481235b534431b7c65aa1b50631cd7d | |
parent | b01b451ebaeb249c3303d3ecab4a3d5705215a7a (diff) | |
parent | e9f2c711e9fc6004c91680504f0f68ceababffb0 (diff) | |
download | cinder-2f2f98dd100fc462efcbe6e2aa8afdc698569936.tar.gz |
Merge "db: Fix up some API signatures, other style issues"
-rw-r--r-- | cinder/api/v3/messages.py | 2 | ||||
-rw-r--r-- | cinder/db/api.py | 132 | ||||
-rw-r--r-- | cinder/db/sqlalchemy/api.py | 527 |
3 files changed, 373 insertions, 288 deletions
diff --git a/cinder/api/v3/messages.py b/cinder/api/v3/messages.py index 45986d53c..b71f70ca5 100644 --- a/cinder/api/v3/messages.py +++ b/cinder/api/v3/messages.py @@ -70,7 +70,7 @@ class MessagesController(wsgi.Controller): # Not found exception will be handled at the wsgi level message = self.message_api.get(context, id) context.authorize(policy.DELETE_POLICY, target_obj=message) - self.message_api.delete(context, message) + self.message_api.delete(context, id) return webob.Response(status_int=HTTPStatus.NO_CONTENT) diff --git a/cinder/db/api.py b/cinder/db/api.py index 03b0ab33b..a8ac3df65 100644 --- a/cinder/db/api.py +++ b/cinder/db/api.py @@ -25,15 +25,12 @@ interface. Currently, many of these objects are sqlalchemy objects that implement a dictionary interface. However, a future goal is to have all of these objects be simple dictionaries. - **Related Flags** :connection: string specifying the sqlalchemy connection to use, like: - `sqlite:///var/lib/cinder/cinder.sqlite`. - + `sqlite:///var/lib/cinder/cinder.sqlite`. :enable_new_services: when adding a new service to the database, is it in the - pool of available hardware (Default: True) - + pool of available hardware (Default: True) """ from oslo_config import cfg @@ -97,18 +94,6 @@ def dispose_engine(): ################### -def resource_exists(context, model, resource_id): - return IMPL.resource_exists(context, model, resource_id) - - -def get_model_for_versioned_object(versioned_object): - return IMPL.get_model_for_versioned_object(versioned_object) - - -def get_by_id(context, model, id, *args, **kwargs): - return IMPL.get_by_id(context, model, id, *args, **kwargs) - - class Condition(object): """Class for normal condition values for conditional_update.""" def __init__(self, value, field=None): @@ -160,6 +145,24 @@ class Case(object): self.else_ = else_ +################### + + +def resource_exists(context, model, resource_id): + return IMPL.resource_exists(context, model, resource_id) + + +def get_model_for_versioned_object(versioned_object): + return IMPL.get_model_for_versioned_object(versioned_object) + + +def get_by_id(context, model, id, *args, **kwargs): + return IMPL.get_by_id(context, model, id, *args, **kwargs) + + +################### + + def is_orm_value(obj): """Check if object is an ORM field.""" return IMPL.is_orm_value(obj) @@ -170,7 +173,7 @@ def conditional_update( model, values, expected_values, - filters=(), + filters=None, include_deleted='no', project_only=False, order=None, @@ -363,20 +366,20 @@ def cluster_create(context, values): return IMPL.cluster_create(context, values) -def cluster_update(context, id, values): +def cluster_update(context, cluster_id, values): """Set the given properties on an cluster and update it. Raises ClusterNotFound if cluster does not exist. """ - return IMPL.cluster_update(context, id, values) + return IMPL.cluster_update(context, cluster_id, values) -def cluster_destroy(context, id): +def cluster_destroy(context, cluster_id): """Destroy the cluster or raise if it does not exist or has hosts. :raise ClusterNotFound: If cluster doesn't exist. """ - return IMPL.cluster_destroy(context, id) + return IMPL.cluster_destroy(context, cluster_id) ############### @@ -387,11 +390,25 @@ def volume_attach(context, values): return IMPL.volume_attach(context, values) -def volume_attached(context, volume_id, instance_id, host_name, mountpoint, - attach_mode='rw', mark_attached=True): +def volume_attached( + context, + attachment_id, + instance_uuid, + host_name, + mountpoint, + attach_mode='rw', + mark_attached=True, +): """Ensure that a volume is set as attached.""" - return IMPL.volume_attached(context, volume_id, instance_id, host_name, - mountpoint, attach_mode, mark_attached) + return IMPL.volume_attached( + context, + attachment_id, + instance_uuid, + host_name, + mountpoint, + attach_mode, + mark_attached, + ) def volume_create(context, values): @@ -623,9 +640,9 @@ def snapshot_get_all_by_host(context, host, filters=None): return IMPL.snapshot_get_all_by_host(context, host, filters) -def snapshot_get_all_for_cgsnapshot(context, project_id): +def snapshot_get_all_for_cgsnapshot(context, cgsnapshot_id): """Get all snapshots belonging to a cgsnapshot.""" - return IMPL.snapshot_get_all_for_cgsnapshot(context, project_id) + return IMPL.snapshot_get_all_for_cgsnapshot(context, cgsnapshot_id) def snapshot_get_all_for_group_snapshot(context, group_snapshot_id): @@ -833,9 +850,9 @@ def volume_type_qos_specs_get(context, type_id): return IMPL.volume_type_qos_specs_get(context, type_id) -def volume_type_destroy(context, id): +def volume_type_destroy(context, type_id): """Delete a volume type.""" - return IMPL.volume_type_destroy(context, id) + return IMPL.volume_type_destroy(context, type_id) def volume_get_all_active_by_window(context, begin, end=None, project_id=None): @@ -951,9 +968,9 @@ def group_types_get_by_name_or_id(context, group_type_list): return IMPL.group_types_get_by_name_or_id(context, group_type_list) -def group_type_destroy(context, id): +def group_type_destroy(context, type_id): """Delete a group type.""" - return IMPL.group_type_destroy(context, id) + return IMPL.group_type_destroy(context, type_id) def group_type_access_get_all(context, type_id): @@ -989,17 +1006,17 @@ def volume_type_extra_specs_delete(context, volume_type_id, key): return IMPL.volume_type_extra_specs_delete(context, volume_type_id, key) -def volume_type_extra_specs_update_or_create(context, - volume_type_id, - extra_specs): +def volume_type_extra_specs_update_or_create( + context, volume_type_id, extra_specs, +): """Create or update volume type extra specs. This adds or modifies the key/value pairs specified in the extra specs dict argument. """ - return IMPL.volume_type_extra_specs_update_or_create(context, - volume_type_id, - extra_specs) + return IMPL.volume_type_extra_specs_update_or_create( + context, volume_type_id, extra_specs, + ) ################### @@ -1039,14 +1056,13 @@ def volume_type_encryption_delete(context, volume_type_id): return IMPL.volume_type_encryption_delete(context, volume_type_id) -def volume_type_encryption_create(context, volume_type_id, encryption_specs): +def volume_type_encryption_create(context, volume_type_id, values): return IMPL.volume_type_encryption_create(context, volume_type_id, - encryption_specs) + values) -def volume_type_encryption_update(context, volume_type_id, encryption_specs): - return IMPL.volume_type_encryption_update(context, volume_type_id, - encryption_specs) +def volume_type_encryption_update(context, volume_type_id, values): + return IMPL.volume_type_encryption_update(context, volume_type_id, values) def volume_type_encryption_volume_get(context, volume_type_id): @@ -1065,9 +1081,9 @@ def qos_specs_create(context, values): return IMPL.qos_specs_create(context, values) -def qos_specs_get(context, qos_specs_id): +def qos_specs_get(context, qos_specs_id, inactive=False): """Get all specification for a given qos_specs.""" - return IMPL.qos_specs_get(context, qos_specs_id) + return IMPL.qos_specs_get(context, qos_specs_id, inactive) def qos_specs_get_all(context, filters=None, marker=None, limit=None, @@ -1078,9 +1094,9 @@ def qos_specs_get_all(context, filters=None, marker=None, limit=None, sort_keys=sort_keys, sort_dirs=sort_dirs) -def qos_specs_get_by_name(context, name): +def qos_specs_get_by_name(context, name, inactive=False): """Get all specification for a given qos_specs.""" - return IMPL.qos_specs_get_by_name(context, name) + return IMPL.qos_specs_get_by_name(context, name, inactive) def qos_specs_associations_get(context, qos_specs_id): @@ -1113,13 +1129,13 @@ def qos_specs_item_delete(context, qos_specs_id, key): return IMPL.qos_specs_item_delete(context, qos_specs_id, key) -def qos_specs_update(context, qos_specs_id, specs): +def qos_specs_update(context, qos_specs_id, values): """Update qos specs. This adds or modifies the key/value pairs specified in the specs dict argument for a given qos_specs. """ - return IMPL.qos_specs_update(context, qos_specs_id, specs) + return IMPL.qos_specs_update(context, qos_specs_id, values) ################### @@ -1268,9 +1284,9 @@ def quota_class_update(context, class_name, resource, limit): return IMPL.quota_class_update(context, class_name, resource, limit) -def quota_class_update_resource(context, resource, new_resource): +def quota_class_update_resource(context, old_res, new_res): """Update resource name in quota_class.""" - return IMPL.quota_class_update_resource(context, resource, new_resource) + return IMPL.quota_class_update_resource(context, old_res, new_res) def quota_class_destroy(context, class_name, resource): @@ -1580,9 +1596,19 @@ def group_get_all(context, filters=None, marker=None, limit=None, sort_dirs=sort_dirs) -def group_create(context, values, group_snapshot_id=None, group_id=None): +def group_create( + context, + values, + group_snapshot_id=None, + source_group_id=None, +): """Create a group from the values dictionary.""" - return IMPL.group_create(context, values, group_snapshot_id, group_id) + return IMPL.group_create( + context, + values, + group_snapshot_id, + source_group_id, + ) def group_get_all_by_project(context, project_id, filters=None, diff --git a/cinder/db/sqlalchemy/api.py b/cinder/db/sqlalchemy/api.py index c59dea44c..7a69ce48e 100644 --- a/cinder/db/sqlalchemy/api.py +++ b/cinder/db/sqlalchemy/api.py @@ -16,7 +16,23 @@ # License for the specific language governing permissions and limitations # under the License. -"""Implementation of SQLAlchemy backend.""" +"""Defines interface for DB access. + +Functions in this module are imported into the cinder.db namespace. Call these +functions from cinder.db namespace, not the cinder.db.api namespace. + +All functions in this module return objects that implement a dictionary-like +interface. Currently, many of these objects are sqlalchemy objects that +implement a dictionary interface. However, a future goal is to have all of +these objects be simple dictionaries. + +**Related Flags** + +:connection: string specifying the sqlalchemy connection to use, like: + `sqlite:///var/lib/cinder/cinder.sqlite`. +:enable_new_services: when adding a new service to the database, is it in the + pool of available hardware (Default: True) +""" import collections from collections import abc @@ -183,6 +199,9 @@ def require_context(f): return wrapper +################### + + @require_context @main_context_manager.reader def resource_exists(context, model, resource_id): @@ -318,131 +337,6 @@ def model_query(context, model, *args, **kwargs): return query -def _sync_volumes( - context, - project_id, - volume_type_id=None, - volume_type_name=None, -): - volumes, _ = _volume_data_get_for_project( - context, - project_id, - volume_type_id=volume_type_id, - ) - key = 'volumes' - if volume_type_name: - key += '_' + volume_type_name - return {key: volumes} - - -def _sync_snapshots( - context, - project_id, - volume_type_id=None, - volume_type_name=None, -): - snapshots, _ = _snapshot_data_get_for_project( - context, - project_id, - volume_type_id=volume_type_id, - ) - key = 'snapshots' - if volume_type_name: - key += '_' + volume_type_name - return {key: snapshots} - - -def _sync_backups( - context, - project_id, - volume_type_id=None, - volume_type_name=None, -): - backups, _ = _backup_data_get_for_project( - context, - project_id, - volume_type_id=volume_type_id, - ) - key = 'backups' - return {key: backups} - - -def _sync_gigabytes( - context, - project_id, - volume_type_id=None, - volume_type_name=None, -): - _, vol_gigs = _volume_data_get_for_project( - context, - project_id, - volume_type_id=volume_type_id, - ) - - key = 'gigabytes' - if volume_type_name: - key += '_' + volume_type_name - - if CONF.no_snapshot_gb_quota: - return {key: vol_gigs} - - _, snap_gigs = _snapshot_data_get_for_project( - context, - project_id, - volume_type_id=volume_type_id, - ) - - return {key: vol_gigs + snap_gigs} - - -def _sync_consistencygroups( - context, - project_id, - volume_type_id=None, - volume_type_name=None, -): - _, groups = _consistencygroup_data_get_for_project(context, project_id) - key = 'consistencygroups' - return {key: groups} - - -def _sync_backup_gigabytes( - context, - project_id, - volume_type_id=None, - volume_type_name=None, -): - key = 'backup_gigabytes' - _, backup_gigs = _backup_data_get_for_project( - context, - project_id, - volume_type_id=volume_type_id, - ) - return {key: backup_gigs} - - -def _sync_groups( - context, - project_id, - volume_type_id=None, - volume_type_name=None, -): - _, groups = _group_data_get_for_project(context, project_id) - key = 'groups' - return {key: groups} - - -QUOTA_SYNC_FUNCTIONS = { - '_sync_volumes': _sync_volumes, - '_sync_snapshots': _sync_snapshots, - '_sync_gigabytes': _sync_gigabytes, - '_sync_consistencygroups': _sync_consistencygroups, - '_sync_backups': _sync_backups, - '_sync_backup_gigabytes': _sync_backup_gigabytes, - '_sync_groups': _sync_groups, -} - - ################### @@ -697,6 +591,134 @@ def conditional_update( ################### +def _sync_volumes( + context, + project_id, + volume_type_id=None, + volume_type_name=None, +): + volumes, _ = _volume_data_get_for_project( + context, + project_id, + volume_type_id=volume_type_id, + ) + key = 'volumes' + if volume_type_name: + key += '_' + volume_type_name + return {key: volumes} + + +def _sync_snapshots( + context, + project_id, + volume_type_id=None, + volume_type_name=None, +): + snapshots, _ = _snapshot_data_get_for_project( + context, + project_id, + volume_type_id=volume_type_id, + ) + key = 'snapshots' + if volume_type_name: + key += '_' + volume_type_name + return {key: snapshots} + + +def _sync_backups( + context, + project_id, + volume_type_id=None, + volume_type_name=None, +): + backups, _ = _backup_data_get_for_project( + context, + project_id, + volume_type_id=volume_type_id, + ) + key = 'backups' + return {key: backups} + + +def _sync_gigabytes( + context, + project_id, + volume_type_id=None, + volume_type_name=None, +): + _, vol_gigs = _volume_data_get_for_project( + context, + project_id, + volume_type_id=volume_type_id, + ) + + key = 'gigabytes' + if volume_type_name: + key += '_' + volume_type_name + + if CONF.no_snapshot_gb_quota: + return {key: vol_gigs} + + _, snap_gigs = _snapshot_data_get_for_project( + context, + project_id, + volume_type_id=volume_type_id, + ) + + return {key: vol_gigs + snap_gigs} + + +def _sync_consistencygroups( + context, + project_id, + volume_type_id=None, + volume_type_name=None, +): + _, groups = _consistencygroup_data_get_for_project(context, project_id) + key = 'consistencygroups' + return {key: groups} + + +def _sync_backup_gigabytes( + context, + project_id, + volume_type_id=None, + volume_type_name=None, +): + key = 'backup_gigabytes' + _, backup_gigs = _backup_data_get_for_project( + context, + project_id, + volume_type_id=volume_type_id, + ) + return {key: backup_gigs} + + +def _sync_groups( + context, + project_id, + volume_type_id=None, + volume_type_name=None, +): + _, groups = _group_data_get_for_project(context, project_id) + key = 'groups' + return {key: groups} + + +QUOTA_SYNC_FUNCTIONS = { + '_sync_volumes': _sync_volumes, + '_sync_snapshots': _sync_snapshots, + '_sync_gigabytes': _sync_gigabytes, + '_sync_consistencygroups': _sync_consistencygroups, + '_sync_backups': _sync_backups, + '_sync_backup_gigabytes': _sync_backup_gigabytes, + '_sync_groups': _sync_groups, +} + + +################### + + def _clean_filters(filters): return {k: v for k, v in filters.items() if v is not None} @@ -1128,22 +1150,22 @@ def cluster_create(context, values): @require_admin_context @oslo_db_api.wrap_db_retry(max_retries=5, retry_on_deadlock=True) @main_context_manager.writer -def cluster_update(context, id, values): +def cluster_update(context, cluster_id, values): """Set the given properties on an cluster and update it. Raises ClusterNotFound if cluster does not exist. """ - query = _cluster_query(context, id=id) + query = _cluster_query(context, id=cluster_id) result = query.update(values) if not result: - raise exception.ClusterNotFound(id=id) + raise exception.ClusterNotFound(id=cluster_id) @require_admin_context @main_context_manager.writer -def cluster_destroy(context, id): +def cluster_destroy(context, cluster_id): """Destroy the cluster or raise if it does not exist or has hosts.""" - query = _cluster_query(context, id=id) + query = _cluster_query(context, id=cluster_id) query = query.filter(models.Cluster.num_hosts == 0) # If the update doesn't succeed we don't know if it's because the # cluster doesn't exist or because it has hosts. @@ -1154,9 +1176,9 @@ def cluster_destroy(context, id): if not result: # This will fail if the cluster doesn't exist raising the right # exception - cluster_get(context, id=id) + cluster_get(context, id=cluster_id) # If it doesn't fail, then the problem is that there are hosts - raise exception.ClusterHasHosts(id=id) + raise exception.ClusterHasHosts(id=cluster_id) ################### @@ -1863,6 +1885,8 @@ def quota_destroy_by_project(context, project_id): quota_destroy_all_by_project(context, project_id, only_quotas=True) +# TODO(stephenfin): No one is using this except 'quota_destroy_by_project' +# above, so the only_quotas=False path could be removed. @require_context @oslo_db_api.wrap_db_retry(max_retries=5, retry_on_deadlock=True) @main_context_manager.writer @@ -1939,8 +1963,8 @@ def volume_attached( instance_uuid, host_name, mountpoint, - attach_mode, - mark_attached, + attach_mode='rw', + mark_attached=True, ): """This method updates a volume attachment entry. @@ -2521,9 +2545,10 @@ def volume_attachment_get_all_by_volume_id(context, volume_id): return result +# FIXME(jdg): Not using filters @require_context @main_context_manager.reader -def volume_attachment_get_all_by_host(context, host): +def volume_attachment_get_all_by_host(context, host, filters=None): result = ( model_query(context, models.VolumeAttachment) .filter_by(attached_host=host) @@ -2544,9 +2569,14 @@ def volume_attachment_get(context, attachment_id): return _attachment_get(context, attachment_id) +# FIXME(jdg): Not using filters @require_context @main_context_manager.reader -def volume_attachment_get_all_by_instance_uuid(context, instance_uuid): +def volume_attachment_get_all_by_instance_uuid( + context, + instance_uuid, + filters=None, +): """Fetch all attachment records associated with the specified instance.""" result = ( model_query(context, models.VolumeAttachment) @@ -3576,7 +3606,12 @@ def volume_metadata_get(context, volume_id): @require_volume_exists @oslo_db_api.wrap_db_retry(max_retries=5, retry_on_deadlock=True) @main_context_manager.writer -def volume_metadata_delete(context, volume_id, key, meta_type): +def volume_metadata_delete( + context, + volume_id, + key, + meta_type=common.METADATA_TYPES.user, +): if meta_type == common.METADATA_TYPES.user: query = _volume_user_metadata_get_query(context, volume_id).filter_by( key=key @@ -3614,7 +3649,13 @@ def volume_metadata_delete(context, volume_id, key, meta_type): @handle_db_data_error @oslo_db_api.wrap_db_retry(max_retries=5, retry_on_deadlock=True) @main_context_manager.writer -def volume_metadata_update(context, volume_id, metadata, delete, meta_type): +def volume_metadata_update( + context, + volume_id, + metadata, + delete, + meta_type=common.METADATA_TYPES.user, +): if meta_type == common.METADATA_TYPES.user: return _volume_user_metadata_update( context, volume_id, metadata, delete @@ -4795,7 +4836,15 @@ def _group_type_get(context, id, inactive=False, expected_fields=None): @require_context @main_context_manager.reader def volume_type_get(context, id, inactive=False, expected_fields=None): - """Return a dict describing specific volume_type.""" + """Get volume type by id. + + :param context: context to query under + :param id: Volume type id to get. + :param inactive: Consider inactive volume types when searching + :param expected_fields: Return those additional fields. + Supported fields are: projects. + :returns: volume type + """ return _volume_type_get( context, id, inactive=inactive, expected_fields=expected_fields @@ -5035,15 +5084,17 @@ def volume_type_qos_specs_get(context, type_id): @require_admin_context @oslo_db_api.wrap_db_retry(max_retries=5, retry_on_deadlock=True) @main_context_manager.writer -def volume_type_destroy(context, id): +def volume_type_destroy(context, type_id): utcnow = timeutils.utcnow() vol_types = volume_type_get_all(context) if len(vol_types) <= 1: - raise exception.VolumeTypeDeletionError(volume_type_id=id) - _volume_type_get(context, id) + raise exception.VolumeTypeDeletionError(volume_type_id=type_id) + _volume_type_get(context, type_id) results = ( - model_query(context, models.Volume).filter_by(volume_type_id=id).all() + model_query(context, models.Volume) + .filter_by(volume_type_id=type_id) + .all() ) group_count = ( @@ -5052,7 +5103,7 @@ def volume_type_destroy(context, id): models.GroupVolumeTypeMapping, read_deleted="no", ) - .filter_by(volume_type_id=id) + .filter_by(volume_type_id=type_id) .count() ) cg_count = ( @@ -5060,14 +5111,14 @@ def volume_type_destroy(context, id): context, models.ConsistencyGroup, ) - .filter(models.ConsistencyGroup.volume_type_id.contains(id)) + .filter(models.ConsistencyGroup.volume_type_id.contains(type_id)) .count() ) if results or group_count or cg_count: - LOG.error('VolumeType %s deletion failed, VolumeType in use.', id) - raise exception.VolumeTypeInUse(volume_type_id=id) + LOG.error('VolumeType %s deletion failed, VolumeType in use.', type_id) + raise exception.VolumeTypeInUse(volume_type_id=type_id) - query = model_query(context, models.VolumeType).filter_by(id=id) + query = model_query(context, models.VolumeType).filter_by(id=type_id) entity = query.column_descriptions[0]['entity'] updated_values = { 'deleted': True, @@ -5079,7 +5130,7 @@ def volume_type_destroy(context, id): query = model_query( context, models.VolumeTypeExtraSpecs, - ).filter_by(volume_type_id=id) + ).filter_by(volume_type_id=type_id) entity = query.column_descriptions[0]['entity'] query.update( { @@ -5090,7 +5141,7 @@ def volume_type_destroy(context, id): ) query = model_query(context, models.Encryption).filter_by( - volume_type_id=id + volume_type_id=type_id ) entity = query.column_descriptions[0]['entity'] query.update( @@ -5103,7 +5154,7 @@ def volume_type_destroy(context, id): model_query( context, models.VolumeTypeProjects, read_deleted="int_no" - ).filter_by(volume_type_id=id).soft_delete(synchronize_session=False) + ).filter_by(volume_type_id=type_id).soft_delete(synchronize_session=False) del updated_values['updated_at'] return updated_values @@ -5111,16 +5162,18 @@ def volume_type_destroy(context, id): @require_admin_context @oslo_db_api.wrap_db_retry(max_retries=5, retry_on_deadlock=True) @main_context_manager.writer -def group_type_destroy(context, id): - _group_type_get(context, id) +def group_type_destroy(context, type_id): + _group_type_get(context, type_id) results = ( - model_query(context, models.Group).filter_by(group_type_id=id).all() + model_query(context, models.Group) + .filter_by(group_type_id=type_id) + .all() ) if results: - LOG.error('GroupType %s deletion failed, ' 'GroupType in use.', id) - raise exception.GroupTypeInUse(group_type_id=id) + LOG.error('GroupType %s deletion failed, GroupType in use.', type_id) + raise exception.GroupTypeInUse(group_type_id=type_id) - query = model_query(context, models.GroupType).filter_by(id=id) + query = model_query(context, models.GroupType).filter_by(id=type_id) entity = query.column_descriptions[0]['entity'] query.update( { @@ -5131,7 +5184,7 @@ def group_type_destroy(context, id): ) query = model_query(context, models.GroupTypeSpecs).filter_by( - group_type_id=id + group_type_id=type_id ) entity = query.column_descriptions[0]['entity'] query.update( @@ -5441,9 +5494,13 @@ def _volume_type_extra_specs_get_item(context, volume_type_id, key): @handle_db_data_error @require_context @main_context_manager.writer -def volume_type_extra_specs_update_or_create(context, volume_type_id, specs): +def volume_type_extra_specs_update_or_create( + context, + volume_type_id, + extra_specs, +): spec_ref = None - for key, value in specs.items(): + for key, value in extra_specs.items(): try: spec_ref = _volume_type_extra_specs_get_item( context, @@ -5463,7 +5520,7 @@ def volume_type_extra_specs_update_or_create(context, volume_type_id, specs): ) spec_ref.save(context.session) - return specs + return extra_specs #################### @@ -5524,9 +5581,9 @@ def _group_type_specs_get_item(context, group_type_id, key): @handle_db_data_error @require_context @main_context_manager.writer -def group_type_specs_update_or_create(context, group_type_id, specs): +def group_type_specs_update_or_create(context, group_type_id, group_specs): spec_ref = None - for key, value in specs.items(): + for key, value in group_specs.items(): try: spec_ref = _group_type_specs_get_item(context, group_type_id, key) except exception.GroupTypeSpecsNotFound: @@ -5541,7 +5598,7 @@ def group_type_specs_update_or_create(context, group_type_id, specs): ) spec_ref.save(context.session) - return specs + return group_specs #################### @@ -5915,18 +5972,18 @@ def _qos_specs_get_item(context, qos_specs_id, key): @require_admin_context @require_qos_specs_exists @main_context_manager.writer -def qos_specs_update(context, qos_specs_id, updates): +def qos_specs_update(context, qos_specs_id, values): """Make updates to an existing qos specs. Perform add, update or delete key/values to a qos specs. """ - specs = updates.get('specs', {}) + specs = values.get('specs', {}) - if 'consumer' in updates: + if 'consumer' in values: # Massage consumer to the right place for DB and copy specs # before updating so we don't modify dict for caller specs = specs.copy() - specs['consumer'] = updates['consumer'] + specs['consumer'] = values['consumer'] spec_ref = None for key in specs.keys(): try: @@ -8254,12 +8311,9 @@ def message_create(context, values): @require_admin_context @main_context_manager.writer -def message_destroy(context, message): +def message_destroy(context, message_id): now = timeutils.utcnow() - query = model_query( - context, - models.Message, - ).filter_by(id=message.get('id')) + query = model_query(context, models.Message).filter_by(id=message_id) entity = query.column_descriptions[0]['entity'] updated_values = { 'deleted': True, @@ -8326,64 +8380,6 @@ def driver_initiator_data_get(context, initiator, namespace): ############################### -PAGINATION_HELPERS = { - models.Volume: (_volume_get_query, _process_volume_filters, _volume_get), - models.Snapshot: (_snaps_get_query, _process_snaps_filters, _snapshot_get), - models.Backup: (_backups_get_query, _process_backups_filters, _backup_get), - models.QualityOfServiceSpecs: ( - _qos_specs_get_query, - _process_qos_specs_filters, - _qos_specs_get, - ), - models.VolumeType: ( - _volume_type_get_query, - _process_volume_types_filters, - _volume_type_get_db_object, - ), - models.ConsistencyGroup: ( - _consistencygroups_get_query, - _process_consistencygroups_filters, - _consistencygroup_get, - ), - models.Message: ( - _messages_get_query, - _process_messages_filters, - _message_get, - ), - models.GroupType: ( - _group_type_get_query, - _process_group_types_filters, - _group_type_get_db_object, - ), - models.Group: (_groups_get_query, _process_groups_filters, _group_get), - models.GroupSnapshot: ( - _group_snapshot_get_query, - _process_group_snapshot_filters, - _group_snapshot_get, - ), - models.VolumeAttachment: ( - _attachment_get_query, - _process_attachment_filters, - _attachment_get, - ), - models.Transfer: ( - _transfer_get_query, - _process_transfer_filters, - _transfer_get, - ), -} - - -CALCULATE_COUNT_HELPERS = { - 'volume': (_volume_get_query, _process_volume_filters), - 'snapshot': (_snaps_get_query, _process_snaps_filters), - 'backup': (_backups_get_query, _process_backups_filters), -} - - -############################### - - @require_context @main_context_manager.writer def image_volume_cache_create( @@ -8550,9 +8546,14 @@ def worker_get(context, **filters): @require_context @main_context_manager.reader -def worker_get_all(context, **filters): +def worker_get_all(context, until=None, db_filters=None, **filters): """Get all workers that match given criteria.""" - query = _worker_query(context, **filters) + query = _worker_query( + context, + until=until, + db_filters=db_filters, + **filters, + ) return query.all() if query else [] @@ -8704,3 +8705,61 @@ def use_quota_online_data_migration( # models.VolumeAdminMetadata.delete_values) # # return total, updated + + +############################### + + +PAGINATION_HELPERS = { + models.Volume: (_volume_get_query, _process_volume_filters, _volume_get), + models.Snapshot: (_snaps_get_query, _process_snaps_filters, _snapshot_get), + models.Backup: (_backups_get_query, _process_backups_filters, _backup_get), + models.QualityOfServiceSpecs: ( + _qos_specs_get_query, + _process_qos_specs_filters, + _qos_specs_get, + ), + models.VolumeType: ( + _volume_type_get_query, + _process_volume_types_filters, + _volume_type_get_db_object, + ), + models.ConsistencyGroup: ( + _consistencygroups_get_query, + _process_consistencygroups_filters, + _consistencygroup_get, + ), + models.Message: ( + _messages_get_query, + _process_messages_filters, + _message_get, + ), + models.GroupType: ( + _group_type_get_query, + _process_group_types_filters, + _group_type_get_db_object, + ), + models.Group: (_groups_get_query, _process_groups_filters, _group_get), + models.GroupSnapshot: ( + _group_snapshot_get_query, + _process_group_snapshot_filters, + _group_snapshot_get, + ), + models.VolumeAttachment: ( + _attachment_get_query, + _process_attachment_filters, + _attachment_get, + ), + models.Transfer: ( + _transfer_get_query, + _process_transfer_filters, + _transfer_get, + ), +} + + +CALCULATE_COUNT_HELPERS = { + 'volume': (_volume_get_query, _process_volume_filters), + 'snapshot': (_snaps_get_query, _process_snaps_filters), + 'backup': (_backups_get_query, _process_backups_filters), +} |