Coverage for virtualization/tables/virtualmachines.py: 95%
81 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1import django_tables2 as tables
2from django.utils.translation import gettext_lazy as _
4from dcim.tables.devices import BaseInterfaceTable
5from netbox.tables import NetBoxTable, PrimaryModelTable, columns
6from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin
7from utilities.templatetags.helpers import humanize_disk_capacity, humanize_ram_capacity
9from ..models import VirtualDisk, VirtualMachine, VirtualMachineType, VMInterface
10from .template_code import *
12__all__ = (
13 'VMInterfaceTable',
14 'VirtualDiskTable',
15 'VirtualMachineTable',
16 'VirtualMachineTypeTable',
17 'VirtualMachineVMInterfaceTable',
18 'VirtualMachineVirtualDiskTable',
19)
21#
22# Virtual machine types
23#
26class VirtualMachineTypeTable(PrimaryModelTable):
27 name = tables.Column(
28 verbose_name=_('Name'),
29 linkify=True,
30 )
31 default_platform = tables.Column(
32 verbose_name=_('Default platform'),
33 linkify=True,
34 )
35 virtual_machine_count = tables.Column(
36 verbose_name=_('VM count')
37 )
38 tags = columns.TagColumn(
39 url_name='virtualization:virtualmachinetype_list'
40 )
42 class Meta(PrimaryModelTable.Meta):
43 model = VirtualMachineType
44 fields = (
45 'pk', 'id', 'name', 'slug', 'default_platform', 'default_vcpus', 'default_memory', 'virtual_machine_count',
46 'description', 'comments', 'tags', 'created', 'last_updated',
47 )
48 default_columns = (
49 'pk', 'name', 'default_platform', 'default_vcpus', 'default_memory', 'virtual_machine_count', 'description',
50 )
52 def render_default_memory(self, value):
53 return humanize_ram_capacity(value)
56#
57# Virtual machines
58#
61class VirtualMachineTable(TenancyColumnsMixin, ContactsColumnMixin, PrimaryModelTable):
62 name = tables.Column(
63 verbose_name=_('Name'),
64 linkify=True
65 )
66 virtual_machine_type = tables.Column(
67 verbose_name=_('Type'),
68 linkify=True,
69 )
70 status = columns.ChoiceFieldColumn(
71 verbose_name=_('Status'),
72 )
73 start_on_boot = columns.ChoiceFieldColumn(
74 verbose_name=_('Start on boot'),
75 )
76 site = tables.Column(
77 verbose_name=_('Site'),
78 linkify=True
79 )
80 cluster = tables.Column(
81 verbose_name=_('Cluster'),
82 linkify=True
83 )
84 device = tables.Column(
85 verbose_name=_('Device'),
86 linkify=True
87 )
88 role = columns.ColoredLabelColumn(
89 verbose_name=_('Role'),
90 )
91 platform = tables.Column(
92 linkify=True,
93 verbose_name=_('Platform')
94 )
95 primary_ip4 = tables.Column(
96 linkify=True,
97 verbose_name=_('IPv4 Address')
98 )
99 primary_ip6 = tables.Column(
100 linkify=True,
101 verbose_name=_('IPv6 Address')
102 )
103 primary_ip = tables.Column(
104 linkify=True,
105 order_by=('primary_ip4', 'primary_ip6'),
106 verbose_name=_('IP Address')
107 )
108 tags = columns.TagColumn(
109 url_name='virtualization:virtualmachine_list'
110 )
111 interface_count = tables.Column(
112 verbose_name=_('Interfaces')
113 )
114 virtual_disk_count = tables.Column(
115 verbose_name=_('Virtual Disks')
116 )
117 config_template = tables.Column(
118 verbose_name=_('Config Template'),
119 linkify=True
120 )
121 disk = tables.Column(
122 verbose_name=_('Disk'),
123 )
125 class Meta(PrimaryModelTable.Meta):
126 model = VirtualMachine
127 fields = (
128 'pk', 'id', 'name', 'virtual_machine_type', 'role', 'status', 'start_on_boot', 'site', 'cluster', 'device',
129 'platform', 'primary_ip4', 'primary_ip6', 'primary_ip', 'vcpus', 'memory', 'disk', 'description', 'serial',
130 'tenant_group', 'tenant', 'contacts', 'comments', 'tags', 'config_template', 'created', 'last_updated',
131 )
132 default_columns = (
133 'pk', 'name', 'virtual_machine_type', 'role', 'status', 'site', 'cluster', 'tenant',
134 'vcpus', 'memory', 'disk', 'primary_ip',
135 )
137 def render_memory(self, value):
138 return humanize_ram_capacity(value)
140 def render_disk(self, value):
141 return humanize_disk_capacity(value)
144#
145# VM components
146#
148class VMInterfaceTable(BaseInterfaceTable):
149 virtual_machine = tables.Column(
150 verbose_name=_('Virtual Machine'),
151 linkify=True
152 )
153 name = tables.Column(
154 verbose_name=_('Name'),
155 linkify=True
156 )
157 vrf = tables.Column(
158 verbose_name=_('VRF'),
159 linkify=True
160 )
161 tags = columns.TagColumn(
162 url_name='virtualization:vminterface_list'
163 )
165 class Meta(NetBoxTable.Meta):
166 model = VMInterface
167 fields = (
168 'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mtu', 'mode', 'description', 'tags', 'vrf',
169 'primary_mac_address', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans',
170 'qinq_svlan', 'created', 'last_updated', 'vlan_translation_policy',
171 )
172 default_columns = ('pk', 'name', 'virtual_machine', 'enabled', 'description')
175class VirtualMachineVMInterfaceTable(VMInterfaceTable):
176 parent = tables.Column(
177 verbose_name=_('Parent'),
178 linkify=True
179 )
180 bridge = tables.Column(
181 verbose_name=_('Bridge'),
182 linkify=True
183 )
184 actions = columns.ActionsColumn(
185 actions=('edit', 'delete'),
186 extra_buttons=VMINTERFACE_BUTTONS
187 )
189 class Meta(NetBoxTable.Meta):
190 model = VMInterface
191 fields = (
192 'pk', 'id', 'name', 'enabled', 'parent', 'bridge', 'primary_mac_address', 'mtu', 'mode', 'description',
193 'tags', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans',
194 'qinq_svlan', 'actions',
195 )
196 default_columns = ('pk', 'name', 'enabled', 'primary_mac_address', 'mtu', 'mode', 'description', 'ip_addresses')
197 row_attrs = {
198 'data-name': lambda record: record.name,
199 'data-virtual': lambda record: "true",
200 'data-enabled': lambda record: "true" if record.enabled else "false",
201 }
204class VirtualDiskTable(NetBoxTable):
205 virtual_machine = tables.Column(
206 verbose_name=_('Virtual Machine'),
207 linkify=True
208 )
209 name = tables.Column(
210 verbose_name=_('Name'),
211 linkify=True
212 )
213 size = tables.Column(
214 verbose_name=_('Size')
215 )
216 tags = columns.TagColumn(
217 url_name='virtualization:virtualdisk_list'
218 )
220 class Meta(NetBoxTable.Meta):
221 model = VirtualDisk
222 fields = (
223 'pk', 'id', 'virtual_machine', 'name', 'size', 'description', 'tags',
224 )
225 default_columns = ('pk', 'name', 'virtual_machine', 'size', 'description')
226 row_attrs = {
227 'data-name': lambda record: record.name,
228 }
230 def render_size(self, value):
231 return humanize_disk_capacity(value)
234class VirtualMachineVirtualDiskTable(VirtualDiskTable):
235 actions = columns.ActionsColumn(
236 actions=('edit', 'delete'),
237 )
239 class Meta(VirtualDiskTable.Meta):
240 fields = (
241 'pk', 'id', 'name', 'size', 'description', 'tags', 'actions',
242 )
243 default_columns = ('pk', 'name', 'size', 'description')