From 78ad5ce03efe93cef5c5f40e807b8bfa57767fad Mon Sep 17 00:00:00 2001 From: mattrowe-opennebula Date: Fri, 29 May 2026 13:55:27 +0200 Subject: [PATCH 1/6] F OpenNebula/one#7714: Added VM update methods reference --- assets/tables/vm_update_methods.xlsx | Bin 0 -> 19050 bytes .../vm_update_methods.md | 997 ++++++++++++++++++ layouts/shortcodes/interactive-table.html | 74 ++ layouts/shortcodes/vm-methods-table.html | 161 +++ scripts/vm_update_methods_converter.py | 142 +++ 5 files changed, 1374 insertions(+) create mode 100644 assets/tables/vm_update_methods.xlsx create mode 100644 content/product/operation_references/configuration_references/vm_update_methods.md create mode 100644 layouts/shortcodes/interactive-table.html create mode 100644 layouts/shortcodes/vm-methods-table.html create mode 100644 scripts/vm_update_methods_converter.py diff --git a/assets/tables/vm_update_methods.xlsx b/assets/tables/vm_update_methods.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9b390acb6ced339f5ac8081c159eee1e21dbc7fe GIT binary patch literal 19050 zcmeHvbzGdgwl-2IQrsz4thl>7r8pER#ocXicX!v~R@@zmyF+nzw_?S{sI*Q3JMCunWIq^m~yc-nRC8s z*J2g?!`b20vtmK@8*F+eC+R6mJ@{9ZhXDRi>?8gFT zsk~Bg{8Vn?u-!8xrP|~(#KS=n-FkgOsxWrsG=)r?(cee7*aNKi zVaDIsU~flPCFpu>6XG|A#9&dLed%4_RYtDR#l%Qq`ywkHtJN*C3C-X*>1w$vb#qeZ zaldO;9ngDFoNODEyS+#W=5LL(h(4L(@re-5wZoug)2p3-==;t$OltR~X;+wU0nmJ@HJ~E&z?@g4o z2yAqwU&uzSK*<@s$lP0>IL2PlwDcZPc(n>&&p4{=&$#2gPR>qwt6{hyLU|scdO^fo z+&jxO1etaTX5eiMj3YdbaFT!?~9c<*5d9qt~abv&E$O<2DFYm z92a*fLU`Qx<*XALg}b|fy9V5(q7!)*pIhNaqTfp2TW!X>gUX1%gzD@#?N0a<+s z0wVLjQj_c_HEj&7^|W;LbOrySDD59#{G_bHy!j*@;yu_yTR-E{Ojs&g;ZaQh%or

M4mA7s86XVT_nkwe<_EP<~ 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 Q5P&~0FF-)vi#&b$f6>^~9{>OV literal 0 HcmV?d00001 diff --git a/content/product/operation_references/configuration_references/vm_update_methods.md b/content/product/operation_references/configuration_references/vm_update_methods.md new file mode 100644 index 000000000..c23371cd0 --- /dev/null +++ b/content/product/operation_references/configuration_references/vm_update_methods.md @@ -0,0 +1,997 @@ +--- +title: 'Updating Virtual Machine Configuration' +linkTitle: 'Updating VM Configuration' +--- + + + + + + + + +OpenNebula provides a powerful set of tools through the GUI, CLI and API that allow you to update Virtual Machine configuration on the fly, even while the VM is running. This flexibility enables you to optimize performance, adjust resource allocation, and manage your virtual infrastructure with ease. The following table details all the VM configuration update methods available with interface coverage and notes. Use the filter to find the methods relevant to your use case. + +## VM Configuration Update Methods Reference + + +{{< vm-methods-table >}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SectionTrackerMethodAttributeDescriptionUpdating in Running stateUpdating in POWEROFF stateAPICLIGUILimitations/Notes
Computeone.vm.resizeVM/TEMPLATE/CPUChanges VM CPU allocation factorNOYESYES YESYESScheduler/resource allocation attribute; changes applied after power cycle for effective runtime impact
Computeone.vm.resizeVM/TEMPLATE/VCPUChanges VM virtual CPU countPartialYESYES YESYESVCPU hotplug support required for live effect; otherwise applied after reboot
Computeone.vm.resizeVM/TEMPLATE/MEMORYChanges VM memory allocationPartialYESYES YESYESMemory hotplug support required for live effect; otherwise applied after reboot
Diskone.vm.attachVM/TEMPLATE/DISKAttaches a disk to the VMPartialYESYES YESYESDisk hotplug support depends on disk bus/controller
Diskone.vm.detachVM/TEMPLATE/DISKDetaches a disk from the VMPartialYESYES YESYESMay fail for active/system disks or unsupported buses
Diskone.vm.diskresizeVM/TEMPLATE/DISKResizes VM diskPartialYESYES YESYESMay fail for active/system disks or unsupported buses
Diskone.vm.disksaveasVM/TEMPLATE/DISKSaves VM disk as imageYESYESYES YESYES
NICone.vm.attachnicVM/TEMPLATE/NICAttaches NIC to the VMYESYESYES YESYES
NICone.vm.detachnicVM/TEMPLATE/NICDetaches NIC from the VMYESYESYES YESYES
NICone.vm.updatenicVM/TEMPLATE/NICUpdates VM NIC configurationYESYESYES YESYES
NICone.vm.attachsgVM/TEMPLATE/NIC/SECURITY_GROUPSAttaches security group to VM NICYESYESYES YESYES
NICone.vm.detachsgVM/TEMPLATE/NIC/SECURITY_GROUPSDetaches security group from VM NICYESYESYES YESYES
PCIone.vm.attachpciVM/TEMPLATE/PCIAttaches PCI device to the VMNOYESYES YESYESOnly in POWER OFF state
PCIone.vm.detachpciVM/TEMPLATE/PCIDetaches PCI device from the VMNO YESYES YESYESOnly in POWER OFF state
Snapshotsone.vm.snapshotcreateVM/TEMPLATE/SNAPSHOTCreates VM snapshotYESYESYES YESYES
Snapshotsone.vm.snapshotrevertVM/TEMPLATE/SNAPSHOTReverts VM to snapshot stateNOYESYES YESYESOnly in POWER OFF state
Snapshotsone.vm.snapshotdeleteVM/TEMPLATE/SNAPSHOTDeletes VM snapshotYESYESYES YESYES
Snapshotsone.vm.disksnapshotcreateVM/SNAPSHOTS/SNAPSHOTCreates disk snapshotYESYESYES YESYES
Snapshotsone.vm.disksnapshotdeleteVM/SNAPSHOTS/SNAPSHOTDeletes disk snapshotYESYESYES YESYES
Snapshotsone.vm.disksnapshotrevertVM/SNAPSHOTS/SNAPSHOTReverts disk to snapshot stateNOYESYES YESYESOnly in POWER OFF state
Snapshotsone.vm.disksnapshotrenameVM/SNAPSHOTS/SNAPSHOTRenames disk snapshotYESYESYES YESYES
Backupsone.vm.backupVM/BACKUPSCreates VM backupYESYESYES YESYES
Backupsone.vm.backupcancelVM/BACKUPSCancels running VM backup jobYESYESYES YESYES
Backupsone.vm.restoreVM/BACKUPSRestores VM disks/state from backupNOYESYES YESYESOnly in POWER OFF state
VM attributesone.vm.updateVM/USER_TEMPLATEUpdates VM user templateNOYESYES YESNOUpdates on the next power cycle
VM attributesone.vm.renameVM/NAMERenames VMYESYESYES YESYES
VM attributesone.vm.chownVM/UID, VM/GID, VM/UNAME, VM/GNAMEChanges VM ownershipYESYESYES YESYES
VM attributesone.vm.chmodVM/PERMISSIONSChanges VM permissionsYESYESYES YESYES
VM scheduled actionsone.vm.schedaddVM/TEMPLATE/SCHED_ACTIONAdds scheduled VM actionYESYESYES YESYES
VM scheduled actionsone.vm.schedupdateVM/TEMPLATE/SCHED_ACTIONUpdates scheduled VM actionYESYESYES YESYES
VM scheduled actionsone.vm.scheddeleteVM/TEMPLATE/SCHED_ACTIONDeletes scheduled VM actionYESYESYES YESYES
Otherone.vm.lockVM/LOCKLocks VM actionsYESYESYES YESYES
Otherone.vm.unlockVM/LOCKUnlocks VM actionsYESYESYES YESYES
Otherone.vm.execVM/TEMPLATE/QEMU_GA_EXECExecutes command inside guestYESNOYES YESNORequires guest agent
Otherone.vm.retryexecVM/TEMPLATE/QEMU_GA_EXECRetries guest commandYESNOYES YESNORequires guest agent
Otherone.vm.cancelexecVM/TEMPLATE/QEMU_GA_EXECCancels guest commandYESNOYES YESNORequires guest agent
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/OS/ARCHDefines guest CPU architectureNOYESYES YESYESEffectively immutable for existing VM
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/OS/MACHINEDefines machine/chipset type used by hypervisorNOYESYES YESYESApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/OS/KERNELDefines kernel image for direct kernel bootNOYESYES YESNOApplied after poweroff/resume; direct kernel boot only
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/OS/INITRDDefines initrd image for direct kernel bootNOYESYES YESNOApplied after poweroff/resume; direct kernel boot only
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/OS/BOOTLOADERDefines external bootloaderNOYESYES YESYESNot applicable/ignored in KVM
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/OS/BOOTLOADERDefines VM boot deviceYESYESYES YESYESReflected in OpenNebula UI; libvirt may resolve as default disk boot
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/OS/KERNEL_CMDDefines kernel command line parametersNOYESYES YESNOApplied after poweroff/resume; direct kernel boot only
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/OS/ROOTDefines guest root deviceNOYESYES YESNOApplied after poweroff/resume; direct kernel boot only
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/OS/SD_DISK_BUSDefines bus type for SD disksNOYESYES YESYESApplied after poweroff/resume;
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/OS/UUIDDefines VM UUIDNOYESYES YESYESApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/OS/FIRMWAREDefines VM firmware/UEFI loaderNOYESYES YESNOApplied after poweroff/resume; requires valid OVMF path
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/OS/FIRMWARE_FORMATDefines firmware image formatNOYESYES YESNOApplied after poweroff/resume with firmware
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/CPU_MODEL/MODELDefines guest CPU model exposed to VMNOYESYES YESNOApplied after poweroff/resume if CPU model is valid for host
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/CPU_MODEL/FEATURESDefines guest CPU feature flagsNOYESYES YESNOApplied after poweroff/resume if features are supported by host CPU
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/FEATURES/ACPIEnables ACPI supportNOYESYES YESYESApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/FEATURES/PAEEnables Physical Address Extension supportNOYESYES YESYESApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/FEATURES/APICEnables APIC supportNOYESYES YESYESApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/FEATURES/LOCALTIMEConfigures guest RTC clock modeNOYESYES YESYESApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/FEATURES/HYPERVEnables Hyper-V enlightenmentsNOYESYES YESYESApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/FEATURES/GUEST_AGENTEnables QEMU guest agent channelNOYESYES YESYESApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/FEATURES/VIRTIO_SCSI_QUEUESConfigures virtio-scsi queue countNOYESYES YESNOApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/FEATURES/VIRTIO_BLK_QUEUESConfigures virtio-blk queue countNOYESYES YESNOApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/FEATURES/IOTHREADSConfigures disk IO threadsNOYESYES YESNOApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/INPUT/TYPEDefines guest input device typeNOYESYES YESYESApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/INPUT/BUSDefines guest input device busNOYESYES YESYESApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/GRAPHICS/TYPEDefines graphics protocol/backendNOYESYES YESNOTemplate changes while running; applied after poweroff/resume. SPICE works with external clients, not FireEdge/Guacamole in this setup
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/GRAPHICS/LISTENDefines graphics listen addressNOYESYES YESYESApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/GRAPHICS/PASSWDDefines graphics console passwordNOYESYES YESYESApplied after poweroff/resume; password prompt works with external VNC/SPICE clients, not via FireEdge/Guacamole
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/GRAPHICS/KEYMAPDefines keyboard layout for graphics consoleNOYESYES YESYESApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/GRAPHICS/COMMANDDefines graphics command parametersNOYESYES YESNOStored in template but not passed to libvirt domain XML in KVM
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/VIDEO/TYPEDefines virtual video adapter typeYESYESYES YESYESLive-applied; without VRAM/related options may fall back to default model such as cirrus
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/VIDEO/IOMMUEnables IOMMU support for video deviceYESYESYES YESYES
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/VIDEO/ATSEnables Address Translation Service for video deviceYESYESYES YESYES
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/VIDEO/VRAMDefines virtual video memory sizeYESYESYES YESYES
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/VIDEO/RESOLUTIONDefines guest display resolutionYESYESYES YESYES
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/RAW/DATADefines raw hypervisor XML snippetNOYESYES YESNOApplied after poweroff/resume
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/RAW/DATA_VMXDefines VMX-specific raw configurationDefines VMX-specific raw configurationNOYESYES YESNONot applicable to KVM; template-only/no effect
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/RAW/TYPEDefines hypervisor backend typeNOYESYES YESNOActs as driver selector; for KVM must be kvm
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/RAW/VALIDATEEnables raw XML validationNOYESYES YESNOTemplate/validation behavior; not a live libvirt change
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/BACKUP_CONFIG/FS_FREEZEEnables filesystem freeze during backupYESYESYES YESYES
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/BACKUP_CONFIG/KEEP_LASTDefines number of retained backupsYESYESYES YESYES
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/BACKUP_CONFIG/BACKUP_VOLATILEIncludes volatile disks in backupYESYESYES YESYES
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/BACKUP_CONFIG/MODEDefines backup modeYESYESYES YESYES
one.vm.updateconfone.vm.updateconfVM/TEMPLATE/BACKUP_CONFIG/INCREMENT_MODEDefines incremental backup modeYESYESYES YESYES
+{{< /vm-methods-table >}} \ No newline at end of file diff --git a/layouts/shortcodes/interactive-table.html b/layouts/shortcodes/interactive-table.html new file mode 100644 index 000000000..cf367a9a8 --- /dev/null +++ b/layouts/shortcodes/interactive-table.html @@ -0,0 +1,74 @@ + + + + + + + + + +

+
+ + +
+ + {{ .Inner }} +
+ + \ No newline at end of file diff --git a/layouts/shortcodes/vm-methods-table.html b/layouts/shortcodes/vm-methods-table.html new file mode 100644 index 000000000..dd547c875 --- /dev/null +++ b/layouts/shortcodes/vm-methods-table.html @@ -0,0 +1,161 @@ + + + + + + + + + +
+
+ + +
+ + {{ .Inner }} +
+ + \ No newline at end of file diff --git a/scripts/vm_update_methods_converter.py b/scripts/vm_update_methods_converter.py new file mode 100644 index 000000000..0635cc24d --- /dev/null +++ b/scripts/vm_update_methods_converter.py @@ -0,0 +1,142 @@ +import openpyxl +from openpyxl.utils import range_boundaries + +def get_real_max_row(sheet): + for row in range(sheet.max_row, 0, -1): + for col in range(1, sheet.max_column + 1): + if sheet.cell(row=row, column=col).value is not None: + return row + return 1 + +def get_header_value(sheet, row, col, merged_cells): + for merged_range in merged_cells: + min_col, min_row, max_col, max_row = range_boundaries(str(merged_range)) + if min_row <= row <= max_row and min_col <= col <= max_col: + return sheet.cell(row=min_row, column=min_col).value + return sheet.cell(row=row, column=col).value + +def excel_to_html(xlsx_path): + wb = openpyxl.load_workbook(xlsx_path, data_only=True) + sheet = wb.active + + real_max_row = get_real_max_row(sheet) + max_cols = sheet.max_column + merged_cells = sheet.merged_cells.ranges + + html = [''] + html.append(' ') + html.append(' ') + html.append(' ') + + for col_idx in range(1, max_cols + 1): + r1_val = get_header_value(sheet, 1, col_idx, merged_cells) + r2_val = get_header_value(sheet, 2, col_idx, merged_cells) + + if r1_val == r2_val: + final_header = r1_val if r1_val else f"Column {col_idx}" + else: + parent = f"{r1_val} > " if r1_val else "" + parent = "" + child = r2_val if r2_val else "" + final_header = f"{parent}{child}" + + # --- FIX: Set static widths on the master definition row --- + width_style = "" + if col_idx == 1: # Method Column + width_style = ' style="width: 20%;"' + elif col_idx == 2: # Attribute Column + width_style = ' style="width: 15%;"' + elif col_idx == 3: # Description Column + width_style = ' style="width: 12%;"' + elif col_idx == 4: # Updating in Running state Column + width_style = ' style="width: 12%;"' + elif col_idx == 5: # Updating in POWEROFF state Column + width_style = ' style="width: 12%;"' + elif col_idx == 6: # API Column + width_style = ' style="width: 5%;"' + elif col_idx == 7: # CLI Column + width_style = ' style="width: 5%;"' + elif col_idx == 8: # API Column + width_style = ' style="width: 5%;"' + elif col_idx == 9: # API Column + width_style = ' style="width: 20%;"' + + html.append(f' {final_header}') + # ------------------------------------------------------------ + + html.append(' ') + html.append(' \n ') + + current_section = "General" + + for row_idx in range(1, real_max_row + 1): + if row_idx <= 2: + continue + + is_section_heading = False + for merged_range in merged_cells: + min_col, min_row, max_col, max_row = range_boundaries(str(merged_range)) + if min_row == row_idx and min_col == 1 and (max_col - min_col + 1) == max_cols: + is_section_heading = True + break + + if is_section_heading: + current_section = sheet.cell(row=row_idx, column=1).value or "General" + continue + + html.append(' ') + html.append(f' ') + + for col_idx in range(1, max_cols + 1): + cell = sheet.cell(row=row_idx, column=col_idx) + val = cell.value if cell.value is not None else "" + + if col_idx == 2 and val: + html.append(f' ') + else: + html.append(f' ') + + html.append(' ') + + html.append(' \n
SectionTracker
{current_section}{val}{val}
') + return '\n'.join(html) + +# --- FIX: Inject table precisely into the Marker location --- +def inject_table_into_markdown(md_file_path, xlsx_path, marker): + # 1. Generate the HTML table block with its Hugo shortcode packaging + html_table = excel_to_html(xlsx_path) + shortcode_payload = f"{{{{< vm-methods-table >}}}}\n{html_table}\n{{{{< /vm-methods-table >}}}}" + + # 2. Read the current contents written by your team members + try: + with open(md_file_path, 'r', encoding='utf-8') as file: + md_content = file.read() + except FileNotFoundError: + print(f"Error: Could not find {md_file_path}. Make sure the file exists with the placeholder comment.") + return + + # If the file already has a built table from a previous run, find the markers and clean it out + if f"{marker}\n{{{{< vm-methods-table >}}}}" in md_content: + # Splits the file at the historical payload run and preserves the original template frame + parts = md_content.split(f"{marker}\n{{{{< vm-methods-table >}}}}") + header_part = parts[0] + footer_part = parts[1].split(f"{{{{< /vm-methods-table >}}}}")[-1] + md_content = f"{header_part}{marker}{footer_part}" + + # 3. Inject our fresh payload right below the pristine marker anchor + if marker in md_content: + updated_content = md_content.replace(marker, f"{marker}\n{shortcode_payload}") + + # 4. Save it back to the Hugo repository path + with open(md_file_path, 'w', encoding='utf-8') as file: + file.write(updated_content) + print("Success: Table successfully injected into the Markdown placeholder!") + else: + print(f"Warning: Marker '{marker}' was not found inside the markdown file. No injection occurred.") + +html_table = excel_to_html('assets/tables/vm_update_methods.xlsx') +markdown_output = f"{{{{< vm-methods-table >}}}}\n{html_table}\n{{{{< /vm-methods-table >}}}}" + +MD_FILE = "content/product/operation_references/configuration_references/vm_update_methods.md" +XLSX_PATH = "assets/tables/vm_update_methods.xlsx" +inject_table_into_markdown(MD_FILE, XLSX_PATH, "") \ No newline at end of file From 501073f51fb9053b308d2cc3dda04fd92d2488e5 Mon Sep 17 00:00:00 2001 From: mattrowe-opennebula Date: Fri, 29 May 2026 14:12:36 +0200 Subject: [PATCH 2/6] F OpenNebula/one#7714: Removed unused shortcode --- layouts/shortcodes/interactive-table.html | 74 ----------------------- 1 file changed, 74 deletions(-) delete mode 100644 layouts/shortcodes/interactive-table.html diff --git a/layouts/shortcodes/interactive-table.html b/layouts/shortcodes/interactive-table.html deleted file mode 100644 index cf367a9a8..000000000 --- a/layouts/shortcodes/interactive-table.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - -
-
- - -
- - {{ .Inner }} -
- - \ No newline at end of file From a16cecaf942540f5e7a62e763e1103c6244b828b Mon Sep 17 00:00:00 2001 From: mattrowe-opennebula Date: Mon, 1 Jun 2026 11:13:25 +0200 Subject: [PATCH 3/6] F OpenNebula/one#7714: Added reference in vm_instances.md --- .../virtual_machines_operation/virtual_machines/vm_instances.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/product/virtual_machines_operation/virtual_machines/vm_instances.md b/content/product/virtual_machines_operation/virtual_machines/vm_instances.md index e28343e99..32a901804 100644 --- a/content/product/virtual_machines_operation/virtual_machines/vm_instances.md +++ b/content/product/virtual_machines_operation/virtual_machines/vm_instances.md @@ -492,7 +492,7 @@ Some of the VM configuration attributes defined in the VM template can be update | `BACKUP_CONFIG` | `FS_FREEZE`, `KEEP_LAST`, `BACKUP_VOLATILE`, `MODE`,
`INCREMENT_MODE` | | `CONTEXT` | Any value, except `ETH*`. **Variable substitution will be made** | -Visit the [Virtual Machine Template reference]({{% relref "product/operation_references/configuration_references/template#template" %}}) for a complete description of each attribute. +Visit the [Virtual Machine Template reference]({{% relref "product/operation_references/configuration_references/template#template" %}}) for a complete description of each attribute. Visit the [VM Update Methods Reference]({{% relref "product/operation_references/configuration_references/vm_update_methods/" %}}) for additional details on all available VM configuration update methods. {{< alert title="Warning" type="warning" >}} This action might not be supported for `RUNNING` VMs depending on the hypervisor. Please check the limitation section of the specific virtualization driver.{{< /alert >}} From 62814b32e450bd2f1c3a2cd992279dd291325022 Mon Sep 17 00:00:00 2001 From: mattrowe-opennebula Date: Tue, 2 Jun 2026 11:55:46 +0200 Subject: [PATCH 4/6] F OpenNebula/one#7714: Improved hover reveal of truncated text --- .../vm_update_methods.md | 160 +++++++++--------- layouts/shortcodes/vm-methods-table.html | 55 +++++- scripts/vm_update_methods_converter.py | 8 +- 3 files changed, 140 insertions(+), 83 deletions(-) diff --git a/content/product/operation_references/configuration_references/vm_update_methods.md b/content/product/operation_references/configuration_references/vm_update_methods.md index c23371cd0..f1639a03a 100644 --- a/content/product/operation_references/configuration_references/vm_update_methods.md +++ b/content/product/operation_references/configuration_references/vm_update_methods.md @@ -35,7 +35,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Compute one.vm.resize - VM/TEMPLATE/CPU + VM/TEMPLATE/CPU Changes VM CPU allocation factor NO YES @@ -47,7 +47,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Compute one.vm.resize - VM/TEMPLATE/VCPU + VM/TEMPLATE/VCPU Changes VM virtual CPU count Partial YES @@ -59,7 +59,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Compute one.vm.resize - VM/TEMPLATE/MEMORY + VM/TEMPLATE/MEMORY Changes VM memory allocation Partial YES @@ -71,7 +71,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Disk one.vm.attach - VM/TEMPLATE/DISK + VM/TEMPLATE/DISK Attaches a disk to the VM Partial YES @@ -83,7 +83,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Disk one.vm.detach - VM/TEMPLATE/DISK + VM/TEMPLATE/DISK Detaches a disk from the VM Partial YES @@ -95,7 +95,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Disk one.vm.diskresize - VM/TEMPLATE/DISK + VM/TEMPLATE/DISK Resizes VM disk Partial YES @@ -107,7 +107,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Disk one.vm.disksaveas - VM/TEMPLATE/DISK + VM/TEMPLATE/DISK Saves VM disk as image YES YES @@ -119,7 +119,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al NIC one.vm.attachnic - VM/TEMPLATE/NIC + VM/TEMPLATE/NIC Attaches NIC to the VM YES YES @@ -131,7 +131,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al NIC one.vm.detachnic - VM/TEMPLATE/NIC + VM/TEMPLATE/NIC Detaches NIC from the VM YES YES @@ -143,7 +143,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al NIC one.vm.updatenic - VM/TEMPLATE/NIC + VM/TEMPLATE/NIC Updates VM NIC configuration YES YES @@ -155,7 +155,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al NIC one.vm.attachsg - VM/TEMPLATE/NIC/SECURITY_GROUPS + VM/TEMPLATE/NIC/SECURITY_GROUPS Attaches security group to VM NIC YES YES @@ -167,7 +167,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al NIC one.vm.detachsg - VM/TEMPLATE/NIC/SECURITY_GROUPS + VM/TEMPLATE/NIC/SECURITY_GROUPS Detaches security group from VM NIC YES YES @@ -179,7 +179,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al PCI one.vm.attachpci - VM/TEMPLATE/PCI + VM/TEMPLATE/PCI Attaches PCI device to the VM NO YES @@ -191,7 +191,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al PCI one.vm.detachpci - VM/TEMPLATE/PCI + VM/TEMPLATE/PCI Detaches PCI device from the VM NO YES @@ -203,7 +203,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Snapshots one.vm.snapshotcreate - VM/TEMPLATE/SNAPSHOT + VM/TEMPLATE/SNAPSHOT Creates VM snapshot YES YES @@ -215,7 +215,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Snapshots one.vm.snapshotrevert - VM/TEMPLATE/SNAPSHOT + VM/TEMPLATE/SNAPSHOT Reverts VM to snapshot state NO YES @@ -227,7 +227,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Snapshots one.vm.snapshotdelete - VM/TEMPLATE/SNAPSHOT + VM/TEMPLATE/SNAPSHOT Deletes VM snapshot YES YES @@ -239,7 +239,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Snapshots one.vm.disksnapshotcreate - VM/SNAPSHOTS/SNAPSHOT + VM/SNAPSHOTS/SNAPSHOT Creates disk snapshot YES YES @@ -251,7 +251,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Snapshots one.vm.disksnapshotdelete - VM/SNAPSHOTS/SNAPSHOT + VM/SNAPSHOTS/SNAPSHOT Deletes disk snapshot YES YES @@ -263,7 +263,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Snapshots one.vm.disksnapshotrevert - VM/SNAPSHOTS/SNAPSHOT + VM/SNAPSHOTS/SNAPSHOT Reverts disk to snapshot state NO YES @@ -275,7 +275,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Snapshots one.vm.disksnapshotrename - VM/SNAPSHOTS/SNAPSHOT + VM/SNAPSHOTS/SNAPSHOT Renames disk snapshot YES YES @@ -287,7 +287,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Backups one.vm.backup - VM/BACKUPS + VM/BACKUPS Creates VM backup YES YES @@ -299,7 +299,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Backups one.vm.backupcancel - VM/BACKUPS + VM/BACKUPS Cancels running VM backup job YES YES @@ -311,7 +311,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Backups one.vm.restore - VM/BACKUPS + VM/BACKUPS Restores VM disks/state from backup NO YES @@ -323,7 +323,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al VM attributes one.vm.update - VM/USER_TEMPLATE + VM/USER_TEMPLATE Updates VM user template NO YES @@ -335,7 +335,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al VM attributes one.vm.rename - VM/NAME + VM/NAME Renames VM YES YES @@ -347,7 +347,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al VM attributes one.vm.chown - VM/UID, VM/GID, VM/UNAME, VM/GNAME + VM/UID, VM/GID, VM/UNAME, VM/GNAME Changes VM ownership YES YES @@ -359,7 +359,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al VM attributes one.vm.chmod - VM/PERMISSIONS + VM/PERMISSIONS Changes VM permissions YES YES @@ -371,7 +371,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al VM scheduled actions one.vm.schedadd - VM/TEMPLATE/SCHED_ACTION + VM/TEMPLATE/SCHED_ACTION Adds scheduled VM action YES YES @@ -383,7 +383,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al VM scheduled actions one.vm.schedupdate - VM/TEMPLATE/SCHED_ACTION + VM/TEMPLATE/SCHED_ACTION Updates scheduled VM action YES YES @@ -395,7 +395,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al VM scheduled actions one.vm.scheddelete - VM/TEMPLATE/SCHED_ACTION + VM/TEMPLATE/SCHED_ACTION Deletes scheduled VM action YES YES @@ -407,7 +407,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Other one.vm.lock - VM/LOCK + VM/LOCK Locks VM actions YES YES @@ -419,7 +419,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Other one.vm.unlock - VM/LOCK + VM/LOCK Unlocks VM actions YES YES @@ -431,7 +431,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Other one.vm.exec - VM/TEMPLATE/QEMU_GA_EXEC + VM/TEMPLATE/QEMU_GA_EXEC Executes command inside guest YES NO @@ -443,7 +443,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Other one.vm.retryexec - VM/TEMPLATE/QEMU_GA_EXEC + VM/TEMPLATE/QEMU_GA_EXEC Retries guest command YES NO @@ -455,7 +455,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al Other one.vm.cancelexec - VM/TEMPLATE/QEMU_GA_EXEC + VM/TEMPLATE/QEMU_GA_EXEC Cancels guest command YES NO @@ -467,7 +467,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/OS/ARCH + VM/TEMPLATE/OS/ARCH Defines guest CPU architecture NO YES @@ -479,7 +479,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/OS/MACHINE + VM/TEMPLATE/OS/MACHINE Defines machine/chipset type used by hypervisor NO YES @@ -491,7 +491,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/OS/KERNEL + VM/TEMPLATE/OS/KERNEL Defines kernel image for direct kernel boot NO YES @@ -503,7 +503,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/OS/INITRD + VM/TEMPLATE/OS/INITRD Defines initrd image for direct kernel boot NO YES @@ -515,7 +515,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/OS/BOOTLOADER + VM/TEMPLATE/OS/BOOTLOADER Defines external bootloader NO YES @@ -527,7 +527,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/OS/BOOTLOADER + VM/TEMPLATE/OS/BOOTLOADER Defines VM boot device YES YES @@ -539,7 +539,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/OS/KERNEL_CMD + VM/TEMPLATE/OS/KERNEL_CMD Defines kernel command line parameters NO YES @@ -551,7 +551,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/OS/ROOT + VM/TEMPLATE/OS/ROOT Defines guest root device NO YES @@ -563,7 +563,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/OS/SD_DISK_BUS + VM/TEMPLATE/OS/SD_DISK_BUS Defines bus type for SD disks NO YES @@ -575,7 +575,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/OS/UUID + VM/TEMPLATE/OS/UUID Defines VM UUID NO YES @@ -587,7 +587,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/OS/FIRMWARE + VM/TEMPLATE/OS/FIRMWARE Defines VM firmware/UEFI loader NO YES @@ -599,7 +599,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/OS/FIRMWARE_FORMAT + VM/TEMPLATE/OS/FIRMWARE_FORMAT Defines firmware image format NO YES @@ -611,7 +611,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/CPU_MODEL/MODEL + VM/TEMPLATE/CPU_MODEL/MODEL Defines guest CPU model exposed to VM NO YES @@ -623,7 +623,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/CPU_MODEL/FEATURES + VM/TEMPLATE/CPU_MODEL/FEATURES Defines guest CPU feature flags NO YES @@ -635,7 +635,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/FEATURES/ACPI + VM/TEMPLATE/FEATURES/ACPI Enables ACPI support NO YES @@ -647,7 +647,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/FEATURES/PAE + VM/TEMPLATE/FEATURES/PAE Enables Physical Address Extension support NO YES @@ -659,7 +659,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/FEATURES/APIC + VM/TEMPLATE/FEATURES/APIC Enables APIC support NO YES @@ -671,7 +671,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/FEATURES/LOCALTIME + VM/TEMPLATE/FEATURES/LOCALTIME Configures guest RTC clock mode NO YES @@ -683,7 +683,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/FEATURES/HYPERV + VM/TEMPLATE/FEATURES/HYPERV Enables Hyper-V enlightenments NO YES @@ -695,7 +695,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/FEATURES/GUEST_AGENT + VM/TEMPLATE/FEATURES/GUEST_AGENT Enables QEMU guest agent channel NO YES @@ -707,7 +707,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/FEATURES/VIRTIO_SCSI_QUEUES + VM/TEMPLATE/FEATURES/VIRTIO_SCSI_QUEUES Configures virtio-scsi queue count NO YES @@ -719,7 +719,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/FEATURES/VIRTIO_BLK_QUEUES + VM/TEMPLATE/FEATURES/VIRTIO_BLK_QUEUES Configures virtio-blk queue count NO YES @@ -731,7 +731,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/FEATURES/IOTHREADS + VM/TEMPLATE/FEATURES/IOTHREADS Configures disk IO threads NO YES @@ -743,7 +743,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/INPUT/TYPE + VM/TEMPLATE/INPUT/TYPE Defines guest input device type NO YES @@ -755,7 +755,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/INPUT/BUS + VM/TEMPLATE/INPUT/BUS Defines guest input device bus NO YES @@ -767,7 +767,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/GRAPHICS/TYPE + VM/TEMPLATE/GRAPHICS/TYPE Defines graphics protocol/backend NO YES @@ -779,7 +779,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/GRAPHICS/LISTEN + VM/TEMPLATE/GRAPHICS/LISTEN Defines graphics listen address NO YES @@ -791,7 +791,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/GRAPHICS/PASSWD + VM/TEMPLATE/GRAPHICS/PASSWD Defines graphics console password NO YES @@ -803,7 +803,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/GRAPHICS/KEYMAP + VM/TEMPLATE/GRAPHICS/KEYMAP Defines keyboard layout for graphics console NO YES @@ -815,7 +815,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/GRAPHICS/COMMAND + VM/TEMPLATE/GRAPHICS/COMMAND Defines graphics command parameters NO YES @@ -827,7 +827,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/VIDEO/TYPE + VM/TEMPLATE/VIDEO/TYPE Defines virtual video adapter type YES YES @@ -839,7 +839,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/VIDEO/IOMMU + VM/TEMPLATE/VIDEO/IOMMU Enables IOMMU support for video device YES YES @@ -851,7 +851,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/VIDEO/ATS + VM/TEMPLATE/VIDEO/ATS Enables Address Translation Service for video device YES YES @@ -863,7 +863,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/VIDEO/VRAM + VM/TEMPLATE/VIDEO/VRAM Defines virtual video memory size YES YES @@ -875,7 +875,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/VIDEO/RESOLUTION + VM/TEMPLATE/VIDEO/RESOLUTION Defines guest display resolution YES YES @@ -887,7 +887,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/RAW/DATA + VM/TEMPLATE/RAW/DATA Defines raw hypervisor XML snippet NO YES @@ -899,7 +899,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/RAW/DATA_VMX + VM/TEMPLATE/RAW/DATA_VMX Defines VMX-specific raw configurationDefines VMX-specific raw configuration NO YES @@ -911,7 +911,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/RAW/TYPE + VM/TEMPLATE/RAW/TYPE Defines hypervisor backend type NO YES @@ -923,7 +923,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/RAW/VALIDATE + VM/TEMPLATE/RAW/VALIDATE Enables raw XML validation NO YES @@ -935,7 +935,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/BACKUP_CONFIG/FS_FREEZE + VM/TEMPLATE/BACKUP_CONFIG/FS_FREEZE Enables filesystem freeze during backup YES YES @@ -947,7 +947,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/BACKUP_CONFIG/KEEP_LAST + VM/TEMPLATE/BACKUP_CONFIG/KEEP_LAST Defines number of retained backups YES YES @@ -959,7 +959,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/BACKUP_CONFIG/BACKUP_VOLATILE + VM/TEMPLATE/BACKUP_CONFIG/BACKUP_VOLATILE Includes volatile disks in backup YES YES @@ -971,7 +971,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/BACKUP_CONFIG/MODE + VM/TEMPLATE/BACKUP_CONFIG/MODE Defines backup mode YES YES @@ -983,7 +983,7 @@ OpenNebula provides a powerful set of tools through the GUI, CLI and API that al one.vm.updateconf one.vm.updateconf - VM/TEMPLATE/BACKUP_CONFIG/INCREMENT_MODE + VM/TEMPLATE/BACKUP_CONFIG/INCREMENT_MODE Defines incremental backup mode YES YES diff --git a/layouts/shortcodes/vm-methods-table.html b/layouts/shortcodes/vm-methods-table.html index dd547c875..f15be9ae1 100644 --- a/layouts/shortcodes/vm-methods-table.html +++ b/layouts/shortcodes/vm-methods-table.html @@ -16,6 +16,10 @@ --filter-input-bg: #ffffff; --filter-input-border: #cbd5e1; --filter-input-text: #1e293b; + + --hover-overlay-bg: #ffffff; + --hover-overlay-border: #cbd5e1; + --hover-overlay-shadow: rgba(15, 23, 42, 0.1) 0px 10px 15px -3px, rgba(15, 23, 42, 0.05) 0px 4px 6px -2px; } /* --- DARK THEME OVERRIDES */ @@ -27,6 +31,10 @@ --filter-input-bg: #0f172a; --filter-input-border: #334155; --filter-input-text: #f1f5f9; + + --hover-overlay-bg: #1e293b; /* Deep slate background matching section divider */ + --hover-overlay-border: #475569; + --hover-overlay-shadow: rgba(0, 0, 0, 0.5) 0px 10px 15px -3px, rgba(0, 0, 0, 0.3) 0px 4px 6px -2px; } @media (min-width: 1000px) { @@ -110,11 +118,54 @@ } .truncated-attribute { - max-width: 100%; /* Adapts fluidly to the locked column frame width */ + /* max-width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - cursor: help; + cursor: help; */ + + position: relative; + max-width: 180px; /* Or whatever width constraint you established previously */ + padding: 12px 8px !important; /* Retain proper vertical table alignments */ + } + + .truncated-attribute .cell-content { + display: block; + width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + border: 1px solid transparent; + background-color: transparent; + padding: 0; + border-radius: 6px; + + transition: z-index 0.5s ease-in-out, background-color 0.3s ease-in-out, border-color 0.3s ease-in-out, overflow 0.3s ease-in-out, box-shadow 0.2s ease-in-out; + } + + .truncated-attribute:hover .cell-content { + position: absolute; + /*top: 50%; Center vertically within the cell */ + /*transform: translateY(-50%); */ + + top: 4px; + left: 4px; /* Slight offset padding alignment from the cell edge */ + + width: max-content; /* Forces the box to dynamically perfectly match the long text */ + max-width: 450px; /* Safety max-width boundary so it doesn't shoot clear off the screen */ + white-space: normal; /* Allows natural word wrapping down if it hits max-width */ + word-break: break-word; + + /* Visual styling encapsulate overlay wrapper */ + background-color: var(--hover-overlay-bg); + border: 1px solid var(--hover-overlay-border); + border-radius: 6px; + box-shadow: var(--hover-overlay-shadow); + padding: 8px 12px; + + /* Forces this layer directly above neighboring columns/text grids */ + z-index: 100; } diff --git a/scripts/vm_update_methods_converter.py b/scripts/vm_update_methods_converter.py index 0635cc24d..63953add0 100644 --- a/scripts/vm_update_methods_converter.py +++ b/scripts/vm_update_methods_converter.py @@ -91,8 +91,14 @@ def excel_to_html(xlsx_path): cell = sheet.cell(row=row_idx, column=col_idx) val = cell.value if cell.value is not None else "" + # if col_idx == 2 and val: + # html.append(f' {val}') + # else: + # html.append(f' {val}') + if col_idx == 2 and val: - html.append(f' {val}') + # We remove the 'title' attribute since our new CSS hover will replace the browser tooltip + html.append(f' {val}') else: html.append(f' {val}') From 80e906f7e2255baf4c546b25420f11cca941dca1 Mon Sep 17 00:00:00 2001 From: "Ruben S. Montero" Date: Tue, 2 Jun 2026 12:45:32 +0200 Subject: [PATCH 5/6] Delete assets/tables/vm_update_methods.xlsx --- assets/tables/vm_update_methods.xlsx | Bin 19050 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/tables/vm_update_methods.xlsx diff --git a/assets/tables/vm_update_methods.xlsx b/assets/tables/vm_update_methods.xlsx deleted file mode 100644 index 9b390acb6ced339f5ac8081c159eee1e21dbc7fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19050 zcmeHvbzGdgwl-2IQrsz4thl>7r8pER#ocXicX!v~R@@zmyF+nzw_?S{sI*Q3JMCunWIq^m~yc-nRC8s z*J2g?!`b20vtmK@8*F+eC+R6mJ@{9ZhXDRi>?8gFT zsk~Bg{8Vn?u-!8xrP|~(#KS=n-FkgOsxWrsG=)r?(cee7*aNKi zVaDIsU~flPCFpu>6XG|A#9&dLed%4_RYtDR#l%Qq`ywkHtJN*C3C-X*>1w$vb#qeZ zaldO;9ngDFoNODEyS+#W=5LL(h(4L(@re-5wZoug)2p3-==;t$OltR~X;+wU0nmJ@HJ~E&z?@g4o z2yAqwU&uzSK*<@s$lP0>IL2PlwDcZPc(n>&&p4{=&$#2gPR>qwt6{hyLU|scdO^fo z+&jxO1etaTX5eiMj3YdbaFT!?~9c<*5d9qt~abv&E$O<2DFYm z92a*fLU`Qx<*XALg}b|fy9V5(q7!)*pIhNaqTfp2TW!X>gUX1%gzD@#?N0a<+s z0wVLjQj_c_HEj&7^|W;LbOrySDD59#{G_bHy!j*@;yu_yTR-E{Ojs&g;ZaQh%or

M4mA7s86XVT_nkwe<_EP<~ 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 Q5P&~0FF-)vi#&b$f6>^~9{>OV From 3ce190ec092d47b6dec60eb94b2065335dddcdee Mon Sep 17 00:00:00 2001 From: "Ruben S. Montero" Date: Tue, 2 Jun 2026 12:45:55 +0200 Subject: [PATCH 6/6] Delete scripts/vm_update_methods_converter.py --- scripts/vm_update_methods_converter.py | 148 ------------------------- 1 file changed, 148 deletions(-) delete mode 100644 scripts/vm_update_methods_converter.py diff --git a/scripts/vm_update_methods_converter.py b/scripts/vm_update_methods_converter.py deleted file mode 100644 index 63953add0..000000000 --- a/scripts/vm_update_methods_converter.py +++ /dev/null @@ -1,148 +0,0 @@ -import openpyxl -from openpyxl.utils import range_boundaries - -def get_real_max_row(sheet): - for row in range(sheet.max_row, 0, -1): - for col in range(1, sheet.max_column + 1): - if sheet.cell(row=row, column=col).value is not None: - return row - return 1 - -def get_header_value(sheet, row, col, merged_cells): - for merged_range in merged_cells: - min_col, min_row, max_col, max_row = range_boundaries(str(merged_range)) - if min_row <= row <= max_row and min_col <= col <= max_col: - return sheet.cell(row=min_row, column=min_col).value - return sheet.cell(row=row, column=col).value - -def excel_to_html(xlsx_path): - wb = openpyxl.load_workbook(xlsx_path, data_only=True) - sheet = wb.active - - real_max_row = get_real_max_row(sheet) - max_cols = sheet.max_column - merged_cells = sheet.merged_cells.ranges - - html = [''] - html.append(' ') - html.append(' ') - html.append(' ') - - for col_idx in range(1, max_cols + 1): - r1_val = get_header_value(sheet, 1, col_idx, merged_cells) - r2_val = get_header_value(sheet, 2, col_idx, merged_cells) - - if r1_val == r2_val: - final_header = r1_val if r1_val else f"Column {col_idx}" - else: - parent = f"{r1_val} > " if r1_val else "" - parent = "" - child = r2_val if r2_val else "" - final_header = f"{parent}{child}" - - # --- FIX: Set static widths on the master definition row --- - width_style = "" - if col_idx == 1: # Method Column - width_style = ' style="width: 20%;"' - elif col_idx == 2: # Attribute Column - width_style = ' style="width: 15%;"' - elif col_idx == 3: # Description Column - width_style = ' style="width: 12%;"' - elif col_idx == 4: # Updating in Running state Column - width_style = ' style="width: 12%;"' - elif col_idx == 5: # Updating in POWEROFF state Column - width_style = ' style="width: 12%;"' - elif col_idx == 6: # API Column - width_style = ' style="width: 5%;"' - elif col_idx == 7: # CLI Column - width_style = ' style="width: 5%;"' - elif col_idx == 8: # API Column - width_style = ' style="width: 5%;"' - elif col_idx == 9: # API Column - width_style = ' style="width: 20%;"' - - html.append(f' {final_header}') - # ------------------------------------------------------------ - - html.append(' ') - html.append(' \n ') - - current_section = "General" - - for row_idx in range(1, real_max_row + 1): - if row_idx <= 2: - continue - - is_section_heading = False - for merged_range in merged_cells: - min_col, min_row, max_col, max_row = range_boundaries(str(merged_range)) - if min_row == row_idx and min_col == 1 and (max_col - min_col + 1) == max_cols: - is_section_heading = True - break - - if is_section_heading: - current_section = sheet.cell(row=row_idx, column=1).value or "General" - continue - - html.append(' ') - html.append(f' ') - - for col_idx in range(1, max_cols + 1): - cell = sheet.cell(row=row_idx, column=col_idx) - val = cell.value if cell.value is not None else "" - - # if col_idx == 2 and val: - # html.append(f' ') - # else: - # html.append(f' ') - - if col_idx == 2 and val: - # We remove the 'title' attribute since our new CSS hover will replace the browser tooltip - html.append(f' ') - else: - html.append(f' ') - - html.append(' ') - - html.append(' \n
SectionTracker
{current_section}{val}{val}{val}{val}
') - return '\n'.join(html) - -# --- FIX: Inject table precisely into the Marker location --- -def inject_table_into_markdown(md_file_path, xlsx_path, marker): - # 1. Generate the HTML table block with its Hugo shortcode packaging - html_table = excel_to_html(xlsx_path) - shortcode_payload = f"{{{{< vm-methods-table >}}}}\n{html_table}\n{{{{< /vm-methods-table >}}}}" - - # 2. Read the current contents written by your team members - try: - with open(md_file_path, 'r', encoding='utf-8') as file: - md_content = file.read() - except FileNotFoundError: - print(f"Error: Could not find {md_file_path}. Make sure the file exists with the placeholder comment.") - return - - # If the file already has a built table from a previous run, find the markers and clean it out - if f"{marker}\n{{{{< vm-methods-table >}}}}" in md_content: - # Splits the file at the historical payload run and preserves the original template frame - parts = md_content.split(f"{marker}\n{{{{< vm-methods-table >}}}}") - header_part = parts[0] - footer_part = parts[1].split(f"{{{{< /vm-methods-table >}}}}")[-1] - md_content = f"{header_part}{marker}{footer_part}" - - # 3. Inject our fresh payload right below the pristine marker anchor - if marker in md_content: - updated_content = md_content.replace(marker, f"{marker}\n{shortcode_payload}") - - # 4. Save it back to the Hugo repository path - with open(md_file_path, 'w', encoding='utf-8') as file: - file.write(updated_content) - print("Success: Table successfully injected into the Markdown placeholder!") - else: - print(f"Warning: Marker '{marker}' was not found inside the markdown file. No injection occurred.") - -html_table = excel_to_html('assets/tables/vm_update_methods.xlsx') -markdown_output = f"{{{{< vm-methods-table >}}}}\n{html_table}\n{{{{< /vm-methods-table >}}}}" - -MD_FILE = "content/product/operation_references/configuration_references/vm_update_methods.md" -XLSX_PATH = "assets/tables/vm_update_methods.xlsx" -inject_table_into_markdown(MD_FILE, XLSX_PATH, "") \ No newline at end of file