diff --git a/www/manager/Makefile b/www/manager/Makefile index 472f1262..a5bb0362 100644 --- a/www/manager/Makefile +++ b/www/manager/Makefile @@ -63,6 +63,7 @@ JSSRC= \ node/Tasks.js \ node/Config.js \ qemu/StatusView.js \ + qemu/Migrate.js \ qemu/Summary.js \ qemu/OSTypeEdit.js \ qemu/ProcessorEdit.js \ diff --git a/www/manager/qemu/Migrate.js b/www/manager/qemu/Migrate.js new file mode 100644 index 00000000..bcf7be5a --- /dev/null +++ b/www/manager/qemu/Migrate.js @@ -0,0 +1,95 @@ +Ext.define('PVE.qemu.Migrate', { + extend: 'Ext.window.Window', + + resizable: false, + + migrate: function(vmid, nodename, target, online) { + var me = this; + PVE.Utils.API2Request({ + params: { target: target, online: online }, + url: '/nodes/' + nodename + '/qemu/' + vmid + "/migrate", + waitMsgTarget: me, + method: 'POST', + failure: function(response, opts) { + Ext.Msg.alert('Error', response.htmlStatus); + }, + success: function(response, options) { + var upid = response.result.data; + + var win = Ext.create('PVE.window.TaskViewer', { + upid: upid + }); + win.show(); + me.close(); + + me.workspace.selectById('root'); + } + }); + }, + + initComponent : function() { + var me = this; + + var nodename = me.pveSelNode.data.node; + if (!nodename) { + throw "no node name specified"; + } + + var vmid = me.pveSelNode.data.vmid; + if (!vmid) { + throw "no VM ID specified"; + } + + if (!me.workspace) { + throw "no Workspace specified"; + } + + me.formPanel = Ext.create('Ext.form.Panel', { + bodyPadding: 10, + border: false, + fieldDefaults: { + labelWidth: 100, + anchor: '100%' + }, + items: [ + { + xtype: 'PVE.form.NodeSelector', + name: 'target', + fieldLabel: 'Target node', + allowBlank: false, + onlineValidator: true + }, + { + xtype: 'pvecheckbox', + name: 'online', + uncheckedValue: 0, + defaultValue: 0, + fieldLabel: 'Online' + } + ] + }); + + var form = me.formPanel.getForm(); + + var submitBtn = Ext.create('Ext.Button', { + text: 'Migrate', + handler: function() { + var values = form.getValues(); + console.log("STARTMIGRATE " + vmid + " " + values.target + " " + values.online); + me.migrate(vmid, nodename, values.target, values.online); + } + }); + + Ext.apply(me, { + title: "Migrate KVM " + vmid, + width: 350, + modal: true, + layout: 'auto', + border: false, + items: [ me.formPanel ], + buttons: [ submitBtn ], + }); + + me.callParent(); + } +}); diff --git a/www/manager/qemu/Summary.js b/www/manager/qemu/Summary.js index 59b7b062..74937dd2 100644 --- a/www/manager/qemu/Summary.js +++ b/www/manager/qemu/Summary.js @@ -59,6 +59,17 @@ Ext.define('PVE.qemu.Summary', { }); } }, + { + itemId: 'migrate', + text: 'Migrate', + handler: function() { + var win = Ext.create('PVE.qemu.Migrate', { + pveSelNode: me.pveSelNode, + workspace: me.up('pveStdWorkspace') + }); + win.show(); + } + }, { text: 'Reset', itemId: 'reset', diff --git a/www/manager/window/TaskViewer.js b/www/manager/window/TaskViewer.js index a94da3a3..ee45d8fc 100644 --- a/www/manager/window/TaskViewer.js +++ b/www/manager/window/TaskViewer.js @@ -103,15 +103,21 @@ Ext.define('PVE.window.TaskViewer', { border: false }); + var lastStatus = 'unknown'; + me.mon(statstore, 'load', function() { var status = statgrid.getObjectValue('status'); + if (status === 'stopped') { statstore.stopUpdate(); } - if (status === 'running') { + + if (status === 'running' || lastStatus === 'running') { store.load(); } + lastStatus = status; + stop_btn1.setDisabled(status !== 'running'); stop_btn2.setDisabled(status !== 'running'); });