types.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. from typing import TYPE_CHECKING, Annotated, List, Union
  2. import strawberry
  3. import strawberry_django
  4. from circuits.graphql.types import ProviderType
  5. from dcim.graphql.types import SiteType
  6. from ipam import models
  7. from netbox.graphql.scalars import BigInt
  8. from netbox.graphql.types import (
  9. BaseObjectType,
  10. NetBoxObjectType,
  11. OrganizationalObjectType,
  12. )
  13. from .filters import *
  14. __all__ = (
  15. 'ASNType',
  16. 'ASNRangeType',
  17. 'AggregateType',
  18. 'FHRPGroupType',
  19. 'FHRPGroupAssignmentType',
  20. 'IPAddressType',
  21. 'IPRangeType',
  22. 'PrefixType',
  23. 'RIRType',
  24. 'RoleType',
  25. 'RouteTargetType',
  26. 'ServiceType',
  27. 'ServiceTemplateType',
  28. 'VLANType',
  29. 'VLANGroupType',
  30. 'VRFType',
  31. )
  32. @strawberry.type
  33. class IPAddressFamilyType:
  34. value: int
  35. label: str
  36. @strawberry.type
  37. class BaseIPAddressFamilyType:
  38. """
  39. Base type for models that need to expose their IPAddress family type.
  40. """
  41. @strawberry.field
  42. def family(self) -> IPAddressFamilyType:
  43. # Note that self, is an instance of models.IPAddress
  44. # thus resolves to the address family value.
  45. return IPAddressFamilyType(value=self.value, label=f'IPv{self.value}')
  46. @strawberry_django.type(
  47. models.ASN,
  48. fields='__all__',
  49. filters=ASNFilter
  50. )
  51. class ASNType(NetBoxObjectType):
  52. asn: BigInt
  53. @strawberry_django.field
  54. def sites(self) -> List[SiteType]:
  55. return self.sites.all()
  56. @strawberry_django.field
  57. def providers(self) -> List[ProviderType]:
  58. return self.providers.all()
  59. @strawberry_django.type(
  60. models.ASNRange,
  61. fields='__all__',
  62. filters=ASNRangeFilter
  63. )
  64. class ASNRangeType(NetBoxObjectType):
  65. start: BigInt
  66. end: BigInt
  67. @strawberry_django.type(
  68. models.Aggregate,
  69. fields='__all__',
  70. filters=AggregateFilter
  71. )
  72. class AggregateType(NetBoxObjectType, BaseIPAddressFamilyType):
  73. prefix: str
  74. @strawberry_django.type(
  75. models.FHRPGroup,
  76. fields='__all__',
  77. filters=FHRPGroupFilter
  78. )
  79. class FHRPGroupType(NetBoxObjectType):
  80. @strawberry_django.field
  81. def fhrpgroupassignment_set(self) -> List[Annotated["FHRPGroupAssignmentType", strawberry.lazy('ipam.graphql.types')]]:
  82. return self.fhrpgroupassignment_set.all()
  83. @strawberry_django.type(
  84. models.FHRPGroupAssignment,
  85. exclude=('interface_type', 'interface_id'),
  86. filters=FHRPGroupAssignmentFilter
  87. )
  88. class FHRPGroupAssignmentType(BaseObjectType):
  89. # interface = graphene.Field('ipam.graphql.gfk_mixins.FHRPGroupInterfaceType')
  90. @strawberry_django.field
  91. def interface(self) -> Annotated[Union[
  92. Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')],
  93. Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')],
  94. ], strawberry.union("FHRPGroupInterfaceType")]:
  95. return self.interface
  96. @strawberry_django.type(
  97. models.IPAddress,
  98. exclude=('assigned_object_type', 'assigned_object_id', 'address'),
  99. filters=IPAddressFilter
  100. )
  101. class IPAddressType(NetBoxObjectType, BaseIPAddressFamilyType):
  102. address: str
  103. @strawberry_django.field
  104. def nat_outside(self) -> Annotated["IPAddressType", strawberry.lazy('ipam.graphql.types')]:
  105. return self.nat_outside
  106. @strawberry_django.field
  107. def tunnel_terminations(self) -> List[Annotated["TunnelTerminationType", strawberry.lazy('vpn.graphql.types')]]:
  108. return self.tunnel_terminations.all()
  109. @strawberry_django.field
  110. def services(self) -> List[Annotated["ServiceType", strawberry.lazy('ipam.graphql.types')]]:
  111. return self.services.all()
  112. @strawberry_django.field
  113. def assigned_object(self) -> Annotated[Union[
  114. Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')],
  115. Annotated["FHRPGroupType", strawberry.lazy('ipam.graphql.types')],
  116. Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')],
  117. ], strawberry.union("IPAddressAssignmentType")]:
  118. return self.assigned_object
  119. @strawberry_django.type(
  120. models.IPRange,
  121. # fields='__all__',
  122. exclude=('start_address', 'end_address',), # bug - temp
  123. filters=IPRangeFilter
  124. )
  125. class IPRangeType(NetBoxObjectType):
  126. start_address: str
  127. end_address: str
  128. @strawberry_django.type(
  129. models.Prefix,
  130. # fields='__all__',
  131. exclude=('prefix',), # bug - temp
  132. filters=PrefixFilter
  133. )
  134. class PrefixType(NetBoxObjectType, BaseIPAddressFamilyType):
  135. prefix: str
  136. @strawberry_django.type(
  137. models.RIR,
  138. fields='__all__',
  139. filters=RIRFilter
  140. )
  141. class RIRType(OrganizationalObjectType):
  142. @strawberry_django.field
  143. def asn_ranges(self) -> List[Annotated["ASNRangeType", strawberry.lazy('ipam.graphql.types')]]:
  144. return self.asn_ranges.all()
  145. @strawberry_django.field
  146. def asns(self) -> List[Annotated["ASNType", strawberry.lazy('ipam.graphql.types')]]:
  147. return self.asns.all()
  148. @strawberry_django.field
  149. def aggregates(self) -> List[Annotated["AggregateType", strawberry.lazy('ipam.graphql.types')]]:
  150. return self.aggregates.all()
  151. @strawberry_django.type(
  152. models.Role,
  153. fields='__all__',
  154. filters=RoleFilter
  155. )
  156. class RoleType(OrganizationalObjectType):
  157. @strawberry_django.field
  158. def prefixes(self) -> List[Annotated["PrefixType", strawberry.lazy('ipam.graphql.types')]]:
  159. return self.prefixes.all()
  160. @strawberry_django.field
  161. def ip_ranges(self) -> List[Annotated["IPRangeType", strawberry.lazy('ipam.graphql.types')]]:
  162. return self.ip_ranges.all()
  163. @strawberry_django.field
  164. def vlans(self) -> List[Annotated["VLANType", strawberry.lazy('ipam.graphql.types')]]:
  165. return self.vlans.all()
  166. @strawberry_django.type(
  167. models.RouteTarget,
  168. fields='__all__',
  169. filters=RouteTargetFilter
  170. )
  171. class RouteTargetType(NetBoxObjectType):
  172. @strawberry_django.field
  173. def exporting_l2vpns(self) -> List[Annotated["L2VPNType", strawberry.lazy('vpn.graphql.types')]]:
  174. return self.exporting_l2vpns.all()
  175. @strawberry_django.field
  176. def exporting_vrfs(self) -> List[Annotated["VRFType", strawberry.lazy('ipam.graphql.types')]]:
  177. return self.exporting_vrfs.all()
  178. @strawberry_django.field
  179. def importing_vrfs(self) -> List[Annotated["VRFType", strawberry.lazy('ipam.graphql.types')]]:
  180. return self.importing_vrfs.all()
  181. @strawberry_django.field
  182. def importing_l2vpns(self) -> List[Annotated["L2VPNType", strawberry.lazy('vpn.graphql.types')]]:
  183. return self.importing_l2vpns.all()
  184. @strawberry_django.type(
  185. models.Service,
  186. fields='__all__',
  187. filters=ServiceFilter
  188. )
  189. class ServiceType(NetBoxObjectType):
  190. ports: List[int]
  191. @strawberry_django.field
  192. def ipaddresses(self) -> List[Annotated["IPAddressType", strawberry.lazy('ipam.graphql.types')]]:
  193. return self.ipaddresses.all()
  194. @strawberry_django.type(
  195. models.ServiceTemplate,
  196. fields='__all__',
  197. filters=ServiceTemplateFilter
  198. )
  199. class ServiceTemplateType(NetBoxObjectType):
  200. ports: List[int]
  201. @strawberry_django.type(
  202. models.VLAN,
  203. fields='__all__',
  204. filters=VLANFilter
  205. )
  206. class VLANType(NetBoxObjectType):
  207. @strawberry_django.field
  208. def interfaces_as_untagged(self) -> List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]:
  209. return self.interfaces_as_untagged.all()
  210. @strawberry_django.field
  211. def vminterfaces_as_untagged(self) -> List[Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')]]:
  212. return self.vminterfaces_as_untagged.all()
  213. @strawberry_django.field
  214. def wirelesslan_set(self) -> List[Annotated["WirelessLANType", strawberry.lazy('wireless.graphql.types')]]:
  215. return self.wirelesslan_set.all()
  216. @strawberry_django.field
  217. def prefixes(self) -> List[Annotated["PrefixType", strawberry.lazy('ipam.graphql.types')]]:
  218. return self.prefixes.all()
  219. @strawberry_django.field
  220. def interfaces_as_tagged(self) -> List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]:
  221. return self.interfaces_as_tagged.all()
  222. @strawberry_django.field
  223. def vminterfaces_as_tagged(self) -> List[Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')]]:
  224. return self.vminterfaces_as_tagged.all()
  225. @strawberry_django.type(
  226. models.VLANGroup,
  227. exclude=('scope_type', 'scope_id'),
  228. filters=VLANGroupFilter
  229. )
  230. class VLANGroupType(OrganizationalObjectType):
  231. @strawberry_django.field
  232. def vlans(self) -> List[VLANType]:
  233. return self.vlans.all()
  234. @strawberry_django.field
  235. def scope(self) -> Annotated[Union[
  236. Annotated["ClusterType", strawberry.lazy('virtualization.graphql.types')],
  237. Annotated["ClusterGroupType", strawberry.lazy('virtualization.graphql.types')],
  238. Annotated["LocationType", strawberry.lazy('dcim.graphql.types')],
  239. Annotated["RackType", strawberry.lazy('dcim.graphql.types')],
  240. Annotated["RegionType", strawberry.lazy('dcim.graphql.types')],
  241. Annotated["SiteType", strawberry.lazy('dcim.graphql.types')],
  242. Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')],
  243. ], strawberry.union("VLANGroupScopeType")]:
  244. return self.scope
  245. @strawberry_django.type(
  246. models.VRF,
  247. fields='__all__',
  248. filters=VRFFilter
  249. )
  250. class VRFType(NetBoxObjectType):
  251. @strawberry_django.field
  252. def interfaces(self) -> List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]:
  253. return self.interfaces.all()
  254. @strawberry_django.field
  255. def ip_addresses(self) -> List[Annotated["IPAddressType", strawberry.lazy('ipam.graphql.types')]]:
  256. return self.ip_addresses.all()
  257. @strawberry_django.field
  258. def vminterfaces(self) -> List[Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')]]:
  259. return self.vminterfaces.all()
  260. @strawberry_django.field
  261. def ip_ranges(self) -> List[Annotated["IPRangeType", strawberry.lazy('ipam.graphql.types')]]:
  262. return self.ip_ranges.all()
  263. @strawberry_django.field
  264. def export_targets(self) -> List[Annotated["RouteTargetType", strawberry.lazy('ipam.graphql.types')]]:
  265. return self.export_targets.all()
  266. @strawberry_django.field
  267. def import_targets(self) -> List[Annotated["RouteTargetType", strawberry.lazy('ipam.graphql.types')]]:
  268. return self.import_targets.all()
  269. @strawberry_django.field
  270. def prefixes(self) -> List[Annotated["PrefixType", strawberry.lazy('ipam.graphql.types')]]:
  271. return self.prefixes.all()