]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/qemu/NetworkEdit.js
ui: vm vNIC: add empty text for MTU field
[pve-manager.git] / www / manager6 / qemu / NetworkEdit.js
1 Ext.define('PVE.qemu.NetworkInputPanel', {
2 extend: 'Proxmox.panel.InputPanel',
3 alias: 'widget.pveQemuNetworkInputPanel',
4 onlineHelp: 'qm_network_device',
5
6 insideWizard: false,
7
8 onGetValues: function(values) {
9 var me = this;
10
11 me.network.model = values.model;
12 if (values.nonetwork) {
13 return {};
14 } else {
15 me.network.bridge = values.bridge;
16 me.network.tag = values.tag;
17 me.network.firewall = values.firewall;
18 }
19 me.network.macaddr = values.macaddr;
20 me.network.disconnect = values.disconnect;
21 me.network.queues = values.queues;
22 me.network.mtu = values.mtu;
23
24 if (values.rate) {
25 me.network.rate = values.rate;
26 } else {
27 delete me.network.rate;
28 }
29
30 var params = {};
31
32 params[me.confid] = PVE.Parser.printQemuNetwork(me.network);
33
34 return params;
35 },
36
37 viewModel: {
38 data: {
39 networkModel: '',
40 mtu: '',
41 },
42 formulas: {
43 isVirtio: get => get('networkModel') === 'virtio',
44 showMtuHint: get => get('mtu') === 1,
45 },
46 },
47
48 setNetwork: function(confid, data) {
49 var me = this;
50
51 me.confid = confid;
52
53 if (data) {
54 data.networkmode = data.bridge ? 'bridge' : 'nat';
55 } else {
56 data = {};
57 data.networkmode = 'bridge';
58 }
59 me.network = data;
60
61 me.setValues(me.network);
62 },
63
64 setNodename: function(nodename) {
65 var me = this;
66
67 me.bridgesel.setNodename(nodename);
68 },
69
70 initComponent: function() {
71 var me = this;
72
73 me.network = {};
74 me.confid = 'net0';
75
76 me.column1 = [];
77 me.column2 = [];
78
79 me.bridgesel = Ext.create('PVE.form.BridgeSelector', {
80 name: 'bridge',
81 fieldLabel: gettext('Bridge'),
82 nodename: me.nodename,
83 autoSelect: true,
84 allowBlank: false,
85 });
86
87 me.column1 = [
88 me.bridgesel,
89 {
90 xtype: 'pveVlanField',
91 name: 'tag',
92 value: '',
93 },
94 {
95 xtype: 'proxmoxcheckbox',
96 fieldLabel: gettext('Firewall'),
97 name: 'firewall',
98 checked: me.insideWizard || me.isCreate,
99 },
100 ];
101
102 me.advancedColumn1 = [
103 {
104 xtype: 'proxmoxcheckbox',
105 fieldLabel: gettext('Disconnect'),
106 name: 'disconnect',
107 },
108 {
109 xtype: 'proxmoxintegerfield',
110 name: 'mtu',
111 fieldLabel: 'MTU',
112 bind: {
113 disabled: '{!isVirtio}',
114 value: '{mtu}',
115 },
116 emptyText: '1500 (1 = bridge MTU)',
117 minValue: 1,
118 maxValue: 65520,
119 allowBlank: true,
120 },
121 ];
122
123 if (me.insideWizard) {
124 me.column1.unshift({
125 xtype: 'checkbox',
126 name: 'nonetwork',
127 inputValue: 'none',
128 boxLabel: gettext('No network device'),
129 listeners: {
130 change: function(cb, value) {
131 var fields = [
132 'disconnect',
133 'bridge',
134 'tag',
135 'firewall',
136 'model',
137 'macaddr',
138 'rate',
139 'queues',
140 'mtu',
141 ];
142 fields.forEach(function(fieldname) {
143 me.down('field[name='+fieldname+']').setDisabled(value);
144 });
145 me.down('field[name=bridge]').validate();
146 },
147 },
148 });
149 me.column2.unshift({
150 xtype: 'displayfield',
151 });
152 }
153
154 me.column2.push(
155 {
156 xtype: 'pveNetworkCardSelector',
157 name: 'model',
158 fieldLabel: gettext('Model'),
159 bind: '{networkModel}',
160 value: PVE.qemu.OSDefaults.generic.networkCard,
161 allowBlank: false,
162 },
163 {
164 xtype: 'textfield',
165 name: 'macaddr',
166 fieldLabel: gettext('MAC address'),
167 vtype: 'MacAddress',
168 allowBlank: true,
169 emptyText: 'auto',
170 });
171 me.advancedColumn2 = [
172 {
173 xtype: 'numberfield',
174 name: 'rate',
175 fieldLabel: gettext('Rate limit') + ' (MB/s)',
176 minValue: 0,
177 maxValue: 10*1024,
178 value: '',
179 emptyText: 'unlimited',
180 allowBlank: true,
181 },
182 {
183 xtype: 'proxmoxintegerfield',
184 name: 'queues',
185 fieldLabel: 'Multiqueue',
186 minValue: 1,
187 maxValue: 64,
188 value: '',
189 allowBlank: true,
190 },
191 ];
192 me.advancedColumnB = [
193 {
194 xtype: 'displayfield',
195 userCls: 'pmx-hint',
196 value: gettext("Use the special value '1' to inherit the MTU value from the underlying bridge"),
197 bind: {
198 hidden: '{!showMtuHint}',
199 },
200 },
201 ];
202
203 me.callParent();
204 },
205 });
206
207 Ext.define('PVE.qemu.NetworkEdit', {
208 extend: 'Proxmox.window.Edit',
209
210 isAdd: true,
211
212 initComponent: function() {
213 var me = this;
214
215 var nodename = me.pveSelNode.data.node;
216 if (!nodename) {
217 throw "no node name specified";
218 }
219
220 me.isCreate = !me.confid;
221
222 var ipanel = Ext.create('PVE.qemu.NetworkInputPanel', {
223 confid: me.confid,
224 nodename: nodename,
225 isCreate: me.isCreate,
226 });
227
228 Ext.applyIf(me, {
229 subject: gettext('Network Device'),
230 items: ipanel,
231 });
232
233 me.callParent();
234
235 me.load({
236 success: function(response, options) {
237 var i, confid;
238 me.vmconfig = response.result.data;
239 if (!me.isCreate) {
240 var value = me.vmconfig[me.confid];
241 var network = PVE.Parser.parseQemuNetwork(me.confid, value);
242 if (!network) {
243 Ext.Msg.alert(gettext('Error'), 'Unable to parse network options');
244 me.close();
245 return;
246 }
247 ipanel.setNetwork(me.confid, network);
248 } else {
249 for (i = 0; i < 100; i++) {
250 confid = 'net' + i.toString();
251 if (!Ext.isDefined(me.vmconfig[confid])) {
252 me.confid = confid;
253 break;
254 }
255 }
256
257 let ostype = me.vmconfig.ostype;
258 let defaults = PVE.qemu.OSDefaults.getDefaults(ostype);
259 let data = {
260 model: defaults.networkCard,
261 };
262
263 ipanel.setNetwork(me.confid, data);
264 }
265 },
266 });
267 },
268 });