def wrapper(*args, **kwargs): arg_spec = inspect.getargspec(f).args # Ensure that we have the exact number of parameters that the # function expects. This handles URLs like # /v2/zones/<UUID - valid or invalid>/invalid # get, patch and delete return a 404, but Pecan returns a 405 # for a POST at the same URL if (len(arg_spec) != len(args)): raise exceptions.NotFound() # Ensure that we have non-empty parameters in the cases where we # have sub controllers - i.e. controllers at the 2nd level # This is for URLs like /v2/zones/nameservers # Ideally Pecan should be handling these cases, but until then # we handle those cases here. if (len(args) <= len(check)): raise exceptions.NotFound() for name in check: pos = arg_spec.index(name) if not is_uuid_like(args[pos]): msg = 'Invalid UUID %s: %s' % (name, args[pos]) raise exceptions.InvalidUUID(msg) return f(*args, **kwargs)
def _find_customr(self, model, context, criterion, one=False, marker=None, limit=None, sort_key=None, sort_dir=None): """ Base "finder" method Used to abstract these details from all the _find_*() methods. """ # First up, create a query and apply the various filters query = self.session.query(model) query = self._apply_criterion(model, query, criterion) query = self._apply_deleted_criteria(context, model, query) query = self._apply_fetch_record(context, model, query) if one: # If we're asked to return exactly one record, but multiple or # none match, raise a NotFound try: return query.one() except (exc.NoResultFound, exc.MultipleResultsFound): raise exceptions.NotFound() else: # If marker is not none and basestring we query it. # Otherwise, return all matching records if marker is not None: try: marker = self._find(model, context, {'id': marker}, one=True) except exceptions.NotFound: raise exceptions.MarkerNotFound( 'Marker %s could not be found' % marker) # Malformed UUIDs return StatementError except sqlalchemy_exc.StatementError as statement_error: raise exceptions.InvalidMarker(statement_error.message) sort_key = sort_key or 'created_at' sort_dir = sort_dir or 'asc' try: query = paginate_query(query, model, limit, [sort_key, 'id', 'created_at'], marker=marker, sort_dir=sort_dir) return query.all() except InvalidSortKey as sort_key_error: raise exceptions.InvalidSortKey(sort_key_error.message) # Any ValueErrors are propagated back to the user as is. # Limits, sort_dir and sort_key are checked at the API layer. # If however central or storage is called directly, invalid values # show up as ValueError except ValueError as value_error: raise exceptions.ValueError(value_error.message)
def _find(self, model, context, criterion, one=False): """ Base "finder" method Used to abstract these details from all the _find_*() methods. """ # First up, create a query and apply the various filters query = self.session.query(model) query = self._apply_criterion(model, query, criterion) query = self._apply_deleted_criteria(context, model, query) if one: # If we're asked to return exactly one record, but multiple or # none match, raise a NotFound try: return query.one() except (exc.NoResultFound, exc.MultipleResultsFound): raise exceptions.NotFound() else: # Othwewise, return all matching records return query.all()
def not_found(self): raise exceptions.NotFound('resource not found')