types.py 30 KB

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