types.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  1. from typing import Annotated, List, Union
  2. import strawberry
  3. import strawberry_django
  4. from dcim import models
  5. from extras.graphql.mixins import (
  6. ChangelogMixin,
  7. ConfigContextMixin,
  8. ContactsMixin,
  9. CustomFieldsMixin,
  10. ImageAttachmentsMixin,
  11. TagsMixin,
  12. )
  13. from ipam.graphql.mixins import IPAddressesMixin, VLANGroupsMixin
  14. from netbox.graphql.scalars import BigInt
  15. from netbox.graphql.types import (
  16. BaseObjectType,
  17. NetBoxObjectType,
  18. OrganizationalObjectType,
  19. )
  20. from .filters import *
  21. from .mixins import CabledObjectMixin, PathEndpointMixin
  22. __all__ = (
  23. 'CableType',
  24. 'ComponentObjectType',
  25. 'ConsolePortType',
  26. 'ConsolePortTemplateType',
  27. 'ConsoleServerPortType',
  28. 'ConsoleServerPortTemplateType',
  29. 'DeviceType',
  30. 'DeviceBayType',
  31. 'DeviceBayTemplateType',
  32. 'DeviceRoleType',
  33. 'DeviceTypeType',
  34. 'FrontPortType',
  35. 'FrontPortTemplateType',
  36. 'InterfaceType',
  37. 'InterfaceTemplateType',
  38. 'InventoryItemType',
  39. 'InventoryItemRoleType',
  40. 'InventoryItemTemplateType',
  41. 'LocationType',
  42. 'ManufacturerType',
  43. 'ModuleType',
  44. 'ModuleBayType',
  45. 'ModuleBayTemplateType',
  46. 'ModuleTypeType',
  47. 'PlatformType',
  48. 'PowerFeedType',
  49. 'PowerOutletType',
  50. 'PowerOutletTemplateType',
  51. 'PowerPanelType',
  52. 'PowerPortType',
  53. 'PowerPortTemplateType',
  54. 'RackType',
  55. 'RackReservationType',
  56. 'RackRoleType',
  57. 'RearPortType',
  58. 'RearPortTemplateType',
  59. 'RegionType',
  60. 'SiteType',
  61. 'SiteGroupType',
  62. 'VirtualChassisType',
  63. 'VirtualDeviceContextType',
  64. )
  65. #
  66. # Base types
  67. #
  68. @strawberry.type
  69. class ComponentObjectType(
  70. ChangelogMixin,
  71. CustomFieldsMixin,
  72. TagsMixin,
  73. BaseObjectType
  74. ):
  75. """
  76. Base type for device/VM components
  77. """
  78. _name: str
  79. class ComponentTemplateObjectType(
  80. ChangelogMixin,
  81. BaseObjectType
  82. ):
  83. """
  84. Base type for device/VM components
  85. """
  86. _name: str
  87. #
  88. # Model types
  89. #
  90. @strawberry_django.type(
  91. models.CableTermination,
  92. exclude=('termination_type', 'termination_id'),
  93. filters=CableTerminationFilter
  94. )
  95. class CableTerminationType(NetBoxObjectType):
  96. @strawberry_django.field
  97. def termination(self) -> List[Annotated[Union[
  98. Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')],
  99. Annotated["ConsolePortType", strawberry.lazy('dcim.graphql.types')],
  100. Annotated["ConsoleServerPortType", strawberry.lazy('dcim.graphql.types')],
  101. Annotated["FrontPortType", strawberry.lazy('dcim.graphql.types')],
  102. Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')],
  103. Annotated["PowerFeedType", strawberry.lazy('dcim.graphql.types')],
  104. Annotated["PowerOutletType", strawberry.lazy('dcim.graphql.types')],
  105. Annotated["PowerPortType", strawberry.lazy('dcim.graphql.types')],
  106. Annotated["RearPortType", strawberry.lazy('dcim.graphql.types')],
  107. ], strawberry.union("CableTerminationTerminationType")]]:
  108. return self.termination
  109. @strawberry_django.type(
  110. models.Cable,
  111. fields='__all__',
  112. filters=CableFilter
  113. )
  114. class CableType(NetBoxObjectType):
  115. color: str
  116. @strawberry_django.field
  117. def terminations(self) -> List[CableTerminationType]:
  118. return self.terminations
  119. @strawberry_django.field
  120. def a_terminations(self) -> List[CableTerminationType]:
  121. return self.a_terminations
  122. @strawberry_django.field
  123. def b_terminations(self) -> List[CableTerminationType]:
  124. return self.b_terminations
  125. @strawberry_django.type(
  126. models.ConsolePort,
  127. # exclude=('_path',),
  128. exclude=('_path',), # bug - temp
  129. filters=ConsolePortFilter
  130. )
  131. class ConsolePortType(ComponentObjectType, CabledObjectMixin, PathEndpointMixin):
  132. def resolve_type(self, info):
  133. return self.type or None
  134. @strawberry_django.type(
  135. models.ConsolePortTemplate,
  136. fields='__all__',
  137. filters=ConsolePortTemplateFilter
  138. )
  139. class ConsolePortTemplateType(ComponentTemplateObjectType):
  140. _name: str
  141. def resolve_type(self, info):
  142. return self.type or None
  143. @strawberry_django.type(
  144. models.ConsoleServerPort,
  145. # exclude=('_path',),
  146. exclude=('_path',), # bug - temp
  147. filters=ConsoleServerPortFilter
  148. )
  149. class ConsoleServerPortType(ComponentObjectType, CabledObjectMixin, PathEndpointMixin):
  150. def resolve_type(self, info):
  151. return self.type or None
  152. @strawberry_django.type(
  153. models.ConsoleServerPortTemplate,
  154. fields='__all__',
  155. filters=ConsoleServerPortTemplateFilter
  156. )
  157. class ConsoleServerPortTemplateType(ComponentTemplateObjectType):
  158. def resolve_type(self, info):
  159. return self.type or None
  160. @strawberry_django.type(
  161. models.Device,
  162. fields='__all__',
  163. filters=DeviceFilter
  164. )
  165. class DeviceType(ConfigContextMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType):
  166. _name: str
  167. console_port_count: BigInt
  168. console_server_port_count: BigInt
  169. power_port_count: BigInt
  170. power_outlet_count: BigInt
  171. interface_count: BigInt
  172. front_port_count: BigInt
  173. rear_port_count: BigInt
  174. device_bay_count: BigInt
  175. module_bay_count: BigInt
  176. inventory_item_count: BigInt
  177. def resolve_face(self, info):
  178. return self.face or None
  179. def resolve_airflow(self, info):
  180. return self.airflow or None
  181. @strawberry_django.type(
  182. models.DeviceBay,
  183. fields='__all__',
  184. filters=DeviceBayFilter
  185. )
  186. class DeviceBayType(ComponentObjectType):
  187. pass
  188. @strawberry_django.type(
  189. models.DeviceBayTemplate,
  190. fields='__all__',
  191. filters=DeviceBayTemplateFilter
  192. )
  193. class DeviceBayTemplateType(ComponentTemplateObjectType):
  194. pass
  195. @strawberry_django.type(
  196. models.InventoryItemTemplate,
  197. exclude=('component_type', 'component_id', 'parent'),
  198. filters=InventoryItemTemplateFilter
  199. )
  200. class InventoryItemTemplateType(ComponentTemplateObjectType):
  201. # component = graphene.Field('dcim.graphql.gfk_mixins.InventoryItemTemplateComponentType')
  202. pass
  203. @strawberry_django.type(
  204. models.DeviceRole,
  205. # fields='__all__',
  206. exclude=('color',), # bug - temp
  207. filters=DeviceRoleFilter
  208. )
  209. class DeviceRoleType(OrganizationalObjectType):
  210. pass
  211. @strawberry_django.type(
  212. models.DeviceType,
  213. fields='__all__',
  214. filters=DeviceTypeFilter
  215. )
  216. class DeviceTypeType(NetBoxObjectType):
  217. console_port_template_count: BigInt
  218. console_server_port_template_count: BigInt
  219. power_port_template_count: BigInt
  220. power_outlet_template_count: BigInt
  221. interface_template_count: BigInt
  222. front_port_template_count: BigInt
  223. rear_port_template_count: BigInt
  224. device_bay_template_count: BigInt
  225. module_bay_template_count: BigInt
  226. inventory_item_template_count: BigInt
  227. def resolve_subdevice_role(self, info):
  228. return self.subdevice_role or None
  229. def resolve_airflow(self, info):
  230. return self.airflow or None
  231. def resolve_weight_unit(self, info):
  232. return self.weight_unit or None
  233. @strawberry_django.type(
  234. models.FrontPort,
  235. # fields='__all__',
  236. exclude=('color',), # bug - temp
  237. filters=FrontPortFilter
  238. )
  239. class FrontPortType(ComponentObjectType, CabledObjectMixin):
  240. pass
  241. @strawberry_django.type(
  242. models.FrontPortTemplate,
  243. # fields='__all__',
  244. exclude=('color',), # bug - temp
  245. filters=FrontPortTemplateFilter
  246. )
  247. class FrontPortTemplateType(ComponentTemplateObjectType):
  248. pass
  249. @strawberry_django.type(
  250. models.Interface,
  251. # fields='__all__',
  252. exclude=('mac_address', 'wwn'), # bug - temp
  253. filters=InterfaceFilter
  254. )
  255. class InterfaceType(IPAddressesMixin, ComponentObjectType, CabledObjectMixin, PathEndpointMixin):
  256. def resolve_poe_mode(self, info):
  257. return self.poe_mode or None
  258. def resolve_poe_type(self, info):
  259. return self.poe_type or None
  260. def resolve_mode(self, info):
  261. return self.mode or None
  262. def resolve_rf_role(self, info):
  263. return self.rf_role or None
  264. def resolve_rf_channel(self, info):
  265. return self.rf_channel or None
  266. @strawberry_django.type(
  267. models.InterfaceTemplate,
  268. fields='__all__',
  269. filters=InterfaceTemplateFilter
  270. )
  271. class InterfaceTemplateType(ComponentTemplateObjectType):
  272. def resolve_poe_mode(self, info):
  273. return self.poe_mode or None
  274. def resolve_poe_type(self, info):
  275. return self.poe_type or None
  276. def resolve_rf_role(self, info):
  277. return self.rf_role or None
  278. @strawberry_django.type(
  279. models.InventoryItem,
  280. exclude=('component_type', 'component_id', 'parent'),
  281. filters=InventoryItemFilter
  282. )
  283. class InventoryItemType(ComponentObjectType):
  284. # component = graphene.Field('dcim.graphql.gfk_mixins.InventoryItemComponentType')
  285. pass
  286. @strawberry_django.type(
  287. models.InventoryItemRole,
  288. # fields='__all__',
  289. exclude=('color',), # bug - temp
  290. filters=InventoryItemRoleFilter
  291. )
  292. class InventoryItemRoleType(OrganizationalObjectType):
  293. pass
  294. @strawberry_django.type(
  295. models.Location,
  296. # fields='__all__',
  297. exclude=('parent',), # bug - temp
  298. filters=LocationFilter
  299. )
  300. class LocationType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, OrganizationalObjectType):
  301. pass
  302. @strawberry_django.type(
  303. models.Manufacturer,
  304. fields='__all__',
  305. filters=ManufacturerFilter
  306. )
  307. class ManufacturerType(OrganizationalObjectType, ContactsMixin):
  308. pass
  309. @strawberry_django.type(
  310. models.Module,
  311. fields='__all__',
  312. filters=ModuleFilter
  313. )
  314. class ModuleType(ComponentObjectType):
  315. pass
  316. @strawberry_django.type(
  317. models.ModuleBay,
  318. fields='__all__',
  319. filters=ModuleBayFilter
  320. )
  321. class ModuleBayType(ComponentObjectType):
  322. pass
  323. @strawberry_django.type(
  324. models.ModuleBayTemplate,
  325. fields='__all__',
  326. filters=ModuleBayTemplateFilter
  327. )
  328. class ModuleBayTemplateType(ComponentTemplateObjectType):
  329. pass
  330. @strawberry_django.type(
  331. models.ModuleType,
  332. fields='__all__',
  333. filters=ModuleTypeFilter
  334. )
  335. class ModuleTypeType(NetBoxObjectType):
  336. def resolve_weight_unit(self, info):
  337. return self.weight_unit or None
  338. @strawberry_django.type(
  339. models.Platform,
  340. fields='__all__',
  341. filters=PlatformFilter
  342. )
  343. class PlatformType(OrganizationalObjectType):
  344. pass
  345. @strawberry_django.type(
  346. models.PowerFeed,
  347. exclude=('_path',),
  348. filters=PowerFeedFilter
  349. )
  350. class PowerFeedType(NetBoxObjectType, CabledObjectMixin, PathEndpointMixin):
  351. pass
  352. @strawberry_django.type(
  353. models.PowerOutlet,
  354. fields='__all__',
  355. filters=PowerOutletFilter
  356. )
  357. class PowerOutletType(ComponentObjectType, CabledObjectMixin, PathEndpointMixin):
  358. def resolve_feed_leg(self, info):
  359. return self.feed_leg or None
  360. def resolve_type(self, info):
  361. return self.type or None
  362. @strawberry_django.type(
  363. models.PowerOutletTemplate,
  364. fields='__all__',
  365. filters=PowerOutletTemplateFilter
  366. )
  367. class PowerOutletTemplateType(ComponentTemplateObjectType):
  368. def resolve_feed_leg(self, info):
  369. return self.feed_leg or None
  370. def resolve_type(self, info):
  371. return self.type or None
  372. @strawberry_django.type(
  373. models.PowerPanel,
  374. fields='__all__',
  375. filters=PowerPanelFilter
  376. )
  377. class PowerPanelType(NetBoxObjectType, ContactsMixin):
  378. pass
  379. @strawberry_django.type(
  380. models.PowerPort,
  381. exclude=('_path',),
  382. filters=PowerPortFilter
  383. )
  384. class PowerPortType(ComponentObjectType, CabledObjectMixin, PathEndpointMixin):
  385. def resolve_type(self, info):
  386. return self.type or None
  387. @strawberry_django.type(
  388. models.PowerPortTemplate,
  389. fields='__all__',
  390. filters=PowerPortTemplateFilter
  391. )
  392. class PowerPortTemplateType(ComponentTemplateObjectType):
  393. def resolve_type(self, info):
  394. return self.type or None
  395. @strawberry_django.type(
  396. models.Rack,
  397. fields='__all__',
  398. filters=RackFilter
  399. )
  400. class RackType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType):
  401. _name: str
  402. def resolve_type(self, info):
  403. return self.type or None
  404. def resolve_outer_unit(self, info):
  405. return self.outer_unit or None
  406. def resolve_weight_unit(self, info):
  407. return self.weight_unit or None
  408. @strawberry_django.type(
  409. models.RackReservation,
  410. # fields='__all__',
  411. exclude=('units',), # bug - temp
  412. filters=RackReservationFilter
  413. )
  414. class RackReservationType(NetBoxObjectType):
  415. pass
  416. @strawberry_django.type(
  417. models.RackRole,
  418. # fields='__all__',
  419. exclude=('color',), # bug - temp
  420. filters=RackRoleFilter
  421. )
  422. class RackRoleType(OrganizationalObjectType):
  423. pass
  424. @strawberry_django.type(
  425. models.RearPort,
  426. # fields='__all__',
  427. exclude=('color', ), # bug - temp
  428. filters=RearPortFilter
  429. )
  430. class RearPortType(ComponentObjectType, CabledObjectMixin):
  431. pass
  432. @strawberry_django.type(
  433. models.RearPortTemplate,
  434. # fields='__all__',
  435. exclude=('color', ), # bug - temp
  436. filters=RearPortTemplateFilter
  437. )
  438. class RearPortTemplateType(ComponentTemplateObjectType):
  439. pass
  440. @strawberry_django.type(
  441. models.Region,
  442. # fields='__all__',
  443. exclude=('parent',), # bug - temp
  444. filters=RegionFilter
  445. )
  446. class RegionType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType):
  447. pass
  448. @strawberry_django.type(
  449. models.Site,
  450. # fields='__all__',
  451. exclude=('time_zone',), # bug - temp
  452. filters=SiteFilter
  453. )
  454. class SiteType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType):
  455. _name: str
  456. asn: BigInt
  457. @strawberry_django.type(
  458. models.SiteGroup,
  459. # fields='__all__',
  460. exclude=('parent',), # bug - temp
  461. filters=SiteGroupFilter
  462. )
  463. class SiteGroupType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType):
  464. pass
  465. @strawberry_django.type(
  466. models.VirtualChassis,
  467. fields='__all__',
  468. filters=VirtualChassisFilter
  469. )
  470. class VirtualChassisType(NetBoxObjectType):
  471. member_count: BigInt
  472. @strawberry_django.type(
  473. models.VirtualDeviceContext,
  474. fields='__all__',
  475. filters=VirtualDeviceContextFilter
  476. )
  477. class VirtualDeviceContextType(NetBoxObjectType):
  478. pass