vlans.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  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. utilization = columns.UtilizationColumn(
  48. orderable=False,
  49. verbose_name=_('Utilization')
  50. )
  51. tags = columns.TagColumn(
  52. url_name='ipam:vlangroup_list'
  53. )
  54. actions = columns.ActionsColumn(
  55. extra_buttons=VLANGROUP_BUTTONS
  56. )
  57. class Meta(OrganizationalModelTable.Meta):
  58. model = VLANGroup
  59. fields = (
  60. 'pk', 'id', 'name', 'scope_type', 'scope', 'vid_ranges_list', 'vlan_count', 'slug', 'description',
  61. 'tenant', 'tenant_group', 'comments', 'tags', 'created', 'last_updated', 'actions', 'utilization',
  62. )
  63. default_columns = (
  64. 'pk', 'name', 'scope_type', 'scope', 'vlan_count', 'utilization', 'tenant', 'description'
  65. )
  66. #
  67. # VLANs
  68. #
  69. class VLANTable(TenancyColumnsMixin, PrimaryModelTable):
  70. vid = tables.TemplateColumn(
  71. template_code=VLAN_LINK,
  72. verbose_name=_('VID')
  73. )
  74. name = tables.Column(
  75. verbose_name=_('Name'),
  76. linkify=True
  77. )
  78. site = tables.Column(
  79. verbose_name=_('Site'),
  80. linkify=True
  81. )
  82. group = tables.Column(
  83. verbose_name=_('Group'),
  84. linkify=True
  85. )
  86. status = columns.ChoiceFieldColumn(
  87. verbose_name=_('Status'),
  88. default=AVAILABLE_LABEL
  89. )
  90. role = tables.Column(
  91. verbose_name=_('Role'),
  92. linkify=True
  93. )
  94. qinq_role = columns.ChoiceFieldColumn(
  95. verbose_name=_('Q-in-Q role')
  96. )
  97. qinq_svlan = tables.Column(
  98. verbose_name=_('Q-in-Q SVLAN'),
  99. linkify=True
  100. )
  101. l2vpn = tables.Column(
  102. accessor=tables.A('l2vpn_termination__l2vpn'),
  103. linkify=True,
  104. orderable=False,
  105. verbose_name=_('L2VPN')
  106. )
  107. prefixes = columns.TemplateColumn(
  108. template_code=VLAN_PREFIXES,
  109. orderable=False,
  110. verbose_name=_('Prefixes')
  111. )
  112. tags = columns.TagColumn(
  113. url_name='ipam:vlan_list'
  114. )
  115. class Meta(PrimaryModelTable.Meta):
  116. model = VLAN
  117. fields = (
  118. 'pk', 'id', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'tenant_group', 'status', 'role',
  119. 'qinq_role', 'qinq_svlan', 'description', 'comments', 'tags', 'l2vpn', 'created', 'last_updated',
  120. )
  121. default_columns = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description')
  122. row_attrs = {
  123. 'class': lambda record: 'success' if not isinstance(record, VLAN) else '',
  124. }
  125. class VLANMembersTable(NetBoxTable):
  126. """
  127. Base table for Interface and VMInterface assignments
  128. """
  129. name = tables.Column(
  130. linkify=True,
  131. verbose_name=_('Interface')
  132. )
  133. tagged = tables.TemplateColumn(
  134. verbose_name=_('Tagged'),
  135. template_code=VLAN_MEMBER_TAGGED,
  136. orderable=False
  137. )
  138. class VLANDevicesTable(VLANMembersTable):
  139. device = tables.Column(
  140. verbose_name=_('Device'),
  141. linkify=True
  142. )
  143. actions = columns.ActionsColumn(
  144. actions=('edit',)
  145. )
  146. link_peer = columns.TemplateColumn(
  147. accessor='link_peers',
  148. template_code=LINKTERMINATION,
  149. orderable=False,
  150. verbose_name=_('Link Peers'),
  151. )
  152. # Override PathEndpointTable.connection to accommodate virtual circuits
  153. connection = columns.TemplateColumn(
  154. accessor='_path__destinations',
  155. template_code=INTERFACE_LINKTERMINATION,
  156. orderable=False,
  157. verbose_name=_('Connection'),
  158. )
  159. class Meta(NetBoxTable.Meta):
  160. model = Interface
  161. fields = ('device', 'name', 'link_peer', 'connection', 'tagged', 'actions')
  162. default_columns = ('device', 'name', 'connection', 'tagged', 'actions')
  163. exclude = ('id',)
  164. class VLANVirtualMachinesTable(VLANMembersTable):
  165. virtual_machine = tables.Column(
  166. verbose_name=_('Virtual Machine'),
  167. linkify=True
  168. )
  169. actions = columns.ActionsColumn(
  170. actions=('edit',)
  171. )
  172. class Meta(NetBoxTable.Meta):
  173. model = VMInterface
  174. fields = ('virtual_machine', 'name', 'tagged', 'actions')
  175. exclude = ('id', )
  176. #
  177. # VLAN Translation
  178. #
  179. class VLANTranslationPolicyTable(PrimaryModelTable):
  180. name = tables.Column(
  181. verbose_name=_('Name'),
  182. linkify=True
  183. )
  184. rule_count = columns.LinkedCountColumn(
  185. viewname='ipam:vlantranslationrule_list',
  186. url_params={'policy_id': 'pk'},
  187. verbose_name=_('Rules')
  188. )
  189. description = tables.Column(
  190. verbose_name=_('Description'),
  191. )
  192. tags = columns.TagColumn(
  193. url_name='ipam:vlantranslationpolicy_list'
  194. )
  195. class Meta(PrimaryModelTable.Meta):
  196. model = VLANTranslationPolicy
  197. fields = (
  198. 'pk', 'id', 'name', 'rule_count', 'description', 'tags', 'created', 'last_updated',
  199. )
  200. default_columns = ('pk', 'name', 'rule_count', 'description')
  201. class VLANTranslationRuleTable(NetBoxTable):
  202. policy = tables.Column(
  203. verbose_name=_('Policy'),
  204. linkify=True
  205. )
  206. local_vid = tables.Column(
  207. verbose_name=_('Local VID'),
  208. linkify=True
  209. )
  210. remote_vid = tables.Column(
  211. verbose_name=_('Remote VID'),
  212. )
  213. description = tables.Column(
  214. verbose_name=_('Description'),
  215. )
  216. tags = columns.TagColumn(
  217. url_name='ipam:vlantranslationrule_list'
  218. )
  219. class Meta(NetBoxTable.Meta):
  220. model = VLANTranslationRule
  221. fields = (
  222. 'pk', 'id', 'policy', 'local_vid', 'remote_vid', 'description', 'tags', 'created', 'last_updated',
  223. )
  224. default_columns = ('pk', 'policy', 'local_vid', 'remote_vid', 'description')