]>
Commit | Line | Data |
---|---|---|
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: undefined, | |
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 | validator: val => val === '' || val >= 576 || val === '1' | |
121 | ? true | |
122 | : gettext('MTU needs to be >= 576 or 1 to inherit the MTU from the underlying bridge.'), | |
123 | }, | |
124 | ]; | |
125 | ||
126 | if (me.insideWizard) { | |
127 | me.column1.unshift({ | |
128 | xtype: 'checkbox', | |
129 | name: 'nonetwork', | |
130 | inputValue: 'none', | |
131 | boxLabel: gettext('No network device'), | |
132 | listeners: { | |
133 | change: function(cb, value) { | |
134 | var fields = [ | |
135 | 'disconnect', | |
136 | 'bridge', | |
137 | 'tag', | |
138 | 'firewall', | |
139 | 'model', | |
140 | 'macaddr', | |
141 | 'rate', | |
142 | 'queues', | |
143 | 'mtu', | |
144 | ]; | |
145 | fields.forEach(function(fieldname) { | |
146 | me.down('field[name='+fieldname+']').setDisabled(value); | |
147 | }); | |
148 | me.down('field[name=bridge]').validate(); | |
149 | }, | |
150 | }, | |
151 | }); | |
152 | me.column2.unshift({ | |
153 | xtype: 'displayfield', | |
154 | }); | |
155 | } | |
156 | ||
157 | me.column2.push( | |
158 | { | |
159 | xtype: 'pveNetworkCardSelector', | |
160 | name: 'model', | |
161 | fieldLabel: gettext('Model'), | |
162 | bind: '{networkModel}', | |
163 | value: PVE.qemu.OSDefaults.generic.networkCard, | |
164 | allowBlank: false, | |
165 | }, | |
166 | { | |
167 | xtype: 'textfield', | |
168 | name: 'macaddr', | |
169 | fieldLabel: gettext('MAC address'), | |
170 | vtype: 'MacAddress', | |
171 | allowBlank: true, | |
172 | emptyText: 'auto', | |
173 | }); | |
174 | me.advancedColumn2 = [ | |
175 | { | |
176 | xtype: 'numberfield', | |
177 | name: 'rate', | |
178 | fieldLabel: gettext('Rate limit') + ' (MB/s)', | |
179 | minValue: 0, | |
180 | maxValue: 10*1024, | |
181 | value: '', | |
182 | emptyText: 'unlimited', | |
183 | allowBlank: true, | |
184 | }, | |
185 | { | |
186 | xtype: 'proxmoxintegerfield', | |
187 | name: 'queues', | |
188 | fieldLabel: 'Multiqueue', | |
189 | minValue: 1, | |
190 | maxValue: 64, | |
191 | value: '', | |
192 | allowBlank: true, | |
193 | }, | |
194 | ]; | |
195 | me.advancedColumnB = [ | |
196 | { | |
197 | xtype: 'displayfield', | |
198 | userCls: 'pmx-hint', | |
199 | value: gettext("Use the special value '1' to inherit the MTU value from the underlying bridge"), | |
200 | bind: { | |
201 | hidden: '{!showMtuHint}', | |
202 | }, | |
203 | }, | |
204 | ]; | |
205 | ||
206 | me.callParent(); | |
207 | }, | |
208 | }); | |
209 | ||
210 | Ext.define('PVE.qemu.NetworkEdit', { | |
211 | extend: 'Proxmox.window.Edit', | |
212 | ||
213 | isAdd: true, | |
214 | ||
215 | initComponent: function() { | |
216 | var me = this; | |
217 | ||
218 | var nodename = me.pveSelNode.data.node; | |
219 | if (!nodename) { | |
220 | throw "no node name specified"; | |
221 | } | |
222 | ||
223 | me.isCreate = !me.confid; | |
224 | ||
225 | var ipanel = Ext.create('PVE.qemu.NetworkInputPanel', { | |
226 | confid: me.confid, | |
227 | nodename: nodename, | |
228 | isCreate: me.isCreate, | |
229 | }); | |
230 | ||
231 | Ext.applyIf(me, { | |
232 | subject: gettext('Network Device'), | |
233 | items: ipanel, | |
234 | }); | |
235 | ||
236 | me.callParent(); | |
237 | ||
238 | me.load({ | |
239 | success: function(response, options) { | |
240 | var i, confid; | |
241 | me.vmconfig = response.result.data; | |
242 | if (!me.isCreate) { | |
243 | var value = me.vmconfig[me.confid]; | |
244 | var network = PVE.Parser.parseQemuNetwork(me.confid, value); | |
245 | if (!network) { | |
246 | Ext.Msg.alert(gettext('Error'), 'Unable to parse network options'); | |
247 | me.close(); | |
248 | return; | |
249 | } | |
250 | ipanel.setNetwork(me.confid, network); | |
251 | } else { | |
252 | for (i = 0; i < 100; i++) { | |
253 | confid = 'net' + i.toString(); | |
254 | if (!Ext.isDefined(me.vmconfig[confid])) { | |
255 | me.confid = confid; | |
256 | break; | |
257 | } | |
258 | } | |
259 | ||
260 | let ostype = me.vmconfig.ostype; | |
261 | let defaults = PVE.qemu.OSDefaults.getDefaults(ostype); | |
262 | let data = { | |
263 | model: defaults.networkCard, | |
264 | }; | |
265 | ||
266 | ipanel.setNetwork(me.confid, data); | |
267 | } | |
268 | }, | |
269 | }); | |
270 | }, | |
271 | }); |