Adds a new button to the hardware panel labeled 'Reassign disk' and
enables a user to reassign a disk to another VM.

Signed-off-by: Aaron Lauterer <a.laute...@proxmox.com>
---
v3 -> v4:
* added check to not show template VMs in dropdown
* renamed disk parameter to `drive_name`

v2 -> v3:
* fixed check to omit the current vmid in the target dropdown
* renamed parameter disk to drive_key
* added missing comma

v1 -> v2: fixed linter errors

This patch needs the previous patch series [0] applied which adds the
backend for disk reassignments.

[0] https://lists.proxmox.com/pipermail/pve-devel/2020-December/046479.html

 www/manager6/Makefile             |  1 +
 www/manager6/qemu/HDReassign.js   | 80 +++++++++++++++++++++++++++++++
 www/manager6/qemu/HardwareView.js | 30 ++++++++++++
 3 files changed, 111 insertions(+)
 create mode 100644 www/manager6/qemu/HDReassign.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 85f90ecd..21debfcb 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -200,6 +200,7 @@ JSSRC=                                                      
\
        qemu/HDEdit.js                                  \
        qemu/HDEfi.js                                   \
        qemu/HDMove.js                                  \
+       qemu/HDReassign.js                              \
        qemu/HDResize.js                                \
        qemu/HardwareView.js                            \
        qemu/IPConfigEdit.js                            \
diff --git a/www/manager6/qemu/HDReassign.js b/www/manager6/qemu/HDReassign.js
new file mode 100644
index 00000000..d0aa97f8
--- /dev/null
+++ b/www/manager6/qemu/HDReassign.js
@@ -0,0 +1,80 @@
+Ext.define('PVE.window.HDReassign', {
+    extend: 'Proxmox.window.Edit',
+
+    resizeable: false,
+    title: gettext('Reassign disk'),
+    submitText: gettext('Reassign disk'),
+    showReset: false,
+    method: 'POST',
+    showProgress: true,
+    width: 350,
+
+    viewModel: {
+       data: {
+           targetVMData: {},
+           show_running_hint: false,
+       },
+    },
+
+    items: [
+       {
+           xtype: 'combobox',
+           name: 'target_vmid',
+           reference: 'target_vmid',
+           fieldLabel: gettext('Target VMID'),
+           bind: {
+               store: '{targetVMData}',
+           },
+           queryMode: 'local',
+           displayField: 'name',
+           valueField: 'vmid',
+           anyMatch: true,
+           emptyText: gettext('Select VM'),
+       },
+       {
+           xtype: 'displayfield',
+           padding: '5 0 0 0',
+           userCls: 'pmx-hint',
+           value: gettext('This disk cannot be reassigned while the VM is 
running'),
+           bind: {
+               hidden: '{!show_running_hint}',
+           },
+       },
+    ],
+
+    controller: {
+       xclass: 'Ext.app.ViewController',
+       init: function(view) {
+           let me = view;
+           let vm = me.getViewModel();
+           let vms = PVE.Utils.getNodeVMs(me.nodename);
+
+           let show_running_hint = vms[me.vmid].running && 
!me.drive_name.startsWith('unused');
+           vm.set('show_running_hint', show_running_hint);
+
+           if (show_running_hint) {
+               me.lookup('target_vmid').setDisabled(true);
+           }
+
+           let dropdownData = [];
+           for (const [vmid, data] of Object.entries(vms)) {
+               if (parseInt(vmid, 10) === parseInt(me.vmid, 10)) { continue; }
+               if (data.template) { continue; }
+               dropdownData.push({
+                   vmid: vmid,
+                   name: `${vmid} ${data.name}`,
+               });
+           }
+
+           vm.set('targetVMData', { data: dropdownData });
+       },
+    },
+
+    getValues: function() {
+       let me = this;
+       let values = me.callParent(arguments);
+       values.drive_name = me.drive_name;
+
+       return values;
+    },
+});
diff --git a/www/manager6/qemu/HardwareView.js 
b/www/manager6/qemu/HardwareView.js
index b641317d..7b357856 100644
--- a/www/manager6/qemu/HardwareView.js
+++ b/www/manager6/qemu/HardwareView.js
@@ -415,6 +415,25 @@ Ext.define('PVE.qemu.HardwareView', {
            win.on('destroy', me.reload, me);
        };
 
+       var run_reassign = function() {
+           let rec = sm.getSelection()[0];
+           if (!rec) {
+               return;
+           }
+
+           let win = Ext.create('PVE.window.HDReassign', {
+               drive_name: rec.data.key,
+               vmid: vmid,
+               nodename: nodename,
+               title: gettext('Reassign disk') + ': ' + rec.data.key,
+               url: '/api2/extjs/nodes/' + nodename + '/qemu/' + vmid + 
'/reassign_disk',
+           });
+
+           win.show();
+
+           win.on('destroy', me.reload, me);
+       };
+
        var edit_btn = new Proxmox.button.Button({
            text: gettext('Edit'),
            selModel: sm,
@@ -436,6 +455,13 @@ Ext.define('PVE.qemu.HardwareView', {
            handler: run_move
        });
 
+       var reassign_btn = new Proxmox.button.Button({
+           text: gettext('Reassign disk'),
+           selModel: sm,
+           disabled: true,
+           handler: run_reassign,
+       });
+
        var remove_btn = new Proxmox.button.Button({
            text: gettext('Remove'),
            defaultText: gettext('Remove'),
@@ -577,6 +603,7 @@ Ext.define('PVE.qemu.HardwareView', {
                edit_btn.disable();
                resize_btn.disable();
                move_btn.disable();
+               reassign_btn.disable();
                revert_btn.disable();
                return;
            }
@@ -603,6 +630,8 @@ Ext.define('PVE.qemu.HardwareView', {
 
            move_btn.setDisabled(pending || !(isUsedDisk || isEfi) || !diskCap);
 
+           reassign_btn.setDisabled(pending || !(isUsedDisk || isEfi || 
isUnusedDisk) || !diskCap);
+
            revert_btn.setDisabled(!pending);
 
        };
@@ -752,6 +781,7 @@ Ext.define('PVE.qemu.HardwareView', {
                edit_btn,
                resize_btn,
                move_btn,
+               reassign_btn,
                revert_btn
            ],
            rows: rows,
-- 
2.20.1



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to