tables.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" 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. type = tables.Column(
  71. linkify=True
  72. )
  73. group = tables.Column(
  74. linkify=True
  75. )
  76. tenant = tables.Column(
  77. linkify=True
  78. )
  79. site = tables.Column(
  80. linkify=True
  81. )
  82. device_count = LinkedCountColumn(
  83. viewname='dcim:device_list',
  84. url_params={'cluster_id': 'pk'},
  85. verbose_name='Devices'
  86. )
  87. vm_count = LinkedCountColumn(
  88. viewname='virtualization:virtualmachine_list',
  89. url_params={'cluster_id': 'pk'},
  90. verbose_name='VMs'
  91. )
  92. comments = MarkdownColumn()
  93. tags = TagColumn(
  94. url_name='virtualization:cluster_list'
  95. )
  96. class Meta(BaseTable.Meta):
  97. model = Cluster
  98. fields = ('pk', 'id', 'name', 'type', 'group', 'tenant', 'site', 'comments', 'device_count', 'vm_count', 'tags')
  99. default_columns = ('pk', 'name', 'type', 'group', 'tenant', 'site', 'device_count', 'vm_count')
  100. #
  101. # Virtual machines
  102. #
  103. class VirtualMachineTable(BaseTable):
  104. pk = ToggleColumn()
  105. name = tables.Column(
  106. order_by=('_name',),
  107. linkify=True
  108. )
  109. status = ChoiceFieldColumn()
  110. cluster = tables.Column(
  111. linkify=True
  112. )
  113. role = ColoredLabelColumn()
  114. tenant = TenantColumn()
  115. comments = MarkdownColumn()
  116. primary_ip4 = tables.Column(
  117. linkify=True,
  118. verbose_name='IPv4 Address'
  119. )
  120. primary_ip6 = tables.Column(
  121. linkify=True,
  122. verbose_name='IPv6 Address'
  123. )
  124. primary_ip = tables.Column(
  125. linkify=True,
  126. order_by=('primary_ip4', 'primary_ip6'),
  127. verbose_name='IP Address'
  128. )
  129. tags = TagColumn(
  130. url_name='virtualization:virtualmachine_list'
  131. )
  132. class Meta(BaseTable.Meta):
  133. model = VirtualMachine
  134. fields = (
  135. 'pk', 'id', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'primary_ip4',
  136. 'primary_ip6', 'primary_ip', 'comments', 'tags',
  137. )
  138. default_columns = (
  139. 'pk', 'name', 'status', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk', 'primary_ip',
  140. )
  141. #
  142. # VM components
  143. #
  144. class VMInterfaceTable(BaseInterfaceTable):
  145. pk = ToggleColumn()
  146. virtual_machine = tables.Column(
  147. linkify=True
  148. )
  149. name = tables.Column(
  150. linkify=True
  151. )
  152. tags = TagColumn(
  153. url_name='virtualization:vminterface_list'
  154. )
  155. class Meta(BaseTable.Meta):
  156. model = VMInterface
  157. fields = (
  158. 'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'tags',
  159. 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans',
  160. )
  161. default_columns = ('pk', 'name', 'virtual_machine', 'enabled', 'description')
  162. class VirtualMachineVMInterfaceTable(VMInterfaceTable):
  163. parent = tables.Column(
  164. linkify=True
  165. )
  166. bridge = tables.Column(
  167. linkify=True
  168. )
  169. actions = ButtonsColumn(
  170. model=VMInterface,
  171. buttons=('edit', 'delete'),
  172. prepend_template=VMINTERFACE_BUTTONS
  173. )
  174. class Meta(BaseTable.Meta):
  175. model = VMInterface
  176. fields = (
  177. 'pk', 'id', 'name', 'enabled', 'parent', 'bridge', 'mac_address', 'mtu', 'mode', 'description', 'tags',
  178. 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'actions',
  179. )
  180. default_columns = (
  181. 'pk', 'name', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'ip_addresses', 'actions',
  182. )
  183. row_attrs = {
  184. 'data-name': lambda record: record.name,
  185. }