]> git.proxmox.com Git - proxmox-widget-toolkit.git/blame - node/NetworkEdit.js
fix Firefox spinner scroller
[proxmox-widget-toolkit.git] / node / NetworkEdit.js
CommitLineData
a58001dd
DM
1Ext.define('Proxmox.node.NetworkEdit', {
2 extend: 'Proxmox.window.Edit',
3 alias: ['widget.proxmoxNodeNetworkEdit'],
4
5 initComponent : function() {
6 var me = this;
7
8 if (!me.nodename) {
9 throw "no node name specified";
10 }
11
12 if (!me.iftype) {
13 throw "no network device type specified";
14 }
15
b33f451f 16 me.isCreate = !me.iface;
a58001dd
DM
17
18 var iface_vtype;
19
20 if (me.iftype === 'bridge') {
21 iface_vtype = 'BridgeName';
22 } else if (me.iftype === 'bond') {
23 iface_vtype = 'BondName';
b33f451f 24 } else if (me.iftype === 'eth' && !me.isCreate) {
a58001dd 25 iface_vtype = 'InterfaceName';
b33f451f 26 } else if (me.iftype === 'vlan' && !me.isCreate) {
a58001dd
DM
27 iface_vtype = 'InterfaceName';
28 } else if (me.iftype === 'OVSBridge') {
29 iface_vtype = 'BridgeName';
30 } else if (me.iftype === 'OVSBond') {
31 iface_vtype = 'BondName';
32 } else if (me.iftype === 'OVSIntPort') {
33 iface_vtype = 'InterfaceName';
34 } else if (me.iftype === 'OVSPort') {
35 iface_vtype = 'InterfaceName';
36 } else {
37 console.log(me.iftype);
38 throw "unknown network device type specified";
39 }
40
41 me.subject = Proxmox.Utils.render_network_iface_type(me.iftype);
42
43 var column2 = [];
44
45 if (!(me.iftype === 'OVSIntPort' || me.iftype === 'OVSPort' ||
46 me.iftype === 'OVSBond')) {
47 column2.push({
fccec7c6 48 xtype: 'proxmoxcheckbox',
a58001dd
DM
49 fieldLabel: gettext('Autostart'),
50 name: 'autostart',
51 uncheckedValue: 0,
b33f451f 52 checked: me.isCreate ? true : undefined
a58001dd
DM
53 });
54 }
55
56 if (me.iftype === 'bridge') {
57 column2.push({
fccec7c6 58 xtype: 'proxmoxcheckbox',
a58001dd
DM
59 fieldLabel: gettext('VLAN aware'),
60 name: 'bridge_vlan_aware',
b33f451f 61 deleteEmpty: !me.isCreate
a58001dd
DM
62 });
63 column2.push({
64 xtype: 'textfield',
65 fieldLabel: gettext('Bridge ports'),
66 name: 'bridge_ports'
67 });
68 } else if (me.iftype === 'OVSBridge') {
69 column2.push({
70 xtype: 'textfield',
71 fieldLabel: gettext('Bridge ports'),
72 name: 'ovs_ports'
73 });
74 column2.push({
75 xtype: 'textfield',
76 fieldLabel: gettext('OVS options'),
77 name: 'ovs_options'
78 });
79 } else if (me.iftype === 'OVSPort' || me.iftype === 'OVSIntPort') {
80 column2.push({
b33f451f 81 xtype: me.isCreate ? 'PVE.form.BridgeSelector' : 'displayfield',
a58001dd
DM
82 fieldLabel: Proxmox.Utils.render_network_iface_type('OVSBridge'),
83 allowBlank: false,
84 nodename: me.nodename,
85 bridgeType: 'OVSBridge',
86 name: 'ovs_bridge'
87 });
88 column2.push({
89 xtype: 'pveVlanField',
b33f451f 90 deleteEmpty: !me.isCreate,
a58001dd
DM
91 name: 'ovs_tag',
92 value: ''
93 });
94 column2.push({
95 xtype: 'textfield',
96 fieldLabel: gettext('OVS options'),
97 name: 'ovs_options'
98 });
99 } else if (me.iftype === 'bond') {
100 column2.push({
101 xtype: 'textfield',
102 fieldLabel: gettext('Slaves'),
103 name: 'slaves'
104 });
105
106 var policySelector = Ext.createWidget('bondPolicySelector', {
107 fieldLabel: gettext('Hash policy'),
108 name: 'bond_xmit_hash_policy',
b33f451f 109 deleteEmpty: !me.isCreate,
a58001dd
DM
110 disabled: true
111 });
112
113 column2.push({
114 xtype: 'bondModeSelector',
115 fieldLabel: gettext('Mode'),
116 name: 'bond_mode',
b33f451f 117 value: me.isCreate ? 'balance-rr' : undefined,
a58001dd
DM
118 listeners: {
119 change: function(f, value) {
120 if (value === 'balance-xor' ||
121 value === '802.3ad') {
122 policySelector.setDisabled(false);
123 } else {
124 policySelector.setDisabled(true);
125 policySelector.setValue('');
126 }
127 }
128 },
129 allowBlank: false
130 });
131
132 column2.push(policySelector);
133
134 } else if (me.iftype === 'OVSBond') {
135 column2.push({
b33f451f 136 xtype: me.isCreate ? 'PVE.form.BridgeSelector' : 'displayfield',
a58001dd
DM
137 fieldLabel: Proxmox.Utils.render_network_iface_type('OVSBridge'),
138 allowBlank: false,
139 nodename: me.nodename,
140 bridgeType: 'OVSBridge',
141 name: 'ovs_bridge'
142 });
143 column2.push({
144 xtype: 'pveVlanField',
b33f451f 145 deleteEmpty: !me.isCreate,
a58001dd
DM
146 name: 'ovs_tag',
147 value: ''
148 });
149 column2.push({
150 xtype: 'textfield',
151 fieldLabel: gettext('OVS options'),
152 name: 'ovs_options'
153 });
154 }
155
156 column2.push({
157 xtype: 'textfield',
158 fieldLabel: gettext('Comment'),
159 allowBlank: true,
160 nodename: me.nodename,
161 name: 'comments'
162 });
163
164 var url;
165 var method;
166
b33f451f 167 if (me.isCreate) {
a58001dd
DM
168 url = "/api2/extjs/nodes/" + me.nodename + "/network";
169 method = 'POST';
170 } else {
171 url = "/api2/extjs/nodes/" + me.nodename + "/network/" + me.iface;
172 method = 'PUT';
173 }
174
175 var column1 = [
176 {
177 xtype: 'hiddenfield',
178 name: 'type',
179 value: me.iftype
180 },
181 {
b33f451f 182 xtype: me.isCreate ? 'textfield' : 'displayfield',
a58001dd
DM
183 fieldLabel: gettext('Name'),
184 name: 'iface',
185 value: me.iface,
186 vtype: iface_vtype,
187 allowBlank: false
188 }
189 ];
190
191 if (me.iftype === 'OVSBond') {
192 column1.push(
193 {
194 xtype: 'bondModeSelector',
195 fieldLabel: gettext('Mode'),
196 name: 'bond_mode',
197 openvswitch: true,
b33f451f 198 value: me.isCreate ? 'active-backup' : undefined,
a58001dd
DM
199 allowBlank: false
200 },
201 {
202 xtype: 'textfield',
203 fieldLabel: gettext('Slaves'),
204 name: 'ovs_bonds'
205 }
206 );
207 } else {
208
209 column1.push(
210 {
a0ec1620 211 xtype: 'proxmoxtextfield',
b33f451f 212 deleteEmpty: !me.isCreate,
8e2d096c
DC
213 fieldLabel: 'IPv4/CIDR',
214 vtype: 'IPCIDRAddress',
215 name: 'cidr'
a58001dd
DM
216 },
217 {
a0ec1620 218 xtype: 'proxmoxtextfield',
b33f451f 219 deleteEmpty: !me.isCreate,
8e2d096c 220 fieldLabel: gettext('Gateway') + ' (IPv4)',
a58001dd
DM
221 vtype: 'IPAddress',
222 name: 'gateway'
223 },
224 {
a0ec1620 225 xtype: 'proxmoxtextfield',
b33f451f 226 deleteEmpty: !me.isCreate,
8e2d096c
DC
227 fieldLabel: 'IPv6/CIDR',
228 vtype: 'IP6CIDRAddress',
229 name: 'cidr6'
a58001dd
DM
230 },
231 {
a0ec1620 232 xtype: 'proxmoxtextfield',
b33f451f 233 deleteEmpty: !me.isCreate,
8e2d096c 234 fieldLabel: gettext('Gateway') + ' (IPv6)',
a58001dd
DM
235 vtype: 'IP6Address',
236 name: 'gateway6'
237 }
238 );
239 }
240
241 Ext.applyIf(me, {
242 url: url,
243 method: method,
244 items: {
245 xtype: 'inputpanel',
246 column1: column1,
247 column2: column2
248 }
249 });
250
251 me.callParent();
252
b33f451f 253 if (me.isCreate) {
a58001dd
DM
254 me.down('field[name=iface]').setValue(me.iface_default);
255 } else {
256 me.load({
257 success: function(response, options) {
258 var data = response.result.data;
259 if (data.type !== me.iftype) {
260 var msg = "Got unexpected device type";
261 Ext.Msg.alert(gettext('Error'), msg, function() {
262 me.close();
263 });
264 return;
265 }
266 me.setValues(data);
267 me.isValid(); // trigger validation
268 }
269 });
270 }
271 }
272});