283 lines
9.8 KiB
Python
283 lines
9.8 KiB
Python
from typing import Annotated, List, Union
|
|
|
|
import strawberry
|
|
import strawberry_django
|
|
|
|
from circuits.graphql.types import ProviderType
|
|
from dcim.graphql.types import SiteType
|
|
from ipam import models
|
|
from netbox.graphql.scalars import BigInt
|
|
from netbox.graphql.types import BaseObjectType, NetBoxObjectType, OrganizationalObjectType
|
|
from .filters import *
|
|
from .mixins import IPAddressesMixin
|
|
|
|
__all__ = (
|
|
'ASNType',
|
|
'ASNRangeType',
|
|
'AggregateType',
|
|
'FHRPGroupType',
|
|
'FHRPGroupAssignmentType',
|
|
'IPAddressType',
|
|
'IPRangeType',
|
|
'PrefixType',
|
|
'RIRType',
|
|
'RoleType',
|
|
'RouteTargetType',
|
|
'ServiceType',
|
|
'ServiceTemplateType',
|
|
'VLANType',
|
|
'VLANGroupType',
|
|
'VRFType',
|
|
)
|
|
|
|
|
|
@strawberry.type
|
|
class IPAddressFamilyType:
|
|
value: int
|
|
label: str
|
|
|
|
|
|
@strawberry.type
|
|
class BaseIPAddressFamilyType:
|
|
"""
|
|
Base type for models that need to expose their IPAddress family type.
|
|
"""
|
|
|
|
@strawberry.field
|
|
def family(self) -> IPAddressFamilyType:
|
|
# Note that self, is an instance of models.IPAddress
|
|
# thus resolves to the address family value.
|
|
return IPAddressFamilyType(value=self.family, label=f'IPv{self.family}')
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.ASN,
|
|
fields='__all__',
|
|
filters=ASNFilter
|
|
)
|
|
class ASNType(NetBoxObjectType):
|
|
asn: BigInt
|
|
rir: Annotated["RIRType", strawberry.lazy('ipam.graphql.types')] | None
|
|
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
|
|
|
|
sites: List[SiteType]
|
|
providers: List[ProviderType]
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.ASNRange,
|
|
fields='__all__',
|
|
filters=ASNRangeFilter
|
|
)
|
|
class ASNRangeType(NetBoxObjectType):
|
|
start: BigInt
|
|
end: BigInt
|
|
rir: Annotated["RIRType", strawberry.lazy('ipam.graphql.types')] | None
|
|
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.Aggregate,
|
|
fields='__all__',
|
|
filters=AggregateFilter
|
|
)
|
|
class AggregateType(NetBoxObjectType, BaseIPAddressFamilyType):
|
|
prefix: str
|
|
rir: Annotated["RIRType", strawberry.lazy('ipam.graphql.types')] | None
|
|
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.FHRPGroup,
|
|
fields='__all__',
|
|
filters=FHRPGroupFilter
|
|
)
|
|
class FHRPGroupType(NetBoxObjectType, IPAddressesMixin):
|
|
|
|
fhrpgroupassignment_set: List[Annotated["FHRPGroupAssignmentType", strawberry.lazy('ipam.graphql.types')]]
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.FHRPGroupAssignment,
|
|
exclude=('interface_type', 'interface_id'),
|
|
filters=FHRPGroupAssignmentFilter
|
|
)
|
|
class FHRPGroupAssignmentType(BaseObjectType):
|
|
group: Annotated["FHRPGroupType", strawberry.lazy('ipam.graphql.types')]
|
|
|
|
@strawberry_django.field
|
|
def interface(self) -> Annotated[Union[
|
|
Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')],
|
|
Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')],
|
|
], strawberry.union("FHRPGroupInterfaceType")]:
|
|
return self.interface
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.IPAddress,
|
|
exclude=('assigned_object_type', 'assigned_object_id', 'address'),
|
|
filters=IPAddressFilter
|
|
)
|
|
class IPAddressType(NetBoxObjectType, BaseIPAddressFamilyType):
|
|
address: str
|
|
vrf: Annotated["VRFType", strawberry.lazy('ipam.graphql.types')] | None
|
|
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
|
|
nat_inside: Annotated["IPAddressType", strawberry.lazy('ipam.graphql.types')] | None
|
|
|
|
nat_outside: List[Annotated["IPAddressType", strawberry.lazy('ipam.graphql.types')]]
|
|
tunnel_terminations: List[Annotated["TunnelTerminationType", strawberry.lazy('vpn.graphql.types')]]
|
|
services: List[Annotated["ServiceType", strawberry.lazy('ipam.graphql.types')]]
|
|
|
|
@strawberry_django.field
|
|
def assigned_object(self) -> Annotated[Union[
|
|
Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')],
|
|
Annotated["FHRPGroupType", strawberry.lazy('ipam.graphql.types')],
|
|
Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')],
|
|
], strawberry.union("IPAddressAssignmentType")] | None:
|
|
return self.assigned_object
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.IPRange,
|
|
fields='__all__',
|
|
filters=IPRangeFilter
|
|
)
|
|
class IPRangeType(NetBoxObjectType):
|
|
start_address: str
|
|
end_address: str
|
|
vrf: Annotated["VRFType", strawberry.lazy('ipam.graphql.types')] | None
|
|
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
|
|
role: Annotated["RoleType", strawberry.lazy('ipam.graphql.types')] | None
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.Prefix,
|
|
fields='__all__',
|
|
filters=PrefixFilter
|
|
)
|
|
class PrefixType(NetBoxObjectType, BaseIPAddressFamilyType):
|
|
prefix: str
|
|
site: Annotated["SiteType", strawberry.lazy('dcim.graphql.types')] | None
|
|
vrf: Annotated["VRFType", strawberry.lazy('ipam.graphql.types')] | None
|
|
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
|
|
vlan: Annotated["VLANType", strawberry.lazy('ipam.graphql.types')] | None
|
|
role: Annotated["RoleType", strawberry.lazy('ipam.graphql.types')] | None
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.RIR,
|
|
fields='__all__',
|
|
filters=RIRFilter
|
|
)
|
|
class RIRType(OrganizationalObjectType):
|
|
|
|
asn_ranges: List[Annotated["ASNRangeType", strawberry.lazy('ipam.graphql.types')]]
|
|
asns: List[Annotated["ASNType", strawberry.lazy('ipam.graphql.types')]]
|
|
aggregates: List[Annotated["AggregateType", strawberry.lazy('ipam.graphql.types')]]
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.Role,
|
|
fields='__all__',
|
|
filters=RoleFilter
|
|
)
|
|
class RoleType(OrganizationalObjectType):
|
|
|
|
prefixes: List[Annotated["PrefixType", strawberry.lazy('ipam.graphql.types')]]
|
|
ip_ranges: List[Annotated["IPRangeType", strawberry.lazy('ipam.graphql.types')]]
|
|
vlans: List[Annotated["VLANType", strawberry.lazy('ipam.graphql.types')]]
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.RouteTarget,
|
|
fields='__all__',
|
|
filters=RouteTargetFilter
|
|
)
|
|
class RouteTargetType(NetBoxObjectType):
|
|
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
|
|
|
|
importing_l2vpns: List[Annotated["L2VPNType", strawberry.lazy('vpn.graphql.types')]]
|
|
exporting_l2vpns: List[Annotated["L2VPNType", strawberry.lazy('vpn.graphql.types')]]
|
|
importing_vrfs: List[Annotated["VRFType", strawberry.lazy('ipam.graphql.types')]]
|
|
exporting_vrfs: List[Annotated["VRFType", strawberry.lazy('ipam.graphql.types')]]
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.Service,
|
|
fields='__all__',
|
|
filters=ServiceFilter
|
|
)
|
|
class ServiceType(NetBoxObjectType):
|
|
ports: List[int]
|
|
device: Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')] | None
|
|
virtual_machine: Annotated["VirtualMachineType", strawberry.lazy('virtualization.graphql.types')] | None
|
|
|
|
ipaddresses: List[Annotated["IPAddressType", strawberry.lazy('ipam.graphql.types')]]
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.ServiceTemplate,
|
|
fields='__all__',
|
|
filters=ServiceTemplateFilter
|
|
)
|
|
class ServiceTemplateType(NetBoxObjectType):
|
|
ports: List[int]
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.VLAN,
|
|
fields='__all__',
|
|
filters=VLANFilter
|
|
)
|
|
class VLANType(NetBoxObjectType):
|
|
site: Annotated["SiteType", strawberry.lazy('ipam.graphql.types')] | None
|
|
group: Annotated["VLANGroupType", strawberry.lazy('ipam.graphql.types')] | None
|
|
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
|
|
role: Annotated["RoleType", strawberry.lazy('ipam.graphql.types')] | None
|
|
|
|
interfaces_as_untagged: List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]
|
|
vminterfaces_as_untagged: List[Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')]]
|
|
wirelesslan_set: List[Annotated["WirelessLANType", strawberry.lazy('wireless.graphql.types')]]
|
|
prefixes: List[Annotated["PrefixType", strawberry.lazy('ipam.graphql.types')]]
|
|
interfaces_as_tagged: List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]
|
|
vminterfaces_as_tagged: List[Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')]]
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.VLANGroup,
|
|
exclude=('scope_type', 'scope_id'),
|
|
filters=VLANGroupFilter
|
|
)
|
|
class VLANGroupType(OrganizationalObjectType):
|
|
|
|
vlans: List[VLANType]
|
|
|
|
@strawberry_django.field
|
|
def scope(self) -> Annotated[Union[
|
|
Annotated["ClusterType", strawberry.lazy('virtualization.graphql.types')],
|
|
Annotated["ClusterGroupType", strawberry.lazy('virtualization.graphql.types')],
|
|
Annotated["LocationType", strawberry.lazy('dcim.graphql.types')],
|
|
Annotated["RackType", strawberry.lazy('dcim.graphql.types')],
|
|
Annotated["RegionType", strawberry.lazy('dcim.graphql.types')],
|
|
Annotated["SiteType", strawberry.lazy('dcim.graphql.types')],
|
|
Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')],
|
|
], strawberry.union("VLANGroupScopeType")] | None:
|
|
return self.scope
|
|
|
|
|
|
@strawberry_django.type(
|
|
models.VRF,
|
|
fields='__all__',
|
|
filters=VRFFilter
|
|
)
|
|
class VRFType(NetBoxObjectType):
|
|
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
|
|
|
|
interfaces: List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]
|
|
ip_addresses: List[Annotated["IPAddressType", strawberry.lazy('ipam.graphql.types')]]
|
|
vminterfaces: List[Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')]]
|
|
ip_ranges: List[Annotated["IPRangeType", strawberry.lazy('ipam.graphql.types')]]
|
|
export_targets: List[Annotated["RouteTargetType", strawberry.lazy('ipam.graphql.types')]]
|
|
import_targets: List[Annotated["RouteTargetType", strawberry.lazy('ipam.graphql.types')]]
|
|
prefixes: List[Annotated["PrefixType", strawberry.lazy('ipam.graphql.types')]]
|