virtualmachines.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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 virtualization.models import VirtualMachine, VMInterface
  7. __all__ = (
  8. 'VirtualMachineTable',
  9. 'VirtualMachineVMInterfaceTable',
  10. 'VMInterfaceTable',
  11. )
  12. VMINTERFACE_BUTTONS = """
  13. {% if perms.virtualization.change_vminterface %}
  14. <span class="dropdown">
  15. <button type="button" class="btn btn-primary btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="Add">
  16. <span class="mdi mdi-plus-thick" aria-hidden="true"></span>
  17. </button>
  18. <ul class="dropdown-menu dropdown-menu-end">
  19. {% if perms.ipam.add_ipaddress %}
  20. <li><a class="dropdown-item" href="{% url 'ipam:ipaddress_add' %}?vminterface={{ record.pk }}&return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}">IP Address</a></li>
  21. {% endif %}
  22. {% if perms.ipam.add_l2vpntermination %}
  23. <li><a class="dropdown-item" href="{% url 'ipam:l2vpntermination_add' %}?virtual_machine={{ object.pk }}&vminterface={{ record.pk }}&return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}">L2VPN Termination</a></li>
  24. {% endif %}
  25. {% if perms.ipam.add_fhrpgroupassignment %}
  26. <li><a class="dropdown-item" href="{% url 'ipam:fhrpgroupassignment_add' %}?interface_type={{ record|content_type_id }}&interface_id={{ record.pk }}&return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}">Assign FHRP Group</a></li>
  27. {% endif %}
  28. </ul>
  29. </span>
  30. {% endif %}
  31. """
  32. #
  33. # Virtual machines
  34. #
  35. class VirtualMachineTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
  36. name = tables.Column(
  37. verbose_name=_('Name'),
  38. order_by=('_name',),
  39. linkify=True
  40. )
  41. status = columns.ChoiceFieldColumn(
  42. verbose_name=_('Status'),
  43. )
  44. site = tables.Column(
  45. verbose_name=_('Site'),
  46. linkify=True
  47. )
  48. cluster = tables.Column(
  49. verbose_name=_('Cluster'),
  50. linkify=True
  51. )
  52. device = tables.Column(
  53. verbose_name=_('Device'),
  54. linkify=True
  55. )
  56. role = columns.ColoredLabelColumn(
  57. verbose_name=_('Role'),
  58. )
  59. comments = columns.MarkdownColumn(
  60. verbose_name=_('Comments'),
  61. )
  62. primary_ip4 = tables.Column(
  63. linkify=True,
  64. verbose_name=_('IPv4 Address')
  65. )
  66. primary_ip6 = tables.Column(
  67. linkify=True,
  68. verbose_name=_('IPv6 Address')
  69. )
  70. primary_ip = tables.Column(
  71. linkify=True,
  72. order_by=('primary_ip4', 'primary_ip6'),
  73. verbose_name=_('IP Address')
  74. )
  75. tags = columns.TagColumn(
  76. url_name='virtualization:virtualmachine_list'
  77. )
  78. interface_count = tables.Column(
  79. verbose_name=_('Interfaces')
  80. )
  81. config_template = tables.Column(
  82. verbose_name=_('Config Template'),
  83. linkify=True
  84. )
  85. class Meta(NetBoxTable.Meta):
  86. model = VirtualMachine
  87. fields = (
  88. 'pk', 'id', 'name', 'status', 'site', 'cluster', 'device', 'role', 'tenant', 'tenant_group', 'platform',
  89. 'vcpus', 'memory', 'disk', 'primary_ip4', 'primary_ip6', 'primary_ip', 'description', 'comments',
  90. 'config_template', 'contacts', 'tags', 'created', 'last_updated',
  91. )
  92. default_columns = (
  93. 'pk', 'name', 'status', 'site', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk', 'primary_ip',
  94. )
  95. #
  96. # VM components
  97. #
  98. class VMInterfaceTable(BaseInterfaceTable):
  99. virtual_machine = tables.Column(
  100. verbose_name=_('Virtual Machine'),
  101. linkify=True
  102. )
  103. name = tables.Column(
  104. verbose_name=_('Name'),
  105. linkify=True
  106. )
  107. vrf = tables.Column(
  108. verbose_name=_('VRF'),
  109. linkify=True
  110. )
  111. tags = columns.TagColumn(
  112. url_name='virtualization:vminterface_list'
  113. )
  114. class Meta(NetBoxTable.Meta):
  115. model = VMInterface
  116. fields = (
  117. 'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'tags',
  118. 'vrf', 'l2vpn', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'created', 'last_updated',
  119. )
  120. default_columns = ('pk', 'name', 'virtual_machine', 'enabled', 'description')
  121. class VirtualMachineVMInterfaceTable(VMInterfaceTable):
  122. parent = tables.Column(
  123. verbose_name=_('Parent'),
  124. linkify=True
  125. )
  126. bridge = tables.Column(
  127. verbose_name=_('Bridge'),
  128. linkify=True
  129. )
  130. actions = columns.ActionsColumn(
  131. actions=('edit', 'delete'),
  132. extra_buttons=VMINTERFACE_BUTTONS
  133. )
  134. class Meta(NetBoxTable.Meta):
  135. model = VMInterface
  136. fields = (
  137. 'pk', 'id', 'name', 'enabled', 'parent', 'bridge', 'mac_address', 'mtu', 'mode', 'description', 'tags',
  138. 'vrf', 'l2vpn', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'actions',
  139. )
  140. default_columns = ('pk', 'name', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'ip_addresses')
  141. row_attrs = {
  142. 'data-name': lambda record: record.name,
  143. }