tables.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import django_tables2 as tables
  2. from django.conf import settings
  3. from dcim.tables.devices import BaseInterfaceTable
  4. from tenancy.tables import TenantColumn
  5. from utilities.tables import (
  6. BaseTable, ButtonsColumn, ChoiceFieldColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, TagColumn,
  7. ToggleColumn,
  8. )
  9. from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
  10. __all__ = (
  11. 'ClusterTable',
  12. 'ClusterGroupTable',
  13. 'ClusterTypeTable',
  14. 'VirtualMachineTable',
  15. 'VirtualMachineVMInterfaceTable',
  16. 'VMInterfaceTable',
  17. )
  18. VMINTERFACE_BUTTONS = """
  19. {% if perms.ipam.add_ipaddress %}
  20. <a href="{% url 'ipam:ipaddress_add' %}?vminterface={{ record.pk }}&return_url={{ virtualmachine.get_absolute_url }}" class="btn btn-sm btn-success" title="Add IP Address">
  21. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  22. </a>
  23. {% endif %}
  24. """
  25. #
  26. # Cluster types
  27. #
  28. class ClusterTypeTable(BaseTable):
  29. pk = ToggleColumn()
  30. name = tables.Column(
  31. linkify=True
  32. )
  33. cluster_count = tables.Column(
  34. verbose_name='Clusters'
  35. )
  36. tags = TagColumn(
  37. url_name='virtualization:clustertype_list'
  38. )
  39. actions = ButtonsColumn(ClusterType)
  40. class Meta(BaseTable.Meta):
  41. model = ClusterType
  42. fields = ('pk', 'name', 'slug', 'cluster_count', 'description', 'tags', 'actions')
  43. default_columns = ('pk', 'name', 'cluster_count', 'description', 'actions')
  44. #
  45. # Cluster groups
  46. #
  47. class ClusterGroupTable(BaseTable):
  48. pk = ToggleColumn()
  49. name = tables.Column(
  50. linkify=True
  51. )
  52. cluster_count = tables.Column(
  53. verbose_name='Clusters'
  54. )
  55. tags = TagColumn(
  56. url_name='virtualization:clustergroup_list'
  57. )
  58. actions = ButtonsColumn(ClusterGroup)
  59. class Meta(BaseTable.Meta):
  60. model = ClusterGroup
  61. fields = ('pk', 'name', 'slug', 'cluster_count', 'description', 'tags', 'actions')
  62. default_columns = ('pk', 'name', 'cluster_count', 'description', 'actions')
  63. #
  64. # Clusters
  65. #
  66. class ClusterTable(BaseTable):
  67. pk = ToggleColumn()
  68. name = tables.Column(
  69. linkify=True
  70. )
  71. tenant = tables.Column(
  72. linkify=True
  73. )
  74. site = tables.Column(
  75. linkify=True
  76. )
  77. device_count = LinkedCountColumn(
  78. viewname='dcim:device_list',
  79. url_params={'cluster_id': 'pk'},
  80. verbose_name='Devices'
  81. )
  82. vm_count = LinkedCountColumn(
  83. viewname='virtualization:virtualmachine_list',
  84. url_params={'cluster_id': 'pk'},
  85. verbose_name='VMs'
  86. )
  87. comments = MarkdownColumn()
  88. tags = TagColumn(
  89. url_name='virtualization:cluster_list'
  90. )
  91. class Meta(BaseTable.Meta):
  92. model = Cluster
  93. fields = ('pk', 'name', 'type', 'group', 'tenant', 'site', 'comments', 'device_count', 'vm_count', 'tags')
  94. default_columns = ('pk', 'name', 'type', 'group', 'tenant', 'site', 'device_count', 'vm_count')
  95. #
  96. # Virtual machines
  97. #
  98. class VirtualMachineTable(BaseTable):
  99. pk = ToggleColumn()
  100. name = tables.Column(
  101. linkify=True
  102. )
  103. status = ChoiceFieldColumn()
  104. cluster = tables.Column(
  105. linkify=True
  106. )
  107. role = ColoredLabelColumn()
  108. tenant = TenantColumn()
  109. comments = MarkdownColumn()
  110. primary_ip4 = tables.Column(
  111. linkify=True,
  112. verbose_name='IPv4 Address'
  113. )
  114. primary_ip6 = tables.Column(
  115. linkify=True,
  116. verbose_name='IPv6 Address'
  117. )
  118. primary_ip = tables.Column(
  119. linkify=True,
  120. order_by=('primary_ip4', 'primary_ip6'),
  121. verbose_name='IP Address'
  122. )
  123. tags = TagColumn(
  124. url_name='virtualization:virtualmachine_list'
  125. )
  126. class Meta(BaseTable.Meta):
  127. model = VirtualMachine
  128. fields = (
  129. 'pk', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'primary_ip4',
  130. 'primary_ip6', 'primary_ip', 'comments', 'tags',
  131. )
  132. default_columns = (
  133. 'pk', 'name', 'status', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk', 'primary_ip',
  134. )
  135. #
  136. # VM components
  137. #
  138. class VMInterfaceTable(BaseInterfaceTable):
  139. pk = ToggleColumn()
  140. virtual_machine = tables.Column(
  141. linkify=True
  142. )
  143. name = tables.Column(
  144. linkify=True
  145. )
  146. tags = TagColumn(
  147. url_name='virtualization:vminterface_list'
  148. )
  149. class Meta(BaseTable.Meta):
  150. model = VMInterface
  151. fields = (
  152. 'pk', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'tags',
  153. 'ip_addresses', 'untagged_vlan', 'tagged_vlans',
  154. )
  155. default_columns = ('pk', 'name', 'virtual_machine', 'enabled', 'description')
  156. class VirtualMachineVMInterfaceTable(VMInterfaceTable):
  157. parent = tables.Column(
  158. linkify=True
  159. )
  160. bridge = tables.Column(
  161. linkify=True
  162. )
  163. actions = ButtonsColumn(
  164. model=VMInterface,
  165. buttons=('edit', 'delete'),
  166. prepend_template=VMINTERFACE_BUTTONS
  167. )
  168. class Meta(BaseTable.Meta):
  169. model = VMInterface
  170. fields = (
  171. 'pk', 'name', 'enabled', 'parent', 'bridge', 'mac_address', 'mtu', 'mode', 'description', 'tags',
  172. 'ip_addresses', 'untagged_vlan', 'tagged_vlans', 'actions',
  173. )
  174. default_columns = (
  175. 'pk', 'name', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'ip_addresses', 'actions',
  176. )
  177. row_attrs = {
  178. 'data-name': lambda record: record.name,
  179. }