Update format of VM boot order JSON

Change format of the VM boot order JSON. This new format allows
the UI to mimic the Proxmox boot order selection system.

The new format is as follows
{
  'legacy': False,
  'order': [
    {
      'device': 'virtio0',
      'description': 'local-lvm:vm-102-disk-0,size=8G',
      'enabled': True
    },
    ...
  ]
}
This commit is contained in:
Harmon Herring 2021-06-10 17:05:37 -04:00
parent 6da1095d1c
commit 085f5c09d8
3 changed files with 55 additions and 37 deletions

View file

@ -816,14 +816,14 @@ $("#edit-boot-order").click(function(){
const vmname = $(this).data('vmname');
const boot_order = $(this).data('boot_order');
var options = document.createElement('div');
for (i = 0; i < boot_order.length; i++) {
for (i = 0; i < boot_order.order.length; i++) {
text = document.createElement('span');
text.innerHTML = `${i + 1}. `;
options.append(text);
var entry = document.createElement('select');
entry.setAttribute("id", `boot-order-${i + 1}`);
for (j = 0; j < boot_order.length; j++) {
entry.appendChild(new Option(boot_order[j], boot_order[j]));
for (j = 0; j < boot_order.order.length; j++) {
entry.appendChild(new Option(boot_order.order[j].device, boot_order.order[j].device));
}
entry.selectedIndex = i;
entry.setAttribute('style', 'width: 85px');

View file

@ -12,7 +12,7 @@
<ul class="nav nav-list">
<li class="nav-header">Boot Order</li>
<li>
{{ vm.boot_order|join(', ') }}
{{ vm.boot_order['order']|map(attribute='device')|join(', ') }}
<button class="btn btn-default proxstar-vmbtn" id="edit-boot-order" data-vmid="{{ vm.id }}" data-vmname="{{ vm.name }}" data-boot_order="{{ vm.boot_order_json }}">
<i class="fas fa-cog"></i>
</button>

View file

@ -122,43 +122,61 @@ class VM:
proxmox = connect_proxmox()
boot_order_lookup = {'a': 'Floppy', 'c': 'Hard Disk', 'd': 'CD-ROM', 'n': 'Network'}
raw_boot_order = self.config.get('boot', 'cdn')
boot_order = []
boot_order = {'legacy': False, 'order': []}
try:
# If proxmox version supports 'order=' format
if float(proxmox.nodes(self.node).version.get()['release']) >= 6.3:
# Currently using 'order=' format
if raw_boot_order.startswith('order='):
# Add enabled boot devices
for order in raw_boot_order[6:].split(';'):
boot_order.append(order)
# Add disabled boot devices
for device in self.cdroms + [disk[0] for disk in self.disks] + [net[0] for net in self.interfaces]:
if device not in boot_order:
boot_order.append(device)
# Currently using legacy format
# Propose updating to the new format
else:
if raw_boot_order.startswith('legacy='):
raw_boot_order = raw_boot_order[7:]
# Arrange boot devices according to current format
for order in raw_boot_order:
if order == 'c':
disks = [disk[0] for disk in self.disks]
if self.config.get('bootdisk'):
boot_order.append(self.config['bootdisk'])
disks.remove(self.config['bootdisk'])
boot_order.extend(disks)
elif order == 'd':
boot_order.extend(self.cdroms)
elif order == 'n':
boot_order.extend([net[0] for net in self.interfaces])
# Proxmox version does not support 'order=' format
else:
if float(proxmox.nodes(self.node).version.get()['release']) < 6.3:
boot_order['legacy'] = True
for order in raw_boot_order:
boot_order.append(boot_order_lookup[order])
boot_order['order'].append({'device': boot_order_lookup[order]})
return boot_order
# Currently using 'order=' format
if raw_boot_order.startswith('order='):
# Add enabled boot devices
for order in raw_boot_order[6:].split(';'):
boot_order['order'].append(
{'device': order, 'description': self.config.get(order), 'enabled': True}
)
# Add disabled boot devices
enabled_devices = [order['device'] for order in boot_order['order']]
for device in (
self.cdroms
+ [disk[0] for disk in self.disks]
+ [net[0] for net in self.interfaces]
):
if device not in enabled_devices:
boot_order['order'].append(
{
'device': device,
'description': self.config.get(device),
'enabled': False,
}
)
# Currently using legacy format
# Propose updating to the new format
else:
if raw_boot_order.startswith('legacy='):
raw_boot_order = raw_boot_order[7:]
# Arrange boot devices according to current format
devices = []
for order in raw_boot_order:
if order == 'c':
disks = [disk[0] for disk in self.disks]
if self.config.get('bootdisk'):
boot_order.append(self.config['bootdisk'])
disks.remove(self.config['bootdisk'])
devices.extend(disks)
elif order == 'd':
devices.extend(self.cdroms)
elif order == 'n':
devices.extend([net[0] for net in self.interfaces])
boot_order['order'].extend(
{'device': device, 'description': self.config.get(device), 'enabled': True}
for device in devices
)
return boot_order
except:
return []
return boot_order
return {'legacy': False, 'order': []}
@lazy_property
def boot_order_json(self):