def update_registered_limits(self, registered_limits): try: with sql.session_for_write() as session: for registered_limit in registered_limits: ref = self._get_registered_limit(session, registered_limit['id']) if not ref.region_id: self._check_referenced_limit_without_region(ref) old_dict = ref.to_dict() old_dict.update(registered_limit) new_registered_limit = RegisteredLimitModel.from_dict( old_dict) for attr in RegisteredLimitModel.attributes: if attr != 'id': setattr(ref, attr, getattr(new_registered_limit, attr)) except db_exception.DBReferenceError as e: try: reg_id = e.inner_exception.params['registered_limit_id'] except (TypeError, KeyError): # TODO(wxy): For SQLite, the registered_limit_id is not # contained in the error message. We should find a way to # handle it, maybe to improve the message in oslo.db. error_message = _("Unable to update the registered limits " "because there are project limits " "associated with it.") raise exception.RegisteredLimitError(message=error_message) raise exception.RegisteredLimitError(id=reg_id)
def delete_registered_limit(self, registered_limit_id): try: with sql.session_for_write() as session: ref = self._get_registered_limit(session, registered_limit_id) self._check_referenced_limit_reference(ref) session.delete(ref) except db_exception.DBReferenceError: raise exception.RegisteredLimitError(id=registered_limit_id)
def _check_referenced_limit_reference(self, registered_limit): # When updating or deleting a registered limit, we should ensure there # is no reference limit. with sql.session_for_read() as session: limits = session.query(LimitModel).filter_by( registered_limit_id=registered_limit['id']) if limits.all(): raise exception.RegisteredLimitError(id=registered_limit.id)
def _check_referenced_limit_without_region(self, registered_limit): hints = driver_hints.Hints() hints.add_filter('service_id', registered_limit.service_id) hints.add_filter('resource_name', registered_limit.resource_name) hints.add_filter('region_id', None) with sql.session_for_read() as session: limits = session.query(LimitModel) limits = sql.filter_limit_query(LimitModel, limits, hints) if limits.all(): raise exception.RegisteredLimitError(id=registered_limit.id)
def update_registered_limit(self, registered_limit_id, registered_limit): try: with sql.session_for_write() as session: ref = self._get_registered_limit(session, registered_limit_id) if not ref.region_id: self._check_referenced_limit_without_region(ref) old_dict = ref.to_dict() old_dict.update(registered_limit) new_registered_limit = RegisteredLimitModel.from_dict(old_dict) for attr in registered_limit: if attr != 'id': setattr(ref, attr, getattr(new_registered_limit, attr)) return ref.to_dict() except db_exception.DBReferenceError: raise exception.RegisteredLimitError(id=registered_limit_id)
def update_registered_limit(self, registered_limit_id, registered_limit): try: with sql.session_for_write() as session: ref = self._get_registered_limit(session, registered_limit_id) self._check_referenced_limit_reference(ref) old_dict = ref.to_dict() old_dict.update(registered_limit) if (registered_limit.get('service_id') or 'region_id' in registered_limit or registered_limit.get('resource_name')): self._check_unified_limit_unique(old_dict) new_registered_limit = RegisteredLimitModel.from_dict(old_dict) for attr in registered_limit: if attr != 'id': setattr(ref, attr, getattr(new_registered_limit, attr)) return ref.to_dict() except db_exception.DBReferenceError: raise exception.RegisteredLimitError(id=registered_limit_id)