]>
Commit | Line | Data |
---|---|---|
0af13848 | 1 | Ext.define('PVE.form.NodeSelector', { |
0fc95a12 | 2 | extend: 'Proxmox.form.ComboGrid', |
d46faa2c | 3 | alias: ['widget.pveNodeSelector'], |
0af13848 DM |
4 | |
5 | // invalidate nodes which are offline | |
6 | onlineValidator: false, | |
7 | ||
8 | selectCurNode: false, | |
9 | ||
97ec0d07 TL |
10 | // do not allow those nodes (array) |
11 | disallowedNodes: undefined, | |
12 | ||
0af13848 DM |
13 | // only allow those nodes (array) |
14 | allowedNodes: undefined, | |
fbf6e7b4 DC |
15 | // set default value to empty array, else it inits it with |
16 | // null and after the store load it is an empty array, | |
17 | // triggering dirtychange | |
18 | value: [], | |
9ccd656a EK |
19 | valueField: 'node', |
20 | displayField: 'node', | |
21 | store: { | |
8058410f | 22 | fields: ['node', 'cpu', 'maxcpu', 'mem', 'maxmem', 'uptime'], |
0af13848 | 23 | proxy: { |
56a353b9 | 24 | type: 'proxmox', |
f6710aac | 25 | url: '/api2/json/nodes', |
0af13848 DM |
26 | }, |
27 | sorters: [ | |
28 | { | |
8058410f | 29 | property: 'node', |
f6710aac | 30 | direction: 'ASC', |
0af13848 DM |
31 | }, |
32 | { | |
8058410f | 33 | property: 'mem', |
f6710aac TL |
34 | direction: 'DESC', |
35 | }, | |
36 | ], | |
9ccd656a | 37 | }, |
0af13848 | 38 | |
9ccd656a EK |
39 | listConfig: { |
40 | columns: [ | |
41 | { | |
42 | header: gettext('Node'), | |
43 | dataIndex: 'node', | |
44 | sortable: true, | |
45 | hideable: false, | |
f6710aac | 46 | flex: 1, |
0af13848 | 47 | }, |
9ccd656a | 48 | { |
728f1b97 DC |
49 | header: gettext('Memory usage') + " %", |
50 | renderer: PVE.Utils.render_mem_usage_percent, | |
9ccd656a EK |
51 | sortable: true, |
52 | width: 100, | |
f6710aac | 53 | dataIndex: 'mem', |
9ccd656a EK |
54 | }, |
55 | { | |
56 | header: gettext('CPU usage'), | |
1bd7bcdb | 57 | renderer: Proxmox.Utils.render_cpu, |
9ccd656a EK |
58 | sortable: true, |
59 | width: 100, | |
f6710aac TL |
60 | dataIndex: 'cpu', |
61 | }, | |
62 | ], | |
9ccd656a | 63 | }, |
0af13848 | 64 | |
9ccd656a | 65 | validator: function(value) { |
65c6c5d5 TL |
66 | let me = this; |
67 | if (!me.onlineValidator || (me.allowBlank && !value)) { | |
9ccd656a EK |
68 | return true; |
69 | } | |
0af13848 | 70 | |
65c6c5d5 | 71 | let offline = [], notAllowed = []; |
9ccd656a | 72 | Ext.Array.each(value.split(/\s*,\s*/), function(node) { |
65c6c5d5 | 73 | let rec = me.store.findRecord(me.valueField, node, 0, false, true, true); |
c0d4a151 | 74 | if (!(rec && rec.data) || rec.data.status !== 'online') { |
9ccd656a EK |
75 | offline.push(node); |
76 | } else if (me.allowedNodes && !Ext.Array.contains(me.allowedNodes, node)) { | |
77 | notAllowed.push(node); | |
0af13848 DM |
78 | } |
79 | }); | |
80 | ||
7c115076 | 81 | if (value && notAllowed.length !== 0) { |
9ccd656a EK |
82 | return "Node " + notAllowed.join(', ') + " is not allowed for this action!"; |
83 | } | |
7c115076 | 84 | if (value && offline.length !== 0) { |
9ccd656a EK |
85 | return "Node " + offline.join(', ') + " seems to be offline!"; |
86 | } | |
87 | return true; | |
88 | }, | |
89 | ||
90 | initComponent: function() { | |
91 | var me = this; | |
92 | ||
65c6c5d5 TL |
93 | if (me.selectCurNode && PVE.curSelectedNode && PVE.curSelectedNode.data.node) { |
94 | me.preferredValue = PVE.curSelectedNode.data.node; | |
95 | } | |
0af13848 | 96 | |
65c6c5d5 TL |
97 | me.callParent(); |
98 | me.getStore().load(); | |
97ec0d07 | 99 | |
65c6c5d5 TL |
100 | me.getStore().addFilter(new Ext.util.Filter({ // filter out disallowed nodes |
101 | filterFn: (item) => !(me.disallowedNodes && me.disallowedNodes.includes(item.data.node)), | |
97ec0d07 TL |
102 | })); |
103 | ||
65c6c5d5 | 104 | me.mon(me.getStore(), 'load', () => me.isValid()); |
f6710aac | 105 | }, |
0af13848 | 106 | }); |