tables.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import django_tables2 as tables
  2. from dcim.tables.devices import BaseInterfaceTable
  3. from tenancy.tables import COL_TENANT
  4. from utilities.tables import (
  5. BaseTable, ButtonsColumn, ChoiceFieldColumn, ColoredLabelColumn, LinkedCountColumn, TagColumn, ToggleColumn,
  6. )
  7. from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
  8. __all__ = (
  9. 'ClusterTable',
  10. 'ClusterGroupTable',
  11. 'ClusterTypeTable',
  12. 'VirtualMachineDetailTable',
  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-xs 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.LinkColumn()
  30. cluster_count = tables.Column(
  31. verbose_name='Clusters'
  32. )
  33. actions = ButtonsColumn(ClusterType, pk_field='slug')
  34. class Meta(BaseTable.Meta):
  35. model = ClusterType
  36. fields = ('pk', 'name', 'slug', 'cluster_count', 'description', 'actions')
  37. default_columns = ('pk', 'name', 'cluster_count', 'description', 'actions')
  38. #
  39. # Cluster groups
  40. #
  41. class ClusterGroupTable(BaseTable):
  42. pk = ToggleColumn()
  43. name = tables.LinkColumn()
  44. cluster_count = tables.Column(
  45. verbose_name='Clusters'
  46. )
  47. actions = ButtonsColumn(ClusterGroup, pk_field='slug')
  48. class Meta(BaseTable.Meta):
  49. model = ClusterGroup
  50. fields = ('pk', 'name', 'slug', 'cluster_count', 'description', 'actions')
  51. default_columns = ('pk', 'name', 'cluster_count', 'description', 'actions')
  52. #
  53. # Clusters
  54. #
  55. class ClusterTable(BaseTable):
  56. pk = ToggleColumn()
  57. name = tables.LinkColumn()
  58. tenant = tables.Column(
  59. linkify=True
  60. )
  61. site = tables.Column(
  62. linkify=True
  63. )
  64. device_count = LinkedCountColumn(
  65. viewname='dcim:device_list',
  66. url_params={'cluster_id': 'pk'},
  67. verbose_name='Devices'
  68. )
  69. vm_count = LinkedCountColumn(
  70. viewname='virtualization:virtualmachine_list',
  71. url_params={'cluster_id': 'pk'},
  72. verbose_name='VMs'
  73. )
  74. tags = TagColumn(
  75. url_name='virtualization:cluster_list'
  76. )
  77. class Meta(BaseTable.Meta):
  78. model = Cluster
  79. fields = ('pk', 'name', 'type', 'group', 'tenant', 'site', 'device_count', 'vm_count', 'tags')
  80. default_columns = ('pk', 'name', 'type', 'group', 'tenant', 'site', 'device_count', 'vm_count')
  81. #
  82. # Virtual machines
  83. #
  84. class VirtualMachineTable(BaseTable):
  85. pk = ToggleColumn()
  86. name = tables.LinkColumn()
  87. status = ChoiceFieldColumn()
  88. cluster = tables.Column(
  89. linkify=True
  90. )
  91. role = ColoredLabelColumn()
  92. tenant = tables.TemplateColumn(
  93. template_code=COL_TENANT
  94. )
  95. class Meta(BaseTable.Meta):
  96. model = VirtualMachine
  97. fields = ('pk', 'name', 'status', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk')
  98. class VirtualMachineDetailTable(VirtualMachineTable):
  99. primary_ip4 = tables.Column(
  100. linkify=True,
  101. verbose_name='IPv4 Address'
  102. )
  103. primary_ip6 = tables.Column(
  104. linkify=True,
  105. verbose_name='IPv6 Address'
  106. )
  107. primary_ip = tables.Column(
  108. linkify=True,
  109. verbose_name='IP Address'
  110. )
  111. tags = TagColumn(
  112. url_name='virtualization:virtualmachine_list'
  113. )
  114. class Meta(BaseTable.Meta):
  115. model = VirtualMachine
  116. fields = (
  117. 'pk', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'primary_ip4',
  118. 'primary_ip6', 'primary_ip', 'tags',
  119. )
  120. default_columns = (
  121. 'pk', 'name', 'status', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk', 'primary_ip',
  122. )
  123. #
  124. # VM components
  125. #
  126. class VMInterfaceTable(BaseInterfaceTable):
  127. pk = ToggleColumn()
  128. virtual_machine = tables.LinkColumn()
  129. name = tables.Column(
  130. linkify=True
  131. )
  132. tags = TagColumn(
  133. url_name='virtualization:vminterface_list'
  134. )
  135. class Meta(BaseTable.Meta):
  136. model = VMInterface
  137. fields = (
  138. 'pk', 'virtual_machine', 'name', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'tags',
  139. 'ip_addresses', 'untagged_vlan', 'tagged_vlans',
  140. )
  141. default_columns = ('pk', 'virtual_machine', 'name', 'enabled', 'description')
  142. class VirtualMachineVMInterfaceTable(VMInterfaceTable):
  143. actions = ButtonsColumn(
  144. model=VMInterface,
  145. buttons=('edit', 'delete'),
  146. prepend_template=VMINTERFACE_BUTTONS
  147. )
  148. class Meta(BaseTable.Meta):
  149. model = VMInterface
  150. fields = (
  151. 'pk', 'name', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'tags', 'ip_addresses',
  152. 'untagged_vlan', 'tagged_vlans', 'actions',
  153. )
  154. default_columns = (
  155. 'pk', 'name', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'ip_addresses', 'actions',
  156. )
  157. row_attrs = {
  158. 'data-name': lambda record: record.name,
  159. }