def _prepare_query(self, column_names=None, ordered_by_sources=True) -> RPSLDatabaseQuery: """Prepare an RPSLDatabaseQuery by applying relevant sources/class filters.""" query = RPSLDatabaseQuery(column_names, ordered_by_sources) if self.sources: query.sources(self.sources) if self.object_class_filter: query.object_classes(self.object_class_filter) if self.rpki_invalid_filter_enabled: query.rpki_status([RPKIStatus.not_found, RPKIStatus.valid]) if self.out_scope_filter_enabled: query.scopefilter_status([ScopeFilterStatus.in_scope]) self.object_class_filter = [] return query
def _prepare_query(self, column_names=None, ordered_by_sources=True) -> RPSLDatabaseQuery: """Prepare an RPSLDatabaseQuery by applying relevant sources/class filters.""" query = RPSLDatabaseQuery(column_names, ordered_by_sources) if self.sources and self.sources != self.all_valid_sources: query.sources(self.sources) else: default = list(get_setting('sources_default', [])) if default: query.sources(list(default)) if self.object_classes: query.object_classes(self.object_classes) if self.rpki_invalid_filter_enabled: query.rpki_status([RPKIStatus.not_found, RPKIStatus.valid]) return query
def resolve_rpsl_objects(_, info: GraphQLResolveInfo, **kwargs): """ Resolve a `rpslObjects` query. This query has a considerable number of parameters, each of which is applied to an RPSL database query. """ low_specificity_kwargs = { 'object_class', 'rpki_status', 'scope_filter_status', 'sources', 'sql_trace' } # A query is sufficiently specific if it has other fields than listed above, # except that rpki_status is sufficient if it is exclusively selecting on # valid or invalid. low_specificity = all([ not (set(kwargs.keys()) - low_specificity_kwargs), kwargs.get('rpki_status', []) not in [[RPKIStatus.valid], [RPKIStatus.invalid]], ]) if low_specificity: raise ValueError('Your query must be more specific.') if kwargs.get('sql_trace'): info.context['sql_trace'] = True query = RPSLDatabaseQuery( column_names=_columns_for_graphql_selection(info), ordered_by_sources=False, enable_ordering=False) if 'record_limit' in kwargs: query.limit(kwargs['record_limit']) if 'rpsl_pk' in kwargs: query.rpsl_pks(kwargs['rpsl_pk']) if 'object_class' in kwargs: query.object_classes(kwargs['object_class']) if 'asn' in kwargs: query.asns_first(kwargs['asn']) if 'text_search' in kwargs: query.text_search(kwargs['text_search']) if 'rpki_status' in kwargs: query.rpki_status(kwargs['rpki_status']) else: query.rpki_status([RPKIStatus.not_found, RPKIStatus.valid]) if 'scope_filter_status' in kwargs: query.scopefilter_status(kwargs['scope_filter_status']) else: query.scopefilter_status([ScopeFilterStatus.in_scope]) all_valid_sources = set(get_setting('sources', {}).keys()) if get_setting('rpki.roa_source'): all_valid_sources.add(RPKI_IRR_PSEUDO_SOURCE) sources_default = set(get_setting('sources_default', [])) if 'sources' in kwargs: query.sources(kwargs['sources']) elif sources_default and sources_default != all_valid_sources: query.sources(list(sources_default)) # All other parameters are generic lookup fields, like `members` for attr, value in kwargs.items(): attr = attr.replace('_', '-') if attr in lookup_fields: query.lookup_attrs_in([attr], value) ip_filters = [ 'ip_exact', 'ip_less_specific', 'ip_more_specific', 'ip_less_specific_one_level', 'ip_any' ] for ip_filter in ip_filters: if ip_filter in kwargs: getattr(query, ip_filter)(IP(kwargs[ip_filter])) return _rpsl_db_query_to_graphql_out(query, info)