virtualmachines.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. import django_tables2 as tables
  2. from django.utils.translation import gettext_lazy as _
  3. from dcim.tables.devices import BaseInterfaceTable
  4. from netbox.tables import NetBoxTable, columns
  5. from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin
  6. from utilities.templatetags.helpers import humanize_disk_megabytes
  7. from virtualization.models import VirtualDisk, VirtualMachine, VMInterface
  8. from .template_code import *
  9. __all__ = (
  10. 'VirtualDiskTable',
  11. 'VirtualMachineTable',
  12. 'VirtualMachineVirtualDiskTable',
  13. 'VirtualMachineVMInterfaceTable',
  14. 'VMInterfaceTable',
  15. )
  16. #
  17. # Virtual machines
  18. #
  19. class VirtualMachineTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
  20. name = tables.Column(
  21. verbose_name=_('Name'),
  22. linkify=True
  23. )
  24. status = columns.ChoiceFieldColumn(
  25. verbose_name=_('Status'),
  26. )
  27. site = tables.Column(
  28. verbose_name=_('Site'),
  29. linkify=True
  30. )
  31. cluster = tables.Column(
  32. verbose_name=_('Cluster'),
  33. linkify=True
  34. )
  35. device = tables.Column(
  36. verbose_name=_('Device'),
  37. linkify=True
  38. )
  39. role = columns.ColoredLabelColumn(
  40. verbose_name=_('Role'),
  41. )
  42. platform = tables.Column(
  43. linkify=True,
  44. verbose_name=_('Platform')
  45. )
  46. comments = columns.MarkdownColumn(
  47. verbose_name=_('Comments'),
  48. )
  49. primary_ip4 = tables.Column(
  50. linkify=True,
  51. verbose_name=_('IPv4 Address')
  52. )
  53. primary_ip6 = tables.Column(
  54. linkify=True,
  55. verbose_name=_('IPv6 Address')
  56. )
  57. primary_ip = tables.Column(
  58. linkify=True,
  59. order_by=('primary_ip4', 'primary_ip6'),
  60. verbose_name=_('IP Address')
  61. )
  62. tags = columns.TagColumn(
  63. url_name='virtualization:virtualmachine_list'
  64. )
  65. interface_count = tables.Column(
  66. verbose_name=_('Interfaces')
  67. )
  68. virtual_disk_count = tables.Column(
  69. verbose_name=_('Virtual Disks')
  70. )
  71. config_template = tables.Column(
  72. verbose_name=_('Config Template'),
  73. linkify=True
  74. )
  75. disk = tables.Column(
  76. verbose_name=_('Disk'),
  77. )
  78. class Meta(NetBoxTable.Meta):
  79. model = VirtualMachine
  80. fields = (
  81. 'pk', 'id', 'name', 'status', 'site', 'cluster', 'device', 'role', 'tenant', 'tenant_group', 'vcpus',
  82. 'memory', 'disk', 'primary_ip4', 'primary_ip6', 'primary_ip', 'description', 'comments', 'config_template',
  83. 'serial', 'contacts', 'tags', 'created', 'last_updated',
  84. )
  85. default_columns = (
  86. 'pk', 'name', 'status', 'site', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk', 'primary_ip',
  87. )
  88. def render_disk(self, value):
  89. return humanize_disk_megabytes(value)
  90. #
  91. # VM components
  92. #
  93. class VMInterfaceTable(BaseInterfaceTable):
  94. virtual_machine = tables.Column(
  95. verbose_name=_('Virtual Machine'),
  96. linkify=True
  97. )
  98. name = tables.Column(
  99. verbose_name=_('Name'),
  100. linkify=True
  101. )
  102. vrf = tables.Column(
  103. verbose_name=_('VRF'),
  104. linkify=True
  105. )
  106. tags = columns.TagColumn(
  107. url_name='virtualization:vminterface_list'
  108. )
  109. class Meta(NetBoxTable.Meta):
  110. model = VMInterface
  111. fields = (
  112. 'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mtu', 'mode', 'description', 'tags', 'vrf',
  113. 'primary_mac_address', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans',
  114. 'qinq_svlan', 'created', 'last_updated', 'vlan_translation_policy',
  115. )
  116. default_columns = ('pk', 'name', 'virtual_machine', 'enabled', 'description')
  117. class VirtualMachineVMInterfaceTable(VMInterfaceTable):
  118. parent = tables.Column(
  119. verbose_name=_('Parent'),
  120. linkify=True
  121. )
  122. bridge = tables.Column(
  123. verbose_name=_('Bridge'),
  124. linkify=True
  125. )
  126. actions = columns.ActionsColumn(
  127. actions=('edit', 'delete'),
  128. extra_buttons=VMINTERFACE_BUTTONS
  129. )
  130. class Meta(NetBoxTable.Meta):
  131. model = VMInterface
  132. fields = (
  133. 'pk', 'id', 'name', 'enabled', 'parent', 'bridge', 'primary_mac_address', 'mtu', 'mode', 'description',
  134. 'tags', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans',
  135. 'qinq_svlan', 'actions',
  136. )
  137. default_columns = ('pk', 'name', 'enabled', 'primary_mac_address', 'mtu', 'mode', 'description', 'ip_addresses')
  138. row_attrs = {
  139. 'data-name': lambda record: record.name,
  140. 'data-virtual': lambda record: "true",
  141. 'data-enabled': lambda record: "true" if record.enabled else "false",
  142. }
  143. class VirtualDiskTable(NetBoxTable):
  144. virtual_machine = tables.Column(
  145. verbose_name=_('Virtual Machine'),
  146. linkify=True
  147. )
  148. name = tables.Column(
  149. verbose_name=_('Name'),
  150. linkify=True
  151. )
  152. size = tables.Column(
  153. verbose_name=_('Size')
  154. )
  155. tags = columns.TagColumn(
  156. url_name='virtualization:virtualdisk_list'
  157. )
  158. class Meta(NetBoxTable.Meta):
  159. model = VirtualDisk
  160. fields = (
  161. 'pk', 'id', 'virtual_machine', 'name', 'size', 'description', 'tags',
  162. )
  163. default_columns = ('pk', 'name', 'virtual_machine', 'size', 'description')
  164. row_attrs = {
  165. 'data-name': lambda record: record.name,
  166. }
  167. def render_size(self, value):
  168. return humanize_disk_megabytes(value)
  169. class VirtualMachineVirtualDiskTable(VirtualDiskTable):
  170. actions = columns.ActionsColumn(
  171. actions=('edit', 'delete'),
  172. )
  173. class Meta(VirtualDiskTable.Meta):
  174. fields = (
  175. 'pk', 'id', 'name', 'size', 'description', 'tags', 'actions',
  176. )
  177. default_columns = ('pk', 'name', 'size', 'description')