tables.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import django_tables2 as tables
  2. from dcim.tables.devices import BaseInterfaceTable
  3. from tenancy.tables import TenantColumn
  4. from utilities.tables import (
  5. BaseTable, ButtonsColumn, ChoiceFieldColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, TagColumn,
  6. ToggleColumn,
  7. )
  8. from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
  9. __all__ = (
  10. 'ClusterTable',
  11. 'ClusterGroupTable',
  12. 'ClusterTypeTable',
  13. 'VirtualMachineTable',
  14. 'VirtualMachineVMInterfaceTable',
  15. 'VMInterfaceTable',
  16. )
  17. VMINTERFACE_BUTTONS = """
  18. {% if perms.ipam.add_ipaddress %}
  19. <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">
  20. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  21. </a>
  22. {% endif %}
  23. """
  24. #
  25. # Cluster types
  26. #
  27. class ClusterTypeTable(BaseTable):
  28. pk = ToggleColumn()
  29. name = tables.Column(
  30. linkify=True
  31. )
  32. cluster_count = tables.Column(
  33. verbose_name='Clusters'
  34. )
  35. tags = TagColumn(
  36. url_name='virtualization:clustertype_list'
  37. )
  38. actions = ButtonsColumn(ClusterType)
  39. class Meta(BaseTable.Meta):
  40. model = ClusterType
  41. fields = ('pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'tags', 'actions')
  42. default_columns = ('pk', 'name', 'cluster_count', 'description', 'actions')
  43. #
  44. # Cluster groups
  45. #
  46. class ClusterGroupTable(BaseTable):
  47. pk = ToggleColumn()
  48. name = tables.Column(
  49. linkify=True
  50. )
  51. cluster_count = tables.Column(
  52. verbose_name='Clusters'
  53. )
  54. tags = TagColumn(
  55. url_name='virtualization:clustergroup_list'
  56. )
  57. actions = ButtonsColumn(ClusterGroup)
  58. class Meta(BaseTable.Meta):
  59. model = ClusterGroup
  60. fields = ('pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'tags', 'actions')
  61. default_columns = ('pk', 'name', 'cluster_count', 'description', 'actions')
  62. #
  63. # Clusters
  64. #
  65. class ClusterTable(BaseTable):
  66. pk = ToggleColumn()
  67. name = tables.Column(
  68. linkify=True
  69. )
  70. tenant = tables.Column(
  71. linkify=True
  72. )
  73. site = tables.Column(
  74. linkify=True
  75. )
  76. device_count = LinkedCountColumn(
  77. viewname='dcim:device_list',
  78. url_params={'cluster_id': 'pk'},
  79. verbose_name='Devices'
  80. )
  81. vm_count = LinkedCountColumn(
  82. viewname='virtualization:virtualmachine_list',
  83. url_params={'cluster_id': 'pk'},
  84. verbose_name='VMs'
  85. )
  86. comments = MarkdownColumn()
  87. tags = TagColumn(
  88. url_name='virtualization:cluster_list'
  89. )
  90. class Meta(BaseTable.Meta):
  91. model = Cluster
  92. fields = ('pk', 'id', 'name', 'type', 'group', 'tenant', 'site', 'comments', 'device_count', 'vm_count', 'tags')
  93. default_columns = ('pk', 'name', 'type', 'group', 'tenant', 'site', 'device_count', 'vm_count')
  94. #
  95. # Virtual machines
  96. #
  97. class VirtualMachineTable(BaseTable):
  98. pk = ToggleColumn()
  99. name = tables.Column(
  100. order_by=('_name',),
  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', 'id', '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', 'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'tags',
  153. 'ip_addresses', 'fhrp_groups', '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', 'id', 'name', 'enabled', 'parent', 'bridge', 'mac_address', 'mtu', 'mode', 'description', 'tags',
  172. 'ip_addresses', 'fhrp_groups', '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. }