types.py 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  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.all()
  119. @strawberry_django.field
  120. def a_terminations(self) -> List[Annotated[Union[
  121. Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')],
  122. Annotated["ConsolePortType", strawberry.lazy('dcim.graphql.types')],
  123. Annotated["ConsoleServerPortType", strawberry.lazy('dcim.graphql.types')],
  124. Annotated["FrontPortType", strawberry.lazy('dcim.graphql.types')],
  125. Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')],
  126. Annotated["PowerFeedType", strawberry.lazy('dcim.graphql.types')],
  127. Annotated["PowerOutletType", strawberry.lazy('dcim.graphql.types')],
  128. Annotated["PowerPortType", strawberry.lazy('dcim.graphql.types')],
  129. Annotated["RearPortType", strawberry.lazy('dcim.graphql.types')],
  130. ], strawberry.union("CableTerminationTerminationType")]]:
  131. return self.a_terminations
  132. @strawberry_django.field
  133. def b_terminations(self) -> List[Annotated[Union[
  134. Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')],
  135. Annotated["ConsolePortType", strawberry.lazy('dcim.graphql.types')],
  136. Annotated["ConsoleServerPortType", strawberry.lazy('dcim.graphql.types')],
  137. Annotated["FrontPortType", strawberry.lazy('dcim.graphql.types')],
  138. Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')],
  139. Annotated["PowerFeedType", strawberry.lazy('dcim.graphql.types')],
  140. Annotated["PowerOutletType", strawberry.lazy('dcim.graphql.types')],
  141. Annotated["PowerPortType", strawberry.lazy('dcim.graphql.types')],
  142. Annotated["RearPortType", strawberry.lazy('dcim.graphql.types')],
  143. ], strawberry.union("CableTerminationTerminationType")]]:
  144. return self.b_terminations
  145. @strawberry_django.type(
  146. models.ConsolePort,
  147. exclude=('_path',),
  148. filters=ConsolePortFilter
  149. )
  150. class ConsolePortType(ComponentObjectType, CabledObjectMixin, PathEndpointMixin):
  151. pass
  152. @strawberry_django.type(
  153. models.ConsolePortTemplate,
  154. fields='__all__',
  155. filters=ConsolePortTemplateFilter
  156. )
  157. class ConsolePortTemplateType(ComponentTemplateObjectType):
  158. _name: str
  159. @strawberry_django.type(
  160. models.ConsoleServerPort,
  161. exclude=('_path',),
  162. filters=ConsoleServerPortFilter
  163. )
  164. class ConsoleServerPortType(ComponentObjectType, CabledObjectMixin, PathEndpointMixin):
  165. pass
  166. @strawberry_django.type(
  167. models.ConsoleServerPortTemplate,
  168. fields='__all__',
  169. filters=ConsoleServerPortTemplateFilter
  170. )
  171. class ConsoleServerPortTemplateType(ComponentTemplateObjectType):
  172. _name: str
  173. @strawberry_django.type(
  174. models.Device,
  175. fields='__all__',
  176. filters=DeviceFilter
  177. )
  178. class DeviceType(ConfigContextMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType):
  179. _name: str
  180. console_port_count: BigInt
  181. console_server_port_count: BigInt
  182. power_port_count: BigInt
  183. power_outlet_count: BigInt
  184. interface_count: BigInt
  185. front_port_count: BigInt
  186. rear_port_count: BigInt
  187. device_bay_count: BigInt
  188. module_bay_count: BigInt
  189. inventory_item_count: BigInt
  190. @strawberry_django.field
  191. def vc_master_for(self) -> Annotated["VirtualChassisType", strawberry.lazy('dcim.graphql.types')] | None:
  192. return self.vc_master_for if hasattr(self, 'vc_master_for') else None
  193. @strawberry_django.field
  194. def virtual_machines(self) -> List[Annotated["VirtualMachineType", strawberry.lazy('virtualization.graphql.types')]]:
  195. return self.virtual_machines.all()
  196. @strawberry_django.field
  197. def modules(self) -> List[Annotated["ModuleType", strawberry.lazy('dcim.graphql.types')]]:
  198. return self.modules.all()
  199. @strawberry_django.field
  200. def parent_bay(self) -> Annotated["DeviceBayType", strawberry.lazy('dcim.graphql.types')] | None:
  201. return self.parent_bay if hasattr(self, 'parent_bay') else None
  202. @strawberry_django.field
  203. def interfaces(self) -> List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]:
  204. return self.interfaces.all()
  205. @strawberry_django.field
  206. def rearports(self) -> List[Annotated["RearPortType", strawberry.lazy('dcim.graphql.types')]]:
  207. return self.rearports.all()
  208. @strawberry_django.field
  209. def consoleports(self) -> List[Annotated["ConsolePortType", strawberry.lazy('dcim.graphql.types')]]:
  210. return self.consoleports.all()
  211. @strawberry_django.field
  212. def powerports(self) -> List[Annotated["PowerPortType", strawberry.lazy('dcim.graphql.types')]]:
  213. return self.powerports.all()
  214. @strawberry_django.field
  215. def cabletermination_set(self) -> List[Annotated["CableTerminationType", strawberry.lazy('dcim.graphql.types')]]:
  216. return self.cabletermination_set.all()
  217. @strawberry_django.field
  218. def consoleserverports(self) -> List[Annotated["ConsoleServerPortType", strawberry.lazy('dcim.graphql.types')]]:
  219. return self.consoleserverports.all()
  220. @strawberry_django.field
  221. def poweroutlets(self) -> List[Annotated["PowerOutletType", strawberry.lazy('dcim.graphql.types')]]:
  222. return self.poweroutlets.all()
  223. @strawberry_django.field
  224. def frontports(self) -> List[Annotated["FrontPortType", strawberry.lazy('dcim.graphql.types')]]:
  225. return self.frontports.all()
  226. @strawberry_django.field
  227. def modulebays(self) -> List[Annotated["ModuleBayType", strawberry.lazy('dcim.graphql.types')]]:
  228. return self.modulebays.all()
  229. @strawberry_django.field
  230. def services(self) -> List[Annotated["ServiceType", strawberry.lazy('ipam.graphql.types')]]:
  231. return self.services.all()
  232. @strawberry_django.field
  233. def inventoryitems(self) -> List[Annotated["InventoryItemType", strawberry.lazy('dcim.graphql.types')]]:
  234. return self.inventoryitems.all()
  235. @strawberry_django.field
  236. def vdcs(self) -> List[Annotated["VirtualDeviceContextType", strawberry.lazy('dcim.graphql.types')]]:
  237. return self.vdcs.all()
  238. @strawberry_django.type(
  239. models.DeviceBay,
  240. fields='__all__',
  241. filters=DeviceBayFilter
  242. )
  243. class DeviceBayType(ComponentObjectType):
  244. pass
  245. @strawberry_django.type(
  246. models.DeviceBayTemplate,
  247. fields='__all__',
  248. filters=DeviceBayTemplateFilter
  249. )
  250. class DeviceBayTemplateType(ComponentTemplateObjectType):
  251. _name: str
  252. @strawberry_django.type(
  253. models.InventoryItemTemplate,
  254. exclude=('component_type', 'component_id', 'parent'),
  255. filters=InventoryItemTemplateFilter
  256. )
  257. class InventoryItemTemplateType(ComponentTemplateObjectType):
  258. _name: str
  259. @strawberry_django.field
  260. def parent(self) -> Annotated["InventoryItemTemplateType", strawberry.lazy('dcim.graphql.types')] | None:
  261. return self.parent
  262. @strawberry_django.field
  263. def child_items(self) -> List[Annotated["InventoryItemTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  264. return self.child_items.all()
  265. @strawberry_django.field
  266. def component(self) -> List[Annotated[Union[
  267. Annotated["ConsolePortType", strawberry.lazy('dcim.graphql.types')],
  268. Annotated["ConsoleServerPortType", strawberry.lazy('dcim.graphql.types')],
  269. Annotated["FrontPortType", strawberry.lazy('dcim.graphql.types')],
  270. Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')],
  271. Annotated["PowerOutletType", strawberry.lazy('dcim.graphql.types')],
  272. Annotated["PowerPortType", strawberry.lazy('dcim.graphql.types')],
  273. Annotated["RearPortType", strawberry.lazy('dcim.graphql.types')],
  274. ], strawberry.union("InventoryItemTemplateComponentType")]]:
  275. return self.component
  276. @strawberry_django.type(
  277. models.DeviceRole,
  278. fields='__all__',
  279. filters=DeviceRoleFilter
  280. )
  281. class DeviceRoleType(OrganizationalObjectType):
  282. color: str
  283. @strawberry_django.field
  284. def virtual_machines(self) -> List[Annotated["VirtualMachineType", strawberry.lazy('virtualization.graphql.types')]]:
  285. return self.virtual_machines.all()
  286. @strawberry_django.field
  287. def devices(self) -> List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]]:
  288. return self.devices.all()
  289. @strawberry_django.type(
  290. models.DeviceType,
  291. fields='__all__',
  292. filters=DeviceTypeFilter
  293. )
  294. class DeviceTypeType(NetBoxObjectType):
  295. console_port_template_count: BigInt
  296. console_server_port_template_count: BigInt
  297. power_port_template_count: BigInt
  298. power_outlet_template_count: BigInt
  299. interface_template_count: BigInt
  300. front_port_template_count: BigInt
  301. rear_port_template_count: BigInt
  302. device_bay_template_count: BigInt
  303. module_bay_template_count: BigInt
  304. inventory_item_template_count: BigInt
  305. front_image: strawberry_django.fields.types.DjangoImageType | None
  306. rear_image: strawberry_django.fields.types.DjangoImageType | None
  307. @strawberry_django.field
  308. def frontporttemplates(self) -> List[Annotated["FrontPortTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  309. return self.frontporttemplates.all()
  310. @strawberry_django.field
  311. def modulebaytemplates(self) -> List[Annotated["ModuleBayTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  312. return self.modulebaytemplates.all()
  313. @strawberry_django.field
  314. def instances(self) -> List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]]:
  315. return self.instances.all()
  316. @strawberry_django.field
  317. def poweroutlettemplates(self) -> List[Annotated["PowerOutletTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  318. return self.poweroutlettemplates.all()
  319. @strawberry_django.field
  320. def powerporttemplates(self) -> List[Annotated["PowerPortTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  321. return self.powerporttemplates.all()
  322. @strawberry_django.field
  323. def inventoryitemtemplates(self) -> List[Annotated["InventoryItemTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  324. return self.inventoryitemtemplates.all()
  325. @strawberry_django.field
  326. def rearporttemplates(self) -> List[Annotated["RearPortTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  327. return self.rearporttemplates.all()
  328. @strawberry_django.field
  329. def consoleserverporttemplates(self) -> List[Annotated["ConsoleServerPortTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  330. return self.consoleserverporttemplates.all()
  331. @strawberry_django.field
  332. def interfacetemplates(self) -> List[Annotated["InterfaceTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  333. return self.interfacetemplates.all()
  334. @strawberry_django.field
  335. def devicebaytemplates(self) -> List[Annotated["DeviceBayTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  336. return self.devicebaytemplates.all()
  337. @strawberry_django.field
  338. def consoleporttemplates(self) -> List[Annotated["ConsolePortTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  339. return self.consoleporttemplates.all()
  340. @strawberry_django.type(
  341. models.FrontPort,
  342. fields='__all__',
  343. filters=FrontPortFilter
  344. )
  345. class FrontPortType(ComponentObjectType, CabledObjectMixin):
  346. color: str
  347. @strawberry_django.type(
  348. models.FrontPortTemplate,
  349. fields='__all__',
  350. filters=FrontPortTemplateFilter
  351. )
  352. class FrontPortTemplateType(ComponentTemplateObjectType):
  353. _name: str
  354. color: str
  355. @strawberry_django.type(
  356. models.Interface,
  357. fields='__all__',
  358. filters=InterfaceFilter
  359. )
  360. class InterfaceType(IPAddressesMixin, ComponentObjectType, CabledObjectMixin, PathEndpointMixin):
  361. mac_address: str | None
  362. wwn: str | None
  363. @strawberry_django.field
  364. def vdcs(self) -> List[Annotated["VirtualDeviceContextType", strawberry.lazy('dcim.graphql.types')]]:
  365. return self.vdcs.all()
  366. @strawberry_django.field
  367. def tagged_vlans(self) -> List[Annotated["VLANType", strawberry.lazy('ipam.graphql.types')]]:
  368. return self.tagged_vlans.all()
  369. @strawberry_django.field
  370. def bridge_interfaces(self) -> List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]:
  371. return self.bridge_interfaces.all()
  372. @strawberry_django.field
  373. def wireless_lans(self) -> List[Annotated["WirelessLANType", strawberry.lazy('wireless.graphql.types')]]:
  374. return self.wireless_lans.all()
  375. @strawberry_django.field
  376. def member_interfaces(self) -> List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]:
  377. return self.member_interfaces.all()
  378. @strawberry_django.field
  379. def child_interfaces(self) -> List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]:
  380. return self.child_interfaces.all()
  381. @strawberry_django.field
  382. def ip_addresses(self) -> List[Annotated["IPAddressType", strawberry.lazy('ipam.graphql.types')]]:
  383. return self.ip_addresses.all()
  384. @strawberry_django.type(
  385. models.InterfaceTemplate,
  386. fields='__all__',
  387. filters=InterfaceTemplateFilter
  388. )
  389. class InterfaceTemplateType(ComponentTemplateObjectType):
  390. _name: str
  391. @strawberry_django.field
  392. def bridge_interfaces(self) -> List[Annotated["InterfaceTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  393. return self.bridge_interfaces.all()
  394. @strawberry_django.type(
  395. models.InventoryItem,
  396. exclude=('component_type', 'component_id', 'parent'),
  397. filters=InventoryItemFilter
  398. )
  399. class InventoryItemType(ComponentObjectType):
  400. @strawberry_django.field
  401. def parent(self) -> Annotated["InventoryItemType", strawberry.lazy('dcim.graphql.types')] | None:
  402. return self.parent
  403. @strawberry_django.field
  404. def child_items(self) -> List[Annotated["InventoryItemType", strawberry.lazy('dcim.graphql.types')]]:
  405. return self.child_items.all()
  406. @strawberry_django.field
  407. def component(self) -> List[Annotated[Union[
  408. Annotated["ConsolePortType", strawberry.lazy('dcim.graphql.types')],
  409. Annotated["ConsoleServerPortType", strawberry.lazy('dcim.graphql.types')],
  410. Annotated["FrontPortType", strawberry.lazy('dcim.graphql.types')],
  411. Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')],
  412. Annotated["PowerOutletType", strawberry.lazy('dcim.graphql.types')],
  413. Annotated["PowerPortType", strawberry.lazy('dcim.graphql.types')],
  414. Annotated["RearPortType", strawberry.lazy('dcim.graphql.types')],
  415. ], strawberry.union("InventoryItemComponentType")]]:
  416. return self.component
  417. @strawberry_django.type(
  418. models.InventoryItemRole,
  419. fields='__all__',
  420. filters=InventoryItemRoleFilter
  421. )
  422. class InventoryItemRoleType(OrganizationalObjectType):
  423. color: str
  424. @strawberry_django.field
  425. def inventory_items(self) -> List[Annotated["InventoryItemType", strawberry.lazy('dcim.graphql.types')]]:
  426. return self.inventory_items.all()
  427. @strawberry_django.field
  428. def inventory_item_templates(self) -> List[Annotated["InventoryItemTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  429. return self.inventory_item_templates.all()
  430. @strawberry_django.type(
  431. models.Location,
  432. # fields='__all__',
  433. exclude=('parent',), # bug - temp
  434. filters=LocationFilter
  435. )
  436. class LocationType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, OrganizationalObjectType):
  437. @strawberry_django.field
  438. def powerpanel_set(self) -> List[Annotated["PowerPanelType", strawberry.lazy('dcim.graphql.types')]]:
  439. return self.powerpanel_set.all()
  440. @strawberry_django.field
  441. def cabletermination_set(self) -> List[Annotated["CableTerminationType", strawberry.lazy('dcim.graphql.types')]]:
  442. return self.cabletermination_set.all()
  443. @strawberry_django.field
  444. def racks(self) -> List[Annotated["RackType", strawberry.lazy('dcim.graphql.types')]]:
  445. return self.racks.all()
  446. @strawberry_django.field
  447. def vlan_groups(self) -> List[Annotated["VLANGroupType", strawberry.lazy('ipam.graphql.types')]]:
  448. return self.vlan_groups.all()
  449. @strawberry_django.field
  450. def devices(self) -> List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]]:
  451. return self.devices.all()
  452. @strawberry_django.field
  453. def parent(self) -> Annotated["LocationType", strawberry.lazy('dcim.graphql.types')] | None:
  454. return self.parent
  455. @strawberry_django.field
  456. def children(self) -> List[Annotated["LocationType", strawberry.lazy('dcim.graphql.types')]]:
  457. return self.children.all()
  458. @strawberry_django.type(
  459. models.Manufacturer,
  460. fields='__all__',
  461. filters=ManufacturerFilter
  462. )
  463. class ManufacturerType(OrganizationalObjectType, ContactsMixin):
  464. @strawberry_django.field
  465. def platforms(self) -> List[Annotated["PlatformType", strawberry.lazy('dcim.graphql.types')]]:
  466. return self.platforms.all()
  467. @strawberry_django.field
  468. def device_types(self) -> List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]]:
  469. return self.device_types.all()
  470. @strawberry_django.field
  471. def inventory_item_templates(self) -> List[Annotated["InventoryItemTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  472. return self.inventory_item_templates.all()
  473. @strawberry_django.field
  474. def inventory_items(self) -> List[Annotated["InventoryItemType", strawberry.lazy('dcim.graphql.types')]]:
  475. return self.inventory_items.all()
  476. @strawberry_django.field
  477. def module_types(self) -> List[Annotated["ModuleType", strawberry.lazy('dcim.graphql.types')]]:
  478. return self.module_types.all()
  479. @strawberry_django.type(
  480. models.Module,
  481. fields='__all__',
  482. filters=ModuleFilter
  483. )
  484. class ModuleType(NetBoxObjectType):
  485. @strawberry_django.field
  486. def interfaces(self) -> List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]:
  487. return self.interfaces.all()
  488. @strawberry_django.field
  489. def powerports(self) -> List[Annotated["PowerPortType", strawberry.lazy('dcim.graphql.types')]]:
  490. return self.powerports.all()
  491. @strawberry_django.field
  492. def consoleserverports(self) -> List[Annotated["ConsoleServerPortType", strawberry.lazy('dcim.graphql.types')]]:
  493. return self.consoleserverports.all()
  494. @strawberry_django.field
  495. def consoleports(self) -> List[Annotated["ConsolePortType", strawberry.lazy('dcim.graphql.types')]]:
  496. return self.consoleports.all()
  497. @strawberry_django.field
  498. def poweroutlets(self) -> List[Annotated["PowerOutletType", strawberry.lazy('dcim.graphql.types')]]:
  499. return self.poweroutlets.all()
  500. @strawberry_django.field
  501. def rearports(self) -> List[Annotated["RearPortType", strawberry.lazy('dcim.graphql.types')]]:
  502. return self.rearports.all()
  503. @strawberry_django.field
  504. def frontports(self) -> List[Annotated["FrontPortType", strawberry.lazy('dcim.graphql.types')]]:
  505. return self.frontports.all()
  506. @strawberry_django.type(
  507. models.ModuleBay,
  508. fields='__all__',
  509. filters=ModuleBayFilter
  510. )
  511. class ModuleBayType(ComponentObjectType):
  512. @strawberry_django.field
  513. def installed_module(self) -> Annotated["ModuleType", strawberry.lazy('dcim.graphql.types')] | None:
  514. return self.installed_module if hasattr(self, 'installed_module') else None
  515. @strawberry_django.type(
  516. models.ModuleBayTemplate,
  517. fields='__all__',
  518. filters=ModuleBayTemplateFilter
  519. )
  520. class ModuleBayTemplateType(ComponentTemplateObjectType):
  521. _name: str
  522. @strawberry_django.type(
  523. models.ModuleType,
  524. fields='__all__',
  525. filters=ModuleTypeFilter
  526. )
  527. class ModuleTypeType(NetBoxObjectType):
  528. @strawberry_django.field
  529. def frontporttemplates(self) -> List[Annotated["FrontPortTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  530. return self.frontporttemplates.all()
  531. @strawberry_django.field
  532. def consoleserverporttemplates(self) -> List[Annotated["ConsoleServerPortTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  533. return self.consoleserverporttemplates.all()
  534. @strawberry_django.field
  535. def interfacetemplates(self) -> List[Annotated["InterfaceTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  536. return self.interfacetemplates.all()
  537. @strawberry_django.field
  538. def powerporttemplates(self) -> List[Annotated["PowerOutletTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  539. return self.powerporttemplates.all()
  540. @strawberry_django.field
  541. def poweroutlettemplates(self) -> List[Annotated["PowerOutletTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  542. return self.poweroutlettemplates.all()
  543. @strawberry_django.field
  544. def rearporttemplates(self) -> List[Annotated["RearPortTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  545. return self.rearporttemplates.all()
  546. @strawberry_django.field
  547. def instances(self) -> List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]:
  548. return self.instances.all()
  549. @strawberry_django.field
  550. def consoleporttemplates(self) -> List[Annotated["ModuleType", strawberry.lazy('dcim.graphql.types')]]:
  551. return self.consoleporttemplates.all()
  552. @strawberry_django.type(
  553. models.Platform,
  554. fields='__all__',
  555. filters=PlatformFilter
  556. )
  557. class PlatformType(OrganizationalObjectType):
  558. @strawberry_django.field
  559. def virtual_machines(self) -> List[Annotated["VirtualMachineType", strawberry.lazy('virtualization.graphql.types')]]:
  560. return self.virtual_machines.all()
  561. @strawberry_django.field
  562. def devices(self) -> List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]]:
  563. return self.devices.all()
  564. @strawberry_django.type(
  565. models.PowerFeed,
  566. exclude=('_path',),
  567. filters=PowerFeedFilter
  568. )
  569. class PowerFeedType(NetBoxObjectType, CabledObjectMixin, PathEndpointMixin):
  570. pass
  571. @strawberry_django.type(
  572. models.PowerOutlet,
  573. fields='__all__',
  574. filters=PowerOutletFilter
  575. )
  576. class PowerOutletType(ComponentObjectType, CabledObjectMixin, PathEndpointMixin):
  577. pass
  578. @strawberry_django.type(
  579. models.PowerOutletTemplate,
  580. fields='__all__',
  581. filters=PowerOutletTemplateFilter
  582. )
  583. class PowerOutletTemplateType(ComponentTemplateObjectType):
  584. _name: str
  585. @strawberry_django.type(
  586. models.PowerPanel,
  587. fields='__all__',
  588. filters=PowerPanelFilter
  589. )
  590. class PowerPanelType(NetBoxObjectType, ContactsMixin):
  591. @strawberry_django.field
  592. def powerfeeds(self) -> List[Annotated["PowerFeedType", strawberry.lazy('dcim.graphql.types')]]:
  593. return self.powerfeeds.all()
  594. @strawberry_django.type(
  595. models.PowerPort,
  596. exclude=('_path',),
  597. filters=PowerPortFilter
  598. )
  599. class PowerPortType(ComponentObjectType, CabledObjectMixin, PathEndpointMixin):
  600. @strawberry_django.field
  601. def poweroutlets(self) -> List[Annotated["PowerOutletType", strawberry.lazy('dcim.graphql.types')]]:
  602. return self.poweroutlets.all()
  603. @strawberry_django.type(
  604. models.PowerPortTemplate,
  605. fields='__all__',
  606. filters=PowerPortTemplateFilter
  607. )
  608. class PowerPortTemplateType(ComponentTemplateObjectType):
  609. _name: str
  610. @strawberry_django.field
  611. def poweroutlet_templates(self) -> List[Annotated["PowerOutletTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  612. return self.poweroutlet_templates.all()
  613. @strawberry_django.type(
  614. models.Rack,
  615. fields='__all__',
  616. filters=RackFilter
  617. )
  618. class RackType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType):
  619. _name: str
  620. @strawberry_django.field
  621. def reservations(self) -> List[Annotated["RackReservationType", strawberry.lazy('dcim.graphql.types')]]:
  622. return self.reservations.all()
  623. @strawberry_django.field
  624. def devices(self) -> List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]]:
  625. return self.devices.all()
  626. @strawberry_django.field
  627. def powerfeeds(self) -> List[Annotated["PowerFeedType", strawberry.lazy('dcim.graphql.types')]]:
  628. return self.powerfeeds.all()
  629. @strawberry_django.field
  630. def cabletermination_set(self) -> List[Annotated["CableTerminationType", strawberry.lazy('dcim.graphql.types')]]:
  631. return self.cabletermination_set.all()
  632. @strawberry_django.field
  633. def vlan_groups(self) -> List[Annotated["VLANGroupType", strawberry.lazy('ipam.graphql.types')]]:
  634. return self.vlan_groups.all()
  635. @strawberry_django.type(
  636. models.RackReservation,
  637. fields='__all__',
  638. filters=RackReservationFilter
  639. )
  640. class RackReservationType(NetBoxObjectType):
  641. units: List[int]
  642. @strawberry_django.type(
  643. models.RackRole,
  644. fields='__all__',
  645. filters=RackRoleFilter
  646. )
  647. class RackRoleType(OrganizationalObjectType):
  648. color: str
  649. @strawberry_django.field
  650. def racks(self) -> List[Annotated["RackType", strawberry.lazy('dcim.graphql.types')]]:
  651. return self.racks.all()
  652. @strawberry_django.type(
  653. models.RearPort,
  654. fields='__all__',
  655. filters=RearPortFilter
  656. )
  657. class RearPortType(ComponentObjectType, CabledObjectMixin):
  658. color: str
  659. @strawberry_django.field
  660. def frontports(self) -> List[Annotated["FrontPortType", strawberry.lazy('dcim.graphql.types')]]:
  661. return self.frontports.all()
  662. @strawberry_django.type(
  663. models.RearPortTemplate,
  664. fields='__all__',
  665. filters=RearPortTemplateFilter
  666. )
  667. class RearPortTemplateType(ComponentTemplateObjectType):
  668. _name: str
  669. color: str
  670. @strawberry_django.field
  671. def frontport_templates(self) -> List[Annotated["FrontPortTemplateType", strawberry.lazy('dcim.graphql.types')]]:
  672. return self.frontport_templates.all()
  673. @strawberry_django.type(
  674. models.Region,
  675. exclude=('parent',),
  676. # fields='__all__',
  677. filters=RegionFilter
  678. )
  679. class RegionType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType):
  680. @strawberry_django.field
  681. def sites(self) -> List[Annotated["SiteType", strawberry.lazy('dcim.graphql.types')]]:
  682. return self.sites.all()
  683. @strawberry_django.field
  684. def vlan_groups(self) -> List[Annotated["VLANGroupType", strawberry.lazy('ipam.graphql.types')]]:
  685. return self.vlan_groups.all()
  686. @strawberry_django.field
  687. def parent(self) -> Annotated["RegionType", strawberry.lazy('dcim.graphql.types')] | None:
  688. return self.parent
  689. @strawberry_django.field
  690. def children(self) -> List[Annotated["RegionType", strawberry.lazy('dcim.graphql.types')]]:
  691. return self.children.all()
  692. @strawberry_django.type(
  693. models.Site,
  694. fields='__all__',
  695. filters=SiteFilter
  696. )
  697. class SiteType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType):
  698. _name: str
  699. time_zone: str | None
  700. @strawberry_django.field
  701. def prefixes(self) -> List[Annotated["PrefixType", strawberry.lazy('ipam.graphql.types')]]:
  702. return self.prefixes.all()
  703. @strawberry_django.field
  704. def virtual_machines(self) -> List[Annotated["VirtualMachineType", strawberry.lazy('virtualization.graphql.types')]]:
  705. return self.virtual_machines.all()
  706. @strawberry_django.field
  707. def racks(self) -> List[Annotated["RackType", strawberry.lazy('dcim.graphql.types')]]:
  708. return self.racks.all()
  709. @strawberry_django.field
  710. def cabletermination_set(self) -> List[Annotated["CableTerminationType", strawberry.lazy('dcim.graphql.types')]]:
  711. return self.cabletermination_set.all()
  712. @strawberry_django.field
  713. def powerpanel_set(self) -> List[Annotated["PowerPanelType", strawberry.lazy('dcim.graphql.types')]]:
  714. return self.powerpanel_set.all()
  715. @strawberry_django.field
  716. def devices(self) -> List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]]:
  717. return self.devices.all()
  718. @strawberry_django.field
  719. def locations(self) -> List[Annotated["LocationType", strawberry.lazy('dcim.graphql.types')]]:
  720. return self.locations.all()
  721. @strawberry_django.field
  722. def asns(self) -> List[Annotated["ASNType", strawberry.lazy('ipam.graphql.types')]]:
  723. return self.asns.all()
  724. @strawberry_django.field
  725. def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]:
  726. return self.circuit_terminations.all()
  727. @strawberry_django.field
  728. def clusters(self) -> List[Annotated["ClusterType", strawberry.lazy('virtualization.graphql.types')]]:
  729. return self.clusters.all()
  730. @strawberry_django.field
  731. def vlans(self) -> List[Annotated["VLANType", strawberry.lazy('ipam.graphql.types')]]:
  732. return self.vlans.all()
  733. @strawberry_django.field
  734. def vlan_groups(self) -> List[Annotated["VLANGroupType", strawberry.lazy('ipam.graphql.types')]]:
  735. return self.vlan_groups.all()
  736. @strawberry_django.type(
  737. models.SiteGroup,
  738. # fields='__all__',
  739. exclude=('parent',), # bug - temp
  740. filters=SiteGroupFilter
  741. )
  742. class SiteGroupType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType):
  743. @strawberry_django.field
  744. def sites(self) -> List[Annotated["SiteType", strawberry.lazy('dcim.graphql.types')]]:
  745. return self.sites.all()
  746. @strawberry_django.field
  747. def vlan_groups(self) -> List[Annotated["VLANGroupType", strawberry.lazy('ipam.graphql.types')]]:
  748. return self.vlan_groups.all()
  749. @strawberry_django.field
  750. def parent(self) -> Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')] | None:
  751. return self.parent
  752. @strawberry_django.field
  753. def children(self) -> List[Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')]]:
  754. return self.children.all()
  755. @strawberry_django.type(
  756. models.VirtualChassis,
  757. fields='__all__',
  758. filters=VirtualChassisFilter
  759. )
  760. class VirtualChassisType(NetBoxObjectType):
  761. member_count: BigInt
  762. @strawberry_django.field
  763. def members(self) -> List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]]:
  764. return self.members.all()
  765. @strawberry_django.type(
  766. models.VirtualDeviceContext,
  767. fields='__all__',
  768. filters=VirtualDeviceContextFilter
  769. )
  770. class VirtualDeviceContextType(NetBoxObjectType):
  771. @strawberry_django.field
  772. def interfaces(self) -> List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]:
  773. return self.interfaces.all()