types.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. from typing import Annotated, List, 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. __all__ = (
  11. 'CircuitTerminationType',
  12. 'CircuitType',
  13. 'CircuitGroupAssignmentType',
  14. 'CircuitGroupType',
  15. 'CircuitTypeType',
  16. 'ProviderType',
  17. 'ProviderAccountType',
  18. 'ProviderNetworkType',
  19. 'VirtualCircuitTerminationType',
  20. 'VirtualCircuitType',
  21. )
  22. @strawberry_django.type(
  23. models.Provider,
  24. fields='__all__',
  25. filters=ProviderFilter
  26. )
  27. class ProviderType(NetBoxObjectType, ContactsMixin):
  28. networks: List[Annotated["ProviderNetworkType", strawberry.lazy('circuits.graphql.types')]]
  29. circuits: List[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]]
  30. asns: List[Annotated["ASNType", strawberry.lazy('ipam.graphql.types')]]
  31. accounts: List[Annotated["ProviderAccountType", strawberry.lazy('circuits.graphql.types')]]
  32. @strawberry_django.type(
  33. models.ProviderAccount,
  34. fields='__all__',
  35. filters=ProviderAccountFilter
  36. )
  37. class ProviderAccountType(NetBoxObjectType):
  38. provider: Annotated["ProviderType", strawberry.lazy('circuits.graphql.types')]
  39. circuits: List[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]]
  40. @strawberry_django.type(
  41. models.ProviderNetwork,
  42. fields='__all__',
  43. filters=ProviderNetworkFilter
  44. )
  45. class ProviderNetworkType(NetBoxObjectType):
  46. provider: Annotated["ProviderType", strawberry.lazy('circuits.graphql.types')]
  47. circuit_terminations: List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]
  48. @strawberry_django.type(
  49. models.CircuitTermination,
  50. exclude=('termination_type', 'termination_id', '_location', '_region', '_site', '_site_group', '_provider_network'),
  51. filters=CircuitTerminationFilter
  52. )
  53. class CircuitTerminationType(CustomFieldsMixin, TagsMixin, CabledObjectMixin, ObjectType):
  54. circuit: Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]
  55. @strawberry_django.field
  56. def termination(self) -> Annotated[Union[
  57. Annotated["LocationType", strawberry.lazy('dcim.graphql.types')],
  58. Annotated["RegionType", strawberry.lazy('dcim.graphql.types')],
  59. Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')],
  60. Annotated["SiteType", strawberry.lazy('dcim.graphql.types')],
  61. Annotated["ProviderNetworkType", strawberry.lazy('circuits.graphql.types')],
  62. ], strawberry.union("CircuitTerminationTerminationType")] | None:
  63. return self.termination
  64. @strawberry_django.type(
  65. models.CircuitType,
  66. fields='__all__',
  67. filters=CircuitTypeFilter
  68. )
  69. class CircuitTypeType(OrganizationalObjectType):
  70. color: str
  71. circuits: List[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]]
  72. @strawberry_django.type(
  73. models.Circuit,
  74. fields='__all__',
  75. filters=CircuitFilter
  76. )
  77. class CircuitType(NetBoxObjectType, ContactsMixin):
  78. provider: ProviderType
  79. provider_account: ProviderAccountType | None
  80. termination_a: CircuitTerminationType | None
  81. termination_z: CircuitTerminationType | None
  82. type: CircuitTypeType
  83. tenant: TenantType | None
  84. terminations: List[CircuitTerminationType]
  85. @strawberry_django.type(
  86. models.CircuitGroup,
  87. fields='__all__',
  88. filters=CircuitGroupFilter
  89. )
  90. class CircuitGroupType(OrganizationalObjectType):
  91. tenant: TenantType | None
  92. @strawberry_django.type(
  93. models.CircuitGroupAssignment,
  94. fields='__all__',
  95. filters=CircuitGroupAssignmentFilter
  96. )
  97. class CircuitGroupAssignmentType(TagsMixin, BaseObjectType):
  98. group: Annotated["CircuitGroupType", strawberry.lazy('circuits.graphql.types')]
  99. circuit: Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]
  100. @strawberry_django.type(
  101. models.VirtualCircuitTermination,
  102. fields='__all__',
  103. filters=VirtualCircuitTerminationFilter
  104. )
  105. class VirtualCircuitTerminationType(CustomFieldsMixin, TagsMixin, ObjectType):
  106. virtual_circuit: Annotated[
  107. "VirtualCircuitType",
  108. strawberry.lazy('circuits.graphql.types')
  109. ] = strawberry_django.field(select_related=["virtual_circuit"])
  110. interface: Annotated[
  111. "InterfaceType",
  112. strawberry.lazy('dcim.graphql.types')
  113. ] = strawberry_django.field(select_related=["interface"])
  114. @strawberry_django.type(
  115. models.VirtualCircuit,
  116. fields='__all__',
  117. filters=VirtualCircuitFilter
  118. )
  119. class VirtualCircuitType(NetBoxObjectType):
  120. provider_network: ProviderNetworkType = strawberry_django.field(select_related=["provider_network"])
  121. provider_account: ProviderAccountType | None
  122. tenant: TenantType | None
  123. terminations: List[VirtualCircuitTerminationType]