]>
Commit | Line | Data |
---|---|---|
04c32bed DM |
1 | Ext.define('PVE.window.Migrate', { |
2 | extend: 'Ext.window.Window', | |
3 | ||
2df7ea9f EK |
4 | config: { |
5 | vmtype: undefined, | |
6 | nodename: undefined, | |
7 | vmid: undefined | |
8 | }, | |
9 | // private, used to store the migration mode after checking if the guest runs | |
10 | liveMode: undefined, | |
11 | ||
12 | controller: { | |
13 | xclass: 'Ext.app.ViewController', | |
14 | control: { | |
15 | 'panel[reference=formPanel]': { | |
16 | validityChange: function(panel, isValid) { | |
17 | this.lookup('submitButton').setDisabled(!isValid); | |
18 | } | |
04c32bed | 19 | }, |
2df7ea9f EK |
20 | 'button[reference=submitButton]': { |
21 | click: function() { | |
22 | var me = this; | |
23 | var view = me.getView(); | |
24 | ||
25 | var values = me.lookup('formPanel').getValues(); | |
26 | var params = { | |
27 | target: values.target | |
28 | }; | |
29 | ||
1c62fde2 EK |
30 | if (view.liveMode) { |
31 | params[view.liveMode] = 1; | |
2df7ea9f EK |
32 | } |
33 | ||
e7ade592 | 34 | Proxmox.Utils.API2Request({ |
2df7ea9f EK |
35 | params: params, |
36 | url: '/nodes/' + view.nodename + '/' + view.vmtype + '/' + view.vmid + '/migrate', | |
37 | waitMsgTarget: view, | |
38 | method: 'POST', | |
39 | failure: function(response, opts) { | |
40 | Ext.Msg.alert(gettext('Error'), response.htmlStatus); | |
41 | }, | |
42 | success: function(response, options) { | |
43 | var upid = response.result.data; | |
44 | var extraTitle = Ext.String.format(' ({0} ---> {1})', view.nodename, params.target); | |
45 | ||
8cbc11a7 | 46 | Ext.create('Proxmox.window.TaskViewer', { |
2df7ea9f EK |
47 | upid: upid, |
48 | extraTitle: extraTitle | |
49 | }).show(); | |
50 | ||
51 | view.close(); | |
52 | } | |
53 | }); | |
54 | } | |
04c32bed | 55 | } |
04c32bed | 56 | } |
2df7ea9f | 57 | }, |
04c32bed | 58 | |
2df7ea9f EK |
59 | width: 350, |
60 | modal: true, | |
61 | layout: 'auto', | |
62 | border: false, | |
63 | resizable: false, | |
64 | items: [ | |
65 | { | |
66 | xtype: 'form', | |
67 | reference: 'formPanel', | |
04c32bed DM |
68 | bodyPadding: 10, |
69 | border: false, | |
70 | fieldDefaults: { | |
71 | labelWidth: 100, | |
72 | anchor: '100%' | |
73 | }, | |
74 | items: [ | |
75 | { | |
d46faa2c | 76 | xtype: 'pveNodeSelector', |
2df7ea9f | 77 | reference: 'pveNodeSelector', |
04c32bed DM |
78 | name: 'target', |
79 | fieldLabel: gettext('Target node'), | |
80 | allowBlank: false, | |
2df7ea9f | 81 | disallowedNodes: undefined, |
04c32bed DM |
82 | onlineValidator: true |
83 | }, | |
84 | { | |
1c62fde2 EK |
85 | xtype: 'displayfield', |
86 | reference: 'migrationMode', | |
87 | fieldLabel: gettext('Mode'), | |
88 | value: gettext('Offline') | |
04c32bed | 89 | } |
2df7ea9f EK |
90 | ] |
91 | } | |
92 | ], | |
93 | buttons: [ | |
94 | { | |
95 | xtype: 'pveHelpButton', | |
96 | reference: 'pveHelpButton', | |
97 | onlineHelp: 'pct_migration', | |
98 | listenToGlobalEvent: false, | |
99 | hidden: false | |
100 | }, | |
101 | '->', | |
102 | { | |
103 | xtype: 'button', | |
104 | reference: 'submitButton', | |
105 | text: gettext('Migrate') | |
106 | } | |
107 | ], | |
04c32bed | 108 | |
2df7ea9f EK |
109 | initComponent : function() { |
110 | var me = this; | |
04c32bed | 111 | |
2df7ea9f EK |
112 | if (!me.nodename) { |
113 | throw "no node name specified"; | |
209daf22 DC |
114 | } |
115 | ||
2df7ea9f EK |
116 | if (!me.vmid) { |
117 | throw "no VM ID specified"; | |
118 | } | |
209daf22 | 119 | |
2df7ea9f EK |
120 | if (!me.vmtype) { |
121 | throw "no VM type specified"; | |
122 | } | |
04c32bed DM |
123 | |
124 | me.callParent(); | |
8f3600b6 | 125 | |
2df7ea9f EK |
126 | var title = gettext('Migrate') + (' CT ') + me.vmid; |
127 | me.liveMode = 'restart'; | |
128 | ||
129 | if (me.vmtype === 'qemu') { | |
2df7ea9f EK |
130 | me.lookup('pveHelpButton').setHelpConfig({ |
131 | onlineHelp: 'qm_migration' | |
132 | }); | |
133 | title = gettext('Migrate') + (' VM ') + me.vmid; | |
134 | me.liveMode = 'online'; | |
135 | } | |
2df7ea9f EK |
136 | |
137 | var running = false; | |
138 | var vmrec = PVE.data.ResourceStore.findRecord('vmid', me.vmid, | |
139 | 0, false, false, true); | |
140 | if (vmrec && vmrec.data && vmrec.data.running) { | |
141 | running = true; | |
142 | } | |
8f3600b6 | 143 | |
1c62fde2 EK |
144 | if (running) { |
145 | var displayField = me.lookup('migrationMode'); | |
146 | if (me.vmtype === 'qemu') { | |
147 | displayField.setValue(gettext('Online')); | |
148 | me.liveMode = 'online'; | |
149 | } else { | |
150 | displayField.setValue(gettext('Restart Mode')); | |
151 | me.liveMode = 'restart'; | |
152 | } | |
153 | } | |
154 | ||
155 | me.setTitle(title); | |
2df7ea9f EK |
156 | me.lookup('pveNodeSelector').disallowedNodes = [me.nodename]; |
157 | me.lookup('formPanel').isValid(); | |
04c32bed | 158 | } |
2df7ea9f | 159 | }); |