types.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. from typing import Annotated, List, TYPE_CHECKING, Union
  2. import strawberry
  3. import strawberry_django
  4. from circuits import models
  5. from dcim.graphql.mixins import CabledObjectMixin
  6. from extras.graphql.mixins import ContactsMixin, CustomFieldsMixin, TagsMixin
  7. from netbox.graphql.types import BaseObjectType, NetBoxObjectType, ObjectType, OrganizationalObjectType
  8. from tenancy.graphql.types import TenantType
  9. from .filters import *
  10. if TYPE_CHECKING:
  11. from dcim.graphql.types import InterfaceType, LocationType, RegionType, SiteGroupType, SiteType
  12. from ipam.graphql.types import ASNType
  13. __all__ = (
  14. 'CircuitGroupAssignmentType',
  15. 'CircuitGroupType',
  16. 'CircuitTerminationType',
  17. 'CircuitType',
  18. 'CircuitTypeType',
  19. 'ProviderType',
  20. 'ProviderAccountType',
  21. 'ProviderNetworkType',
  22. 'VirtualCircuitTerminationType',
  23. 'VirtualCircuitType',
  24. 'VirtualCircuitTypeType',
  25. )
  26. @strawberry_django.type(
  27. models.Provider,
  28. fields='__all__',
  29. filters=ProviderFilter,
  30. pagination=True
  31. )
  32. class ProviderType(NetBoxObjectType, ContactsMixin):
  33. networks: List[Annotated["ProviderNetworkType", strawberry.lazy('circuits.graphql.types')]]
  34. circuits: List[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]]
  35. asns: List[Annotated["ASNType", strawberry.lazy('ipam.graphql.types')]]
  36. accounts: List[Annotated["ProviderAccountType", strawberry.lazy('circuits.graphql.types')]]
  37. @strawberry_django.type(
  38. models.ProviderAccount,
  39. fields='__all__',
  40. filters=ProviderAccountFilter,
  41. pagination=True
  42. )
  43. class ProviderAccountType(ContactsMixin, NetBoxObjectType):
  44. provider: Annotated["ProviderType", strawberry.lazy('circuits.graphql.types')]
  45. circuits: List[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]]
  46. @strawberry_django.type(
  47. models.ProviderNetwork,
  48. fields='__all__',
  49. filters=ProviderNetworkFilter,
  50. pagination=True
  51. )
  52. class ProviderNetworkType(NetBoxObjectType):
  53. provider: Annotated["ProviderType", strawberry.lazy('circuits.graphql.types')]
  54. circuit_terminations: List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]
  55. @strawberry_django.type(
  56. models.CircuitTermination,
  57. exclude=['termination_type', 'termination_id', '_location', '_region', '_site', '_site_group', '_provider_network'],
  58. filters=CircuitTerminationFilter,
  59. pagination=True
  60. )
  61. class CircuitTerminationType(CustomFieldsMixin, TagsMixin, CabledObjectMixin, ObjectType):
  62. circuit: Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]
  63. @strawberry_django.field
  64. def termination(self) -> Annotated[Union[
  65. Annotated["LocationType", strawberry.lazy('dcim.graphql.types')],
  66. Annotated["RegionType", strawberry.lazy('dcim.graphql.types')],
  67. Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')],
  68. Annotated["SiteType", strawberry.lazy('dcim.graphql.types')],
  69. Annotated["ProviderNetworkType", strawberry.lazy('circuits.graphql.types')],
  70. ], strawberry.union("CircuitTerminationTerminationType")] | None:
  71. return self.termination
  72. @strawberry_django.type(
  73. models.CircuitType,
  74. fields='__all__',
  75. filters=CircuitTypeFilter,
  76. pagination=True
  77. )
  78. class CircuitTypeType(OrganizationalObjectType):
  79. color: str
  80. circuits: List[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]]
  81. @strawberry_django.type(
  82. models.Circuit,
  83. fields='__all__',
  84. filters=CircuitFilter,
  85. pagination=True
  86. )
  87. class CircuitType(NetBoxObjectType, ContactsMixin):
  88. provider: ProviderType
  89. provider_account: ProviderAccountType | None
  90. termination_a: CircuitTerminationType | None
  91. termination_z: CircuitTerminationType | None
  92. type: CircuitTypeType
  93. tenant: TenantType | None
  94. terminations: List[CircuitTerminationType]
  95. @strawberry_django.type(
  96. models.CircuitGroup,
  97. fields='__all__',
  98. filters=CircuitGroupFilter,
  99. pagination=True
  100. )
  101. class CircuitGroupType(OrganizationalObjectType):
  102. tenant: TenantType | None
  103. @strawberry_django.type(
  104. models.CircuitGroupAssignment,
  105. exclude=['member_type', 'member_id'],
  106. filters=CircuitGroupAssignmentFilter,
  107. pagination=True
  108. )
  109. class CircuitGroupAssignmentType(TagsMixin, BaseObjectType):
  110. group: Annotated["CircuitGroupType", strawberry.lazy('circuits.graphql.types')]
  111. @strawberry_django.field
  112. def member(self) -> Annotated[Union[
  113. Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')],
  114. Annotated["VirtualCircuitType", strawberry.lazy('circuits.graphql.types')],
  115. ], strawberry.union("CircuitGroupAssignmentMemberType")] | None:
  116. return self.member
  117. @strawberry_django.type(
  118. models.VirtualCircuitType,
  119. fields='__all__',
  120. filters=VirtualCircuitTypeFilter,
  121. pagination=True
  122. )
  123. class VirtualCircuitTypeType(OrganizationalObjectType):
  124. color: str
  125. virtual_circuits: List[Annotated["VirtualCircuitType", strawberry.lazy('circuits.graphql.types')]]
  126. @strawberry_django.type(
  127. models.VirtualCircuitTermination,
  128. fields='__all__',
  129. filters=VirtualCircuitTerminationFilter,
  130. pagination=True
  131. )
  132. class VirtualCircuitTerminationType(CustomFieldsMixin, TagsMixin, ObjectType):
  133. virtual_circuit: Annotated[
  134. "VirtualCircuitType",
  135. strawberry.lazy('circuits.graphql.types')
  136. ] = strawberry_django.field(select_related=["virtual_circuit"])
  137. interface: Annotated[
  138. "InterfaceType",
  139. strawberry.lazy('dcim.graphql.types')
  140. ] = strawberry_django.field(select_related=["interface"])
  141. @strawberry_django.type(
  142. models.VirtualCircuit,
  143. fields='__all__',
  144. filters=VirtualCircuitFilter,
  145. pagination=True
  146. )
  147. class VirtualCircuitType(NetBoxObjectType):
  148. provider_network: ProviderNetworkType = strawberry_django.field(select_related=["provider_network"])
  149. provider_account: ProviderAccountType | None
  150. type: Annotated["VirtualCircuitTypeType", strawberry.lazy('circuits.graphql.types')] = strawberry_django.field(
  151. select_related=["type"]
  152. )
  153. tenant: TenantType | None
  154. terminations: List[VirtualCircuitTerminationType]