vlans.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. import django_tables2 as tables
  2. from django.utils.safestring import mark_safe
  3. from django.utils.translation import gettext_lazy as _
  4. from dcim.models import Interface
  5. from dcim.tables.template_code import INTERFACE_LINKTERMINATION, LINKTERMINATION
  6. from ipam.models import *
  7. from netbox.tables import NetBoxTable, OrganizationalModelTable, PrimaryModelTable, columns
  8. from tenancy.tables import TenancyColumnsMixin
  9. from virtualization.models import VMInterface
  10. from .template_code import *
  11. __all__ = (
  12. 'VLANDevicesTable',
  13. 'VLANGroupTable',
  14. 'VLANMembersTable',
  15. 'VLANTable',
  16. 'VLANTranslationPolicyTable',
  17. 'VLANTranslationRuleTable',
  18. 'VLANVirtualMachinesTable',
  19. )
  20. AVAILABLE_LABEL = mark_safe('<span class="badge text-bg-success">Available</span>')
  21. #
  22. # VLAN groups
  23. #
  24. class VLANGroupTable(TenancyColumnsMixin, OrganizationalModelTable):
  25. name = tables.Column(
  26. verbose_name=_('Name'),
  27. linkify=True
  28. )
  29. scope_type = columns.ContentTypeColumn(
  30. verbose_name=_('Scope Type'),
  31. )
  32. scope = tables.Column(
  33. verbose_name=_('Scope'),
  34. linkify=True,
  35. orderable=False
  36. )
  37. vid_ranges_list = columns.ArrayColumn(
  38. accessor='vid_ranges_items',
  39. verbose_name=_('VID Ranges'),
  40. orderable=False
  41. )
  42. vlan_count = columns.LinkedCountColumn(
  43. viewname='ipam:vlan_list',
  44. url_params={'group_id': 'pk'},
  45. verbose_name=_('VLANs')
  46. )
  47. total_vlan_ids = tables.Column(
  48. verbose_name=_('Total VLAN IDs'),
  49. )
  50. utilization = columns.UtilizationColumn(
  51. orderable=False,
  52. verbose_name=_('Utilization')
  53. )
  54. tags = columns.TagColumn(
  55. url_name='ipam:vlangroup_list'
  56. )
  57. actions = columns.ActionsColumn(
  58. extra_buttons=VLANGROUP_BUTTONS
  59. )
  60. class Meta(OrganizationalModelTable.Meta):
  61. model = VLANGroup
  62. fields = (
  63. 'pk', 'id', 'name', 'slug', 'description', 'scope_type', 'scope', 'vid_ranges_list', 'vlan_count',
  64. 'total_vlan_ids', 'tenant', 'tenant_group', 'comments', 'tags', 'created', 'last_updated', 'actions',
  65. 'utilization',
  66. )
  67. default_columns = (
  68. 'pk', 'name', 'scope_type', 'scope', 'vlan_count', 'utilization', 'tenant', 'description'
  69. )
  70. #
  71. # VLANs
  72. #
  73. class VLANTable(TenancyColumnsMixin, PrimaryModelTable):
  74. vid = tables.TemplateColumn(
  75. template_code=VLAN_LINK,
  76. verbose_name=_('VID')
  77. )
  78. name = tables.Column(
  79. verbose_name=_('Name'),
  80. linkify=True
  81. )
  82. site = tables.Column(
  83. verbose_name=_('Site'),
  84. linkify=True
  85. )
  86. group = tables.Column(
  87. verbose_name=_('Group'),
  88. linkify=True
  89. )
  90. status = columns.ChoiceFieldColumn(
  91. verbose_name=_('Status'),
  92. default=AVAILABLE_LABEL
  93. )
  94. role = tables.Column(
  95. verbose_name=_('Role'),
  96. linkify=True
  97. )
  98. qinq_role = columns.ChoiceFieldColumn(
  99. verbose_name=_('Q-in-Q role')
  100. )
  101. qinq_svlan = tables.Column(
  102. verbose_name=_('Q-in-Q SVLAN'),
  103. linkify=True
  104. )
  105. l2vpn = tables.Column(
  106. accessor=tables.A('l2vpn_termination__l2vpn'),
  107. linkify=True,
  108. orderable=False,
  109. verbose_name=_('L2VPN')
  110. )
  111. prefixes = columns.TemplateColumn(
  112. template_code=VLAN_PREFIXES,
  113. orderable=False,
  114. verbose_name=_('Prefixes')
  115. )
  116. tags = columns.TagColumn(
  117. url_name='ipam:vlan_list'
  118. )
  119. class Meta(PrimaryModelTable.Meta):
  120. model = VLAN
  121. fields = (
  122. 'pk', 'id', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'tenant_group', 'status', 'role',
  123. 'qinq_role', 'qinq_svlan', 'description', 'comments', 'tags', 'l2vpn', 'created', 'last_updated',
  124. )
  125. default_columns = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description')
  126. row_attrs = {
  127. 'class': lambda record: 'success' if not isinstance(record, VLAN) else '',
  128. }
  129. class VLANMembersTable(NetBoxTable):
  130. """
  131. Base table for Interface and VMInterface assignments
  132. """
  133. name = tables.Column(
  134. linkify=True,
  135. verbose_name=_('Interface')
  136. )
  137. tagged = tables.TemplateColumn(
  138. verbose_name=_('Tagged'),
  139. template_code=VLAN_MEMBER_TAGGED,
  140. orderable=False
  141. )
  142. class VLANDevicesTable(VLANMembersTable):
  143. device = tables.Column(
  144. verbose_name=_('Device'),
  145. linkify=True
  146. )
  147. actions = columns.ActionsColumn(
  148. actions=('edit',)
  149. )
  150. link_peer = columns.TemplateColumn(
  151. accessor='link_peers',
  152. template_code=LINKTERMINATION,
  153. orderable=False,
  154. verbose_name=_('Link Peers'),
  155. )
  156. # Override PathEndpointTable.connection to accommodate virtual circuits
  157. connection = columns.TemplateColumn(
  158. accessor='_path__destinations',
  159. template_code=INTERFACE_LINKTERMINATION,
  160. orderable=False,
  161. verbose_name=_('Connection'),
  162. )
  163. class Meta(NetBoxTable.Meta):
  164. model = Interface
  165. fields = ('device', 'name', 'link_peer', 'connection', 'tagged', 'actions')
  166. default_columns = ('device', 'name', 'connection', 'tagged', 'actions')
  167. exclude = ('id',)
  168. class VLANVirtualMachinesTable(VLANMembersTable):
  169. virtual_machine = tables.Column(
  170. verbose_name=_('Virtual Machine'),
  171. linkify=True
  172. )
  173. actions = columns.ActionsColumn(
  174. actions=('edit',)
  175. )
  176. class Meta(NetBoxTable.Meta):
  177. model = VMInterface
  178. fields = ('virtual_machine', 'name', 'tagged', 'actions')
  179. exclude = ('id', )
  180. #
  181. # VLAN Translation
  182. #
  183. class VLANTranslationPolicyTable(PrimaryModelTable):
  184. name = tables.Column(
  185. verbose_name=_('Name'),
  186. linkify=True
  187. )
  188. rule_count = columns.LinkedCountColumn(
  189. viewname='ipam:vlantranslationrule_list',
  190. url_params={'policy_id': 'pk'},
  191. verbose_name=_('Rules')
  192. )
  193. description = tables.Column(
  194. verbose_name=_('Description'),
  195. )
  196. tags = columns.TagColumn(
  197. url_name='ipam:vlantranslationpolicy_list'
  198. )
  199. class Meta(PrimaryModelTable.Meta):
  200. model = VLANTranslationPolicy
  201. fields = (
  202. 'pk', 'id', 'name', 'rule_count', 'description', 'tags', 'created', 'last_updated',
  203. )
  204. default_columns = ('pk', 'name', 'rule_count', 'description')
  205. class VLANTranslationRuleTable(NetBoxTable):
  206. policy = tables.Column(
  207. verbose_name=_('Policy'),
  208. linkify=True
  209. )
  210. local_vid = tables.Column(
  211. verbose_name=_('Local VID'),
  212. linkify=True
  213. )
  214. remote_vid = tables.Column(
  215. verbose_name=_('Remote VID'),
  216. )
  217. description = tables.Column(
  218. verbose_name=_('Description'),
  219. )
  220. tags = columns.TagColumn(
  221. url_name='ipam:vlantranslationrule_list'
  222. )
  223. class Meta(NetBoxTable.Meta):
  224. model = VLANTranslationRule
  225. fields = (
  226. 'pk', 'id', 'policy', 'local_vid', 'remote_vid', 'description', 'tags', 'created', 'last_updated',
  227. )
  228. default_columns = ('pk', 'policy', 'local_vid', 'remote_vid', 'description')