2024-03-22 17:56:30 +01:00
|
|
|
from typing import Annotated, List, Union
|
2021-10-28 18:49:59 +02:00
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
import strawberry
|
|
|
|
import strawberry_django
|
|
|
|
|
|
|
|
from circuits.graphql.types import ProviderType
|
|
|
|
from dcim.graphql.types import SiteType
|
|
|
|
from ipam import models
|
2021-10-29 21:54:55 +02:00
|
|
|
from netbox.graphql.scalars import BigInt
|
2024-03-22 17:56:30 +01:00
|
|
|
from netbox.graphql.types import BaseObjectType, NetBoxObjectType, OrganizationalObjectType
|
|
|
|
from .filters import *
|
|
|
|
from .mixins import IPAddressesMixin
|
2021-06-25 16:14:35 +02:00
|
|
|
|
|
|
|
__all__ = (
|
2021-10-28 06:06:09 +02:00
|
|
|
'ASNType',
|
2023-02-27 22:36:05 +01:00
|
|
|
'ASNRangeType',
|
2021-06-25 16:14:35 +02:00
|
|
|
'AggregateType',
|
2021-11-01 21:14:44 +01:00
|
|
|
'FHRPGroupType',
|
|
|
|
'FHRPGroupAssignmentType',
|
2021-06-25 16:14:35 +02:00
|
|
|
'IPAddressType',
|
2021-07-16 15:15:19 +02:00
|
|
|
'IPRangeType',
|
2021-06-25 16:14:35 +02:00
|
|
|
'PrefixType',
|
|
|
|
'RIRType',
|
|
|
|
'RoleType',
|
|
|
|
'RouteTargetType',
|
|
|
|
'ServiceType',
|
2022-01-12 22:42:28 +01:00
|
|
|
'ServiceTemplateType',
|
2021-06-25 16:14:35 +02:00
|
|
|
'VLANType',
|
|
|
|
'VLANGroupType',
|
|
|
|
'VRFType',
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@strawberry.type
|
|
|
|
class IPAddressFamilyType:
|
|
|
|
value: int
|
|
|
|
label: str
|
2023-03-10 20:48:45 +01:00
|
|
|
|
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@strawberry.type
|
2023-03-10 20:48:45 +01:00
|
|
|
class BaseIPAddressFamilyType:
|
2023-03-13 16:58:37 +01:00
|
|
|
"""
|
2023-03-10 20:48:45 +01:00
|
|
|
Base type for models that need to expose their IPAddress family type.
|
2023-03-13 16:58:37 +01:00
|
|
|
"""
|
2023-03-10 20:48:45 +01:00
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@strawberry.field
|
|
|
|
def family(self) -> IPAddressFamilyType:
|
2023-03-10 20:48:45 +01:00
|
|
|
# Note that self, is an instance of models.IPAddress
|
|
|
|
# thus resolves to the address family value.
|
2024-03-22 17:56:30 +01:00
|
|
|
return IPAddressFamilyType(value=self.family, label=f'IPv{self.family}')
|
2023-03-10 20:48:45 +01:00
|
|
|
|
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@strawberry_django.type(
|
|
|
|
models.ASN,
|
|
|
|
fields='__all__',
|
|
|
|
filters=ASNFilter
|
|
|
|
)
|
2022-02-04 21:07:35 +01:00
|
|
|
class ASNType(NetBoxObjectType):
|
2024-03-22 17:56:30 +01:00
|
|
|
asn: BigInt
|
|
|
|
rir: Annotated["RIRType", strawberry.lazy('ipam.graphql.types')] | None
|
|
|
|
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
|
2021-10-28 06:06:09 +02:00
|
|
|
|
2024-03-29 19:54:31 +01:00
|
|
|
sites: List[SiteType]
|
|
|
|
providers: List[ProviderType]
|
2021-10-28 06:06:09 +02:00
|
|
|
|
2023-02-27 22:36:05 +01:00
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@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
|
2023-02-27 22:36:05 +01:00
|
|
|
|
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@strawberry_django.type(
|
|
|
|
models.Aggregate,
|
|
|
|
fields='__all__',
|
|
|
|
filters=AggregateFilter
|
|
|
|
)
|
2023-03-10 20:48:45 +01:00
|
|
|
class AggregateType(NetBoxObjectType, BaseIPAddressFamilyType):
|
2024-03-22 17:56:30 +01:00
|
|
|
prefix: str
|
|
|
|
rir: Annotated["RIRType", strawberry.lazy('ipam.graphql.types')] | None
|
|
|
|
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
|
2021-06-25 16:14:35 +02:00
|
|
|
|
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@strawberry_django.type(
|
|
|
|
models.FHRPGroup,
|
|
|
|
fields='__all__',
|
|
|
|
filters=FHRPGroupFilter
|
|
|
|
)
|
2024-03-04 16:18:38 +01:00
|
|
|
class FHRPGroupType(NetBoxObjectType, IPAddressesMixin):
|
2021-11-01 21:14:44 +01:00
|
|
|
|
2024-03-29 19:54:31 +01:00
|
|
|
fhrpgroupassignment_set: List[Annotated["FHRPGroupAssignmentType", strawberry.lazy('ipam.graphql.types')]]
|
2021-11-01 21:14:44 +01:00
|
|
|
|
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@strawberry_django.type(
|
|
|
|
models.FHRPGroupAssignment,
|
|
|
|
exclude=('interface_type', 'interface_id'),
|
|
|
|
filters=FHRPGroupAssignmentFilter
|
|
|
|
)
|
2021-11-04 16:15:34 +01:00
|
|
|
class FHRPGroupAssignmentType(BaseObjectType):
|
2024-03-22 17:56:30 +01:00
|
|
|
group: Annotated["FHRPGroupType", strawberry.lazy('ipam.graphql.types')]
|
2021-11-01 21:14:44 +01:00
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@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
|
2021-11-01 21:14:44 +01:00
|
|
|
|
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@strawberry_django.type(
|
|
|
|
models.IPAddress,
|
|
|
|
exclude=('assigned_object_type', 'assigned_object_id', 'address'),
|
|
|
|
filters=IPAddressFilter
|
|
|
|
)
|
2023-03-10 20:48:45 +01:00
|
|
|
class IPAddressType(NetBoxObjectType, BaseIPAddressFamilyType):
|
2024-03-22 17:56:30 +01:00
|
|
|
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
|
|
|
|
|
2024-03-29 19:54:31 +01:00
|
|
|
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')]]
|
2024-03-22 17:56:30 +01:00
|
|
|
|
|
|
|
@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')],
|
2024-04-25 15:19:19 +02:00
|
|
|
], strawberry.union("IPAddressAssignmentType")] | None:
|
2024-03-22 17:56:30 +01:00
|
|
|
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
|
2021-06-29 18:55:17 +02:00
|
|
|
|
2021-06-25 16:14:35 +02:00
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@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):
|
2021-07-16 15:15:19 +02:00
|
|
|
|
2024-03-29 19:54:31 +01:00
|
|
|
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')]]
|
2021-07-16 15:15:19 +02:00
|
|
|
|
2021-06-25 16:14:35 +02:00
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@strawberry_django.type(
|
|
|
|
models.Role,
|
|
|
|
fields='__all__',
|
|
|
|
filters=RoleFilter
|
|
|
|
)
|
|
|
|
class RoleType(OrganizationalObjectType):
|
2021-06-25 16:14:35 +02:00
|
|
|
|
2024-03-29 19:54:31 +01:00
|
|
|
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')]]
|
2021-06-25 16:14:35 +02:00
|
|
|
|
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@strawberry_django.type(
|
|
|
|
models.RouteTarget,
|
|
|
|
fields='__all__',
|
|
|
|
filters=RouteTargetFilter
|
|
|
|
)
|
|
|
|
class RouteTargetType(NetBoxObjectType):
|
|
|
|
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
|
2021-06-25 16:14:35 +02:00
|
|
|
|
2024-03-29 19:54:31 +01:00
|
|
|
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')]]
|
2021-06-25 16:14:35 +02:00
|
|
|
|
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@strawberry_django.type(
|
|
|
|
models.Service,
|
|
|
|
fields='__all__',
|
|
|
|
filters=ServiceFilter
|
|
|
|
)
|
2022-02-04 21:07:35 +01:00
|
|
|
class ServiceType(NetBoxObjectType):
|
2024-03-22 17:56:30 +01:00
|
|
|
ports: List[int]
|
|
|
|
device: Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')] | None
|
|
|
|
virtual_machine: Annotated["VirtualMachineType", strawberry.lazy('virtualization.graphql.types')] | None
|
2021-06-25 16:14:35 +02:00
|
|
|
|
2024-03-29 19:54:31 +01:00
|
|
|
ipaddresses: List[Annotated["IPAddressType", strawberry.lazy('ipam.graphql.types')]]
|
2021-06-25 16:14:35 +02:00
|
|
|
|
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@strawberry_django.type(
|
|
|
|
models.ServiceTemplate,
|
|
|
|
fields='__all__',
|
|
|
|
filters=ServiceTemplateFilter
|
|
|
|
)
|
2022-02-04 21:07:35 +01:00
|
|
|
class ServiceTemplateType(NetBoxObjectType):
|
2024-03-22 17:56:30 +01:00
|
|
|
ports: List[int]
|
2022-01-12 22:42:28 +01:00
|
|
|
|
|
|
|
|
2024-03-22 17:56:30 +01:00
|
|
|
@strawberry_django.type(
|
|
|
|
models.VLAN,
|
|
|
|
fields='__all__',
|
|
|
|
filters=VLANFilter
|
|
|
|
)
|
2022-02-04 21:07:35 +01:00
|
|
|
class VLANType(NetBoxObjectType):
|
2024-03-22 17:56:30 +01:00
|
|
|
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
|
2021-06-25 16:14:35 +02:00
|
|
|
|
2024-03-29 19:54:31 +01:00
|
|
|
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')]]
|
2024-03-22 17:56:30 +01:00
|
|
|
|
|
|
|
|
|
|
|
@strawberry_django.type(
|
|
|
|
models.VLANGroup,
|
|
|
|
exclude=('scope_type', 'scope_id'),
|
|
|
|
filters=VLANGroupFilter
|
|
|
|
)
|
|
|
|
class VLANGroupType(OrganizationalObjectType):
|
|
|
|
|
2024-03-29 19:54:31 +01:00
|
|
|
vlans: List[VLANType]
|
2024-03-22 17:56:30 +01:00
|
|
|
|
|
|
|
@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')],
|
2024-04-25 15:19:19 +02:00
|
|
|
], strawberry.union("VLANGroupScopeType")] | None:
|
2024-03-22 17:56:30 +01:00
|
|
|
return self.scope
|
|
|
|
|
|
|
|
|
|
|
|
@strawberry_django.type(
|
|
|
|
models.VRF,
|
|
|
|
fields='__all__',
|
|
|
|
filters=VRFFilter
|
|
|
|
)
|
2022-02-04 21:07:35 +01:00
|
|
|
class VRFType(NetBoxObjectType):
|
2024-03-22 17:56:30 +01:00
|
|
|
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
|
|
|
|
|
2024-03-29 19:54:31 +01:00
|
|
|
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')]]
|