From d3fc026b5d1164167ec7e9df3e66d77253cd1faf Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 7 Feb 2024 15:43:29 -0800 Subject: [PATCH] 9856 ipam and tenant schema --- netbox/ipam/graphql/filters.py | 105 ++++++++++++++++++++++++++ netbox/ipam/graphql/schema.py | 121 +++++++++--------------------- netbox/ipam/graphql/types.py | 27 ++++--- netbox/netbox/graphql/schema.py | 11 ++- netbox/tenancy/graphql/filters.py | 45 +++++++++++ netbox/tenancy/graphql/schema.py | 53 +++++-------- netbox/tenancy/graphql/types.py | 18 +++-- 7 files changed, 239 insertions(+), 141 deletions(-) diff --git a/netbox/ipam/graphql/filters.py b/netbox/ipam/graphql/filters.py index e69de29bb..04254cbf0 100644 --- a/netbox/ipam/graphql/filters.py +++ b/netbox/ipam/graphql/filters.py @@ -0,0 +1,105 @@ +import strawberry +import strawberry_django +from strawberry import auto +from ipam import models, filtersets +from netbox.graphql import filters + + +__all__ = ( + 'ASNFilter', + 'ASNRangeFilter', + 'AggregateFilter', + 'FHRPGroupFilter', + 'FHRPGroupAssignmentFilter', + 'IPAddressFilter', + 'IPRangeFilter', + 'PrefixFilter', + 'RIRFilter', + 'RoleFilter', + 'RouteTargetFilter', + 'ServiceFilter', + 'ServiceTemplateFilter', + 'VLANFilter', + 'VLANGroupFilter', + 'VRFFilter', +) + + +@strawberry_django.filter(models.ASN, lookups=True) +class ASNFilter(filtersets.ASNFilterSet): + id: auto + + +@strawberry_django.filter(models.ASNRange, lookups=True) +class ASNRangeFilter(filtersets.ASNRangeFilterSet): + id: auto + + +@strawberry_django.filter(models.Aggregate, lookups=True) +class AggregateFilter(filtersets.AggregateFilterSet): + id: auto + + +@strawberry_django.filter(models.FHRPGroup, lookups=True) +class FHRPGroupFilter(filtersets.FHRPGroupFilterSet): + id: auto + + +@strawberry_django.filter(models.FHRPGroupAssignment, lookups=True) +class FHRPGroupAssignmentFilter(filtersets.FHRPGroupAssignmentFilterSet): + id: auto + + +@strawberry_django.filter(models.IPAddress, lookups=True) +class IPAddressFilter(filtersets.IPAddressFilterSet): + id: auto + + +@strawberry_django.filter(models.IPRange, lookups=True) +class IPRangeFilter(filtersets.IPRangeFilterSet): + id: auto + + +@strawberry_django.filter(models.Prefix, lookups=True) +class PrefixFilter(filtersets.PrefixFilterSet): + id: auto + + +@strawberry_django.filter(models.RIR, lookups=True) +class RIRFilter(filtersets.RIRFilterSet): + id: auto + + +@strawberry_django.filter(models.Role, lookups=True) +class RoleFilter(filtersets.RoleFilterSet): + id: auto + + +@strawberry_django.filter(models.RouteTarget, lookups=True) +class RouteTargetFilter(filtersets.RouteTargetFilterSet): + id: auto + + +@strawberry_django.filter(models.Service, lookups=True) +class ServiceFilter(filtersets.ServiceFilterSet): + id: auto + + +@strawberry_django.filter(models.ServiceTemplate, lookups=True) +class ServiceTemplateFilter(filtersets.ServiceTemplateFilterSet): + id: auto + + +@strawberry_django.filter(models.VLAN, lookups=True) +class VLANFilter(filtersets.VLANFilterSet): + id: auto + + +@strawberry_django.filter(models.VLANGroup, lookups=True) +class VLANGroupFilter(filtersets.VLANGroupFilterSet): + id: auto + + +@strawberry_django.filter(models.VRF, lookups=True) +class VRFFilter(filtersets.VRFFilterSet): + id: auto diff --git a/netbox/ipam/graphql/schema.py b/netbox/ipam/graphql/schema.py index 6627c540e..230520f5d 100644 --- a/netbox/ipam/graphql/schema.py +++ b/netbox/ipam/graphql/schema.py @@ -1,104 +1,57 @@ -import graphene +from typing import List +import strawberry +import strawberry_django from ipam import models -from netbox.graphql.fields import ObjectField, ObjectListField -from utilities.graphql_optimizer import gql_query_optimizer from .types import * -class IPAMQuery(graphene.ObjectType): - asn = ObjectField(ASNType) - asn_list = ObjectListField(ASNType) +@strawberry.type +class IPAMQuery: + asn: ASNType = strawberry_django.field() + asn_list: List[ASNType] = strawberry_django.field() - def resolve_asn_list(root, info, **kwargs): - return gql_query_optimizer(models.ASN.objects.all(), info) + asn_range: ASNRangeType = strawberry_django.field() + asn_range_list: List[ASNRangeType] = strawberry_django.field() - asn_range = ObjectField(ASNRangeType) - asn_range_list = ObjectListField(ASNRangeType) + aggregate: AggregateType = strawberry_django.field() + aggregate_list: List[AggregateType] = strawberry_django.field() - def resolve_asn_range_list(root, info, **kwargs): - return gql_query_optimizer(models.ASNRange.objects.all(), info) + ip_address: IPAddressType = strawberry_django.field() + ip_address_list: List[IPAddressType] = strawberry_django.field() - aggregate = ObjectField(AggregateType) - aggregate_list = ObjectListField(AggregateType) + ip_range: IPRangeType = strawberry_django.field() + ip_range_list: List[IPRangeType] = strawberry_django.field() - def resolve_aggregate_list(root, info, **kwargs): - return gql_query_optimizer(models.Aggregate.objects.all(), info) + prefix: PrefixType = strawberry_django.field() + prefix_list: List[PrefixType] = strawberry_django.field() - ip_address = ObjectField(IPAddressType) - ip_address_list = ObjectListField(IPAddressType) + rir: RIRType = strawberry_django.field() + rir_list: List[RIRType] = strawberry_django.field() - def resolve_ip_address_list(root, info, **kwargs): - return gql_query_optimizer(models.IPAddress.objects.all(), info) + role: RoleType = strawberry_django.field() + role_list: List[RoleType] = strawberry_django.field() - ip_range = ObjectField(IPRangeType) - ip_range_list = ObjectListField(IPRangeType) + route_target: RouteTargetType = strawberry_django.field() + route_target_list: List[RouteTargetType] = strawberry_django.field() - def resolve_ip_range_list(root, info, **kwargs): - return gql_query_optimizer(models.IPRange.objects.all(), info) + service: ServiceType = strawberry_django.field() + service_list: List[ServiceType] = strawberry_django.field() - prefix = ObjectField(PrefixType) - prefix_list = ObjectListField(PrefixType) + service_template: ServiceTemplateType = strawberry_django.field() + service_template_list: List[ServiceTemplateType] = strawberry_django.field() - def resolve_prefix_list(root, info, **kwargs): - return gql_query_optimizer(models.Prefix.objects.all(), info) + fhrp_group: FHRPGroupType = strawberry_django.field() + fhrp_group_list: List[FHRPGroupType] = strawberry_django.field() - rir = ObjectField(RIRType) - rir_list = ObjectListField(RIRType) + fhrp_group_assignment: FHRPGroupAssignmentType = strawberry_django.field() + fhrp_group_assignment_list: List[FHRPGroupAssignmentType] = strawberry_django.field() - def resolve_rir_list(root, info, **kwargs): - return gql_query_optimizer(models.RIR.objects.all(), info) + vlan: VLANType = strawberry_django.field() + vlan_list: List[VLANType] = strawberry_django.field() - role = ObjectField(RoleType) - role_list = ObjectListField(RoleType) + vlan_group: VLANGroupType = strawberry_django.field() + vlan_group_list: List[VLANGroupType] = strawberry_django.field() - def resolve_role_list(root, info, **kwargs): - return gql_query_optimizer(models.Role.objects.all(), info) - - route_target = ObjectField(RouteTargetType) - route_target_list = ObjectListField(RouteTargetType) - - def resolve_route_target_list(root, info, **kwargs): - return gql_query_optimizer(models.RouteTarget.objects.all(), info) - - service = ObjectField(ServiceType) - service_list = ObjectListField(ServiceType) - - def resolve_service_list(root, info, **kwargs): - return gql_query_optimizer(models.Service.objects.all(), info) - - service_template = ObjectField(ServiceTemplateType) - service_template_list = ObjectListField(ServiceTemplateType) - - def resolve_service_template_list(root, info, **kwargs): - return gql_query_optimizer(models.ServiceTemplate.objects.all(), info) - - fhrp_group = ObjectField(FHRPGroupType) - fhrp_group_list = ObjectListField(FHRPGroupType) - - def resolve_fhrp_group_list(root, info, **kwargs): - return gql_query_optimizer(models.FHRPGroup.objects.all(), info) - - fhrp_group_assignment = ObjectField(FHRPGroupAssignmentType) - fhrp_group_assignment_list = ObjectListField(FHRPGroupAssignmentType) - - def resolve_fhrp_group_assignment_list(root, info, **kwargs): - return gql_query_optimizer(models.FHRPGroupAssignment.objects.all(), info) - - vlan = ObjectField(VLANType) - vlan_list = ObjectListField(VLANType) - - def resolve_vlan_list(root, info, **kwargs): - return gql_query_optimizer(models.VLAN.objects.all(), info) - - vlan_group = ObjectField(VLANGroupType) - vlan_group_list = ObjectListField(VLANGroupType) - - def resolve_vlan_group_list(root, info, **kwargs): - return gql_query_optimizer(models.VLANGroup.objects.all(), info) - - vrf = ObjectField(VRFType) - vrf_list = ObjectListField(VRFType) - - def resolve_vrf_list(root, info, **kwargs): - return gql_query_optimizer(models.VRF.objects.all(), info) + vrf: VRFType = strawberry_django.field() + vrf_list: List[VRFType] = strawberry_django.field() diff --git a/netbox/ipam/graphql/types.py b/netbox/ipam/graphql/types.py index 2fdec2273..3f3991f92 100644 --- a/netbox/ipam/graphql/types.py +++ b/netbox/ipam/graphql/types.py @@ -26,7 +26,7 @@ __all__ = ( ) -class IPAddressFamilyType(graphene.ObjectType): +class IPAddressFamilyType: # value = graphene.Int() # label = graphene.String() @@ -50,8 +50,9 @@ class BaseIPAddressFamilyType: @strawberry_django.type( models.ASN, - fields='__all__', - filters=ProviderFilter + # fields='__all__', + exclude=('asn',), # bug - temp + filters=ASNFilter ) class ASNType(NetBoxObjectType): # asn = graphene.Field(BigInt) @@ -60,7 +61,8 @@ class ASNType(NetBoxObjectType): @strawberry_django.type( models.ASNRange, - fields='__all__', + # fields='__all__', + exclude=('start', 'end',), # bug - temp filters=ASNRangeFilter ) class ASNRangeType(NetBoxObjectType): @@ -69,7 +71,8 @@ class ASNRangeType(NetBoxObjectType): @strawberry_django.type( models.Aggregate, - fields='__all__', + # fields='__all__', + exclude=('prefix',), # bug - temp filters=AggregateFilter ) class AggregateType(NetBoxObjectType, BaseIPAddressFamilyType): @@ -99,7 +102,7 @@ class FHRPGroupAssignmentType(BaseObjectType): @strawberry_django.type( models.IPAddress, - exclude=('assigned_object_type', 'assigned_object_id'), + exclude=('assigned_object_type', 'assigned_object_id', 'address'), filters=IPAddressFilter ) class IPAddressType(NetBoxObjectType, BaseIPAddressFamilyType): @@ -111,7 +114,8 @@ class IPAddressType(NetBoxObjectType, BaseIPAddressFamilyType): @strawberry_django.type( models.IPRange, - fields='__all__', + # fields='__all__', + exclude=('start_address', 'end_address',), # bug - temp filters=IPRangeFilter ) class IPRangeType(NetBoxObjectType): @@ -122,7 +126,8 @@ class IPRangeType(NetBoxObjectType): @strawberry_django.type( models.Prefix, - fields='__all__', + # fields='__all__', + exclude=('prefix',), # bug - temp filters=PrefixFilter ) class PrefixType(NetBoxObjectType, BaseIPAddressFamilyType): @@ -158,7 +163,8 @@ class RouteTargetType(NetBoxObjectType): @strawberry_django.type( models.Service, - fields='__all__', + # fields='__all__', + exclude=('ports',), # bug - temp filters=ServiceFilter ) class ServiceType(NetBoxObjectType): @@ -167,7 +173,8 @@ class ServiceType(NetBoxObjectType): @strawberry_django.type( models.ServiceTemplate, - fields='__all__', + # fields='__all__', + exclude=('ports',), # bug - temp filters=ServiceTemplateFilter ) class ServiceTemplateType(NetBoxObjectType): diff --git a/netbox/netbox/graphql/schema.py b/netbox/netbox/graphql/schema.py index 9ccc0b8a7..018869bbe 100644 --- a/netbox/netbox/graphql/schema.py +++ b/netbox/netbox/graphql/schema.py @@ -1,10 +1,14 @@ import strawberry from strawberry_django.optimizer import DjangoOptimizerExtension from strawberry.schema.config import StrawberryConfig + from circuits.graphql.schema import CircuitsQuery from core.graphql.schema import CoreQuery from dcim.graphql.schema import DCIMQuery from extras.graphql.schema import ExtrasQuery +from ipam.graphql.schema import IPAMQuery +from netbox.registry import registry +from tenancy.graphql.schema import TenancyQuery from users.graphql.schema import UsersQuery # from virtualization.graphql.schema import VirtualizationQuery # from vpn.graphql.schema import VPNQuery @@ -18,13 +22,12 @@ class Query( CoreQuery, DCIMQuery, ExtrasQuery, - # IPAMQuery, - # TenancyQuery, + IPAMQuery, + TenancyQuery, # VirtualizationQuery, # VPNQuery, # WirelessQuery, - # *registry['plugins']['graphql_schemas'], # Append plugin schemas - # graphene.ObjectType + *registry['plugins']['graphql_schemas'], # Append plugin schemas ): pass diff --git a/netbox/tenancy/graphql/filters.py b/netbox/tenancy/graphql/filters.py index e69de29bb..a7d3c2f26 100644 --- a/netbox/tenancy/graphql/filters.py +++ b/netbox/tenancy/graphql/filters.py @@ -0,0 +1,45 @@ +import strawberry +import strawberry_django +from strawberry import auto +from tenancy import models, filtersets +from netbox.graphql import filters + + +__all__ = ( + 'TenantFilter', + 'TenantGroupFilter', + 'ContactFilter', + 'ContactRoleFilter', + 'ContactGroupFilter', + 'ContactAssignmentFilter', +) + + +@strawberry_django.filter(models.Tenant, lookups=True) +class TenantFilter(filtersets.TenantFilterSet): + id: auto + + +@strawberry_django.filter(models.TenantGroup, lookups=True) +class TenantGroupFilter(filtersets.TenantGroupFilterSet): + id: auto + + +@strawberry_django.filter(models.Contact, lookups=True) +class ContactFilter(filtersets.ContactFilterSet): + id: auto + + +@strawberry_django.filter(models.ContactRole, lookups=True) +class ContactRoleFilter(filtersets.ContactRoleFilterSet): + id: auto + + +@strawberry_django.filter(models.ContactGroup, lookups=True) +class ContactGroupFilter(filtersets.ContactGroupFilterSet): + id: auto + + +@strawberry_django.filter(models.ContactAssignment, lookups=True) +class ContactAssignmentFilter(filtersets.ContactAssignmentFilterSet): + id: auto diff --git a/netbox/tenancy/graphql/schema.py b/netbox/tenancy/graphql/schema.py index 8c4648820..e82b3ad9c 100644 --- a/netbox/tenancy/graphql/schema.py +++ b/netbox/tenancy/graphql/schema.py @@ -1,44 +1,27 @@ -import graphene +from typing import List +import strawberry +import strawberry_django -from netbox.graphql.fields import ObjectField, ObjectListField -from tenancy import models +from circuits import models from .types import * -from utilities.graphql_optimizer import gql_query_optimizer -class TenancyQuery(graphene.ObjectType): - tenant = ObjectField(TenantType) - tenant_list = ObjectListField(TenantType) +@strawberry.type +class TenancyQuery: + tenant: TenantType = strawberry_django.field() + tenant_list: List[TenantType] = strawberry_django.field() - def resolve_tenant_list(root, info, **kwargs): - return gql_query_optimizer(models.Tenant.objects.all(), info) + tenant_group: TenantGroupType = strawberry_django.field() + tenant_group_list: List[TenantGroupType] = strawberry_django.field() - tenant_group = ObjectField(TenantGroupType) - tenant_group_list = ObjectListField(TenantGroupType) + contact: ContactType = strawberry_django.field() + contact_list: List[ContactType] = strawberry_django.field() - def resolve_tenant_group_list(root, info, **kwargs): - return gql_query_optimizer(models.TenantGroup.objects.all(), info) + contact_role: ContactRoleType = strawberry_django.field() + contact_role_list: List[ContactRoleType] = strawberry_django.field() - contact = ObjectField(ContactType) - contact_list = ObjectListField(ContactType) + contact_group: ContactGroupType = strawberry_django.field() + contact_group_list: List[ContactGroupType] = strawberry_django.field() - def resolve_contact_list(root, info, **kwargs): - return gql_query_optimizer(models.Contact.objects.all(), info) - - contact_role = ObjectField(ContactRoleType) - contact_role_list = ObjectListField(ContactRoleType) - - def resolve_contact_role_list(root, info, **kwargs): - return gql_query_optimizer(models.ContactRole.objects.all(), info) - - contact_group = ObjectField(ContactGroupType) - contact_group_list = ObjectListField(ContactGroupType) - - def resolve_contact_group_list(root, info, **kwargs): - return gql_query_optimizer(models.ContactGroup.objects.all(), info) - - contact_assignment = ObjectField(ContactAssignmentType) - contact_assignment_list = ObjectListField(ContactAssignmentType) - - def resolve_contact_assignment_list(root, info, **kwargs): - return gql_query_optimizer(models.ContactAssignment.objects.all(), info) + contact_assignment: ContactAssignmentType = strawberry_django.field() + contact_assignment_list: List[ContactAssignmentType] = strawberry_django.field() diff --git a/netbox/tenancy/graphql/types.py b/netbox/tenancy/graphql/types.py index 45193e848..307a9000d 100644 --- a/netbox/tenancy/graphql/types.py +++ b/netbox/tenancy/graphql/types.py @@ -30,7 +30,7 @@ class ContactAssignmentsMixin: @strawberry_django.type( models.Tenant, fields='__all__', - # filters=TenantFilter + filters=TenantFilter ) class TenantType(NetBoxObjectType): pass @@ -38,8 +38,9 @@ class TenantType(NetBoxObjectType): @strawberry_django.type( models.TenantGroup, - fields='__all__', - # filters=TenantGroupFilter + # fields='__all__', + exclude=('parent',), # bug - temp + filters=TenantGroupFilter ) class TenantGroupType(OrganizationalObjectType): pass @@ -52,7 +53,7 @@ class TenantGroupType(OrganizationalObjectType): @strawberry_django.type( models.Contact, fields='__all__', - # filters=ContactFilter + filters=ContactFilter ) class ContactType(ContactAssignmentsMixin, NetBoxObjectType): pass @@ -61,7 +62,7 @@ class ContactType(ContactAssignmentsMixin, NetBoxObjectType): @strawberry_django.type( models.ContactRole, fields='__all__', - # filters=ContactRoleFilter + filters=ContactRoleFilter ) class ContactRoleType(ContactAssignmentsMixin, OrganizationalObjectType): pass @@ -69,8 +70,9 @@ class ContactRoleType(ContactAssignmentsMixin, OrganizationalObjectType): @strawberry_django.type( models.ContactGroup, - fields='__all__', - # filters=ContactGroupFilter + # fields='__all__', + exclude=('parent',), # bug - temp + filters=ContactGroupFilter ) class ContactGroupType(OrganizationalObjectType): pass @@ -79,7 +81,7 @@ class ContactGroupType(OrganizationalObjectType): @strawberry_django.type( models.ContactAssignment, fields='__all__', - # filters=ContactAssignmentFilter + filters=ContactAssignmentFilter ) class ContactAssignmentType(CustomFieldsMixin, TagsMixin, BaseObjectType): pass