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

View file

@ -12,7 +12,7 @@
<ul class="nav nav-list"> <ul class="nav nav-list">
<li class="nav-header">Boot Order</li> <li class="nav-header">Boot Order</li>
<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 }}"> <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> <i class="fas fa-cog"></i>
</button> </button>

View file

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