[pve-devel] [PATCH manager v3 5/6] ui: vm: make cloudinit drive editable
Daniel Kral
d.kral at proxmox.com
Wed Oct 23 14:37:21 CEST 2024
Implements the functionality to allow changes to the CloudInit drive
under the VM "Hardware" tab after it has already been created by the
user.
Signed-off-by: Daniel Kral <d.kral at proxmox.com>
---
www/manager6/qemu/CIDriveEdit.js | 63 +++++++++++++++++++++++++------
www/manager6/qemu/HardwareView.js | 4 +-
2 files changed, 53 insertions(+), 14 deletions(-)
diff --git a/www/manager6/qemu/CIDriveEdit.js b/www/manager6/qemu/CIDriveEdit.js
index 006f9565..d12124e8 100644
--- a/www/manager6/qemu/CIDriveEdit.js
+++ b/www/manager6/qemu/CIDriveEdit.js
@@ -9,14 +9,16 @@ Ext.define('PVE.qemu.CIDriveInputPanel', {
onGetValues: function(values) {
let me = this;
- let drive = {};
let params = {};
- let confid = values.controller + values.deviceid;
+ let confid = me.confid || values.controller + values.deviceid;
- drive.file = values.hdstorage + ":cloudinit";
- drive.format = values.diskformat;
+ // only set these when we create cloudinit files
+ if (me.isCreate) {
+ me.drive.file = values.hdstorage + ":cloudinit";
+ me.drive.format = values.diskformat;
+ }
- params[confid] = PVE.Parser.printQemuDrive(drive);
+ params[confid] = PVE.Parser.printQemuDrive(me.drive);
return params;
},
@@ -31,7 +33,25 @@ Ext.define('PVE.qemu.CIDriveInputPanel', {
setVMConfig: function(config) {
let me = this;
- me.busSelector.setVMConfig(config, 'cdrom');
+ if (me.busSelector) {
+ me.busSelector.setVMConfig(config, 'cdrom');
+ }
+ },
+
+ setDrive: function(drive) {
+ let me = this;
+
+ let values = {};
+
+ let match = drive.file.match(/^([^:]+):/);
+ if (match) {
+ values.hdstorage = match[1];
+ }
+ values.hdimage = drive.file;
+
+ me.drive = drive;
+
+ me.setValues(values);
},
initComponent: function() {
@@ -41,10 +61,12 @@ Ext.define('PVE.qemu.CIDriveInputPanel', {
let items = [];
- me.busSelector = Ext.create('PVE.form.ControllerSelector', {
- withVirtIO: false,
- fieldLabel: gettext('CloudInit Drive'),
- });
+ if (me.isCreate) {
+ me.busSelector = Ext.create('PVE.form.ControllerSelector', {
+ withVirtIO: false,
+ fieldLabel: gettext('CloudInit Drive'),
+ });
+ }
items.push(me.busSelector);
items.push({
@@ -52,6 +74,8 @@ Ext.define('PVE.qemu.CIDriveInputPanel', {
itemId: 'storselector',
storageContent: 'images',
nodename: me.nodename,
+ disabled: !me.isCreate,
+ hideFormat: !me.isCreate,
hideSize: true,
});
@@ -65,8 +89,6 @@ Ext.define('PVE.qemu.CIDriveEdit', {
extend: 'Proxmox.window.Edit',
xtype: 'pveCIDriveEdit',
- isCreate: true,
-
initComponent: function() {
let me = this;
@@ -75,8 +97,12 @@ Ext.define('PVE.qemu.CIDriveEdit', {
throw "no node name specified";
}
+ me.isCreate = !me.confid;
+
let ipanel = Ext.create('PVE.qemu.CIDriveInputPanel', {
+ confid: me.confid,
nodename: nodename,
+ isCreate: me.isCreate,
});
Ext.applyIf(me, {
@@ -89,6 +115,19 @@ Ext.define('PVE.qemu.CIDriveEdit', {
me.load({
success: function(response, opts) {
ipanel.setVMConfig(response.result.data);
+
+ if (me.confid) {
+ let value = response.result.data[me.confid];
+ let drive = PVE.Parser.parseQemuDrive(me.confid, value);
+
+ if (!drive) {
+ Ext.Msg.alert('Error', 'Unable to parse drive options');
+ me.close();
+ return;
+ }
+
+ ipanel.setDrive(drive);
+ }
},
});
},
diff --git a/www/manager6/qemu/HardwareView.js b/www/manager6/qemu/HardwareView.js
index 86d5f4cf..c7a77bd9 100644
--- a/www/manager6/qemu/HardwareView.js
+++ b/www/manager6/qemu/HardwareView.js
@@ -350,7 +350,7 @@ Ext.define('PVE.qemu.HardwareView', {
if (rowdef.isOnStorageBus) {
let value = me.getObjectValue(rec.data.key, '', true);
if (isCloudInitKey(value)) {
- return;
+ editor = 'PVE.qemu.CIDriveEdit';
} else if (value.match(/media=cdrom/)) {
editor = 'PVE.qemu.CDEdit';
} else if (!diskCap) {
@@ -629,7 +629,7 @@ Ext.define('PVE.qemu.HardwareView', {
remove_btn.RESTMethod = isUnusedDisk || (isDisk && isRunning) ? 'POST' : 'PUT';
edit_btn.setDisabled(
- deleted || !row.editor || isCloudInit || (isCDRom && !cdromCap) || (isDisk && !diskCap));
+ deleted || !row.editor || (isCDRom && !cdromCap) || (isDisk && !diskCap));
diskaction_btn.setDisabled(
pending ||
--
2.39.5
More information about the pve-devel
mailing list