tables.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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 = (
  42. 'pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'tags', 'actions', 'created', 'last_updated',
  43. )
  44. default_columns = ('pk', 'name', 'cluster_count', 'description', 'actions')
  45. #
  46. # Cluster groups
  47. #
  48. class ClusterGroupTable(BaseTable):
  49. pk = ToggleColumn()
  50. name = tables.Column(
  51. linkify=True
  52. )
  53. cluster_count = tables.Column(
  54. verbose_name='Clusters'
  55. )
  56. contacts = tables.ManyToManyColumn(
  57. linkify_item=True
  58. )
  59. tags = TagColumn(
  60. url_name='virtualization:clustergroup_list'
  61. )
  62. actions = ButtonsColumn(ClusterGroup)
  63. class Meta(BaseTable.Meta):
  64. model = ClusterGroup
  65. fields = (
  66. 'pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'contacts', 'tags', 'actions', 'created', 'last_updated',
  67. )
  68. default_columns = ('pk', 'name', 'cluster_count', 'description', 'actions')
  69. #
  70. # Clusters
  71. #
  72. class ClusterTable(BaseTable):
  73. pk = ToggleColumn()
  74. name = tables.Column(
  75. linkify=True
  76. )
  77. type = tables.Column(
  78. linkify=True
  79. )
  80. group = tables.Column(
  81. linkify=True
  82. )
  83. tenant = tables.Column(
  84. linkify=True
  85. )
  86. site = tables.Column(
  87. linkify=True
  88. )
  89. device_count = LinkedCountColumn(
  90. viewname='dcim:device_list',
  91. url_params={'cluster_id': 'pk'},
  92. verbose_name='Devices'
  93. )
  94. vm_count = LinkedCountColumn(
  95. viewname='virtualization:virtualmachine_list',
  96. url_params={'cluster_id': 'pk'},
  97. verbose_name='VMs'
  98. )
  99. contacts = tables.ManyToManyColumn(
  100. linkify_item=True
  101. )
  102. comments = MarkdownColumn()
  103. tags = TagColumn(
  104. url_name='virtualization:cluster_list'
  105. )
  106. class Meta(BaseTable.Meta):
  107. model = Cluster
  108. fields = (
  109. 'pk', 'id', 'name', 'type', 'group', 'tenant', 'site', 'comments', 'device_count', 'vm_count', 'contacts', 'tags',
  110. 'created', 'last_updated',
  111. )
  112. default_columns = ('pk', 'name', 'type', 'group', 'tenant', 'site', 'device_count', 'vm_count')
  113. #
  114. # Virtual machines
  115. #
  116. class VirtualMachineTable(BaseTable):
  117. pk = ToggleColumn()
  118. name = tables.Column(
  119. order_by=('_name',),
  120. linkify=True
  121. )
  122. status = ChoiceFieldColumn()
  123. cluster = tables.Column(
  124. linkify=True
  125. )
  126. role = ColoredLabelColumn()
  127. tenant = TenantColumn()
  128. comments = MarkdownColumn()
  129. primary_ip4 = tables.Column(
  130. linkify=True,
  131. verbose_name='IPv4 Address'
  132. )
  133. primary_ip6 = tables.Column(
  134. linkify=True,
  135. verbose_name='IPv6 Address'
  136. )
  137. primary_ip = tables.Column(
  138. linkify=True,
  139. order_by=('primary_ip4', 'primary_ip6'),
  140. verbose_name='IP Address'
  141. )
  142. contacts = tables.ManyToManyColumn(
  143. linkify_item=True
  144. )
  145. tags = TagColumn(
  146. url_name='virtualization:virtualmachine_list'
  147. )
  148. class Meta(BaseTable.Meta):
  149. model = VirtualMachine
  150. fields = (
  151. 'pk', 'id', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk',
  152. 'primary_ip4', 'primary_ip6', 'primary_ip', 'comments', 'contacts', 'tags', 'created', 'last_updated',
  153. )
  154. default_columns = (
  155. 'pk', 'name', 'status', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk', 'primary_ip',
  156. )
  157. #
  158. # VM components
  159. #
  160. class VMInterfaceTable(BaseInterfaceTable):
  161. pk = ToggleColumn()
  162. virtual_machine = tables.Column(
  163. linkify=True
  164. )
  165. name = tables.Column(
  166. linkify=True
  167. )
  168. tags = TagColumn(
  169. url_name='virtualization:vminterface_list'
  170. )
  171. class Meta(BaseTable.Meta):
  172. model = VMInterface
  173. fields = (
  174. 'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'tags',
  175. 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'created', 'last_updated',
  176. )
  177. default_columns = ('pk', 'name', 'virtual_machine', 'enabled', 'description')
  178. class VirtualMachineVMInterfaceTable(VMInterfaceTable):
  179. parent = tables.Column(
  180. linkify=True
  181. )
  182. bridge = tables.Column(
  183. linkify=True
  184. )
  185. actions = ButtonsColumn(
  186. model=VMInterface,
  187. buttons=('edit', 'delete'),
  188. prepend_template=VMINTERFACE_BUTTONS
  189. )
  190. class Meta(BaseTable.Meta):
  191. model = VMInterface
  192. fields = (
  193. 'pk', 'id', 'name', 'enabled', 'parent', 'bridge', 'mac_address', 'mtu', 'mode', 'description', 'tags',
  194. 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'actions',
  195. )
  196. default_columns = (
  197. 'pk', 'name', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'ip_addresses', 'actions',
  198. )
  199. row_attrs = {
  200. 'data-name': lambda record: record.name,
  201. }