]>
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'), | |
57 | renderer: PVE.Utils.render_cpu, | |
58 | sortable: true, | |
59 | width: 100, | |
f6710aac TL |
60 | dataIndex: 'cpu', |
61 | }, | |
62 | ], | |
9ccd656a | 63 | }, |
0af13848 | 64 | |
9ccd656a | 65 | validator: function(value) { |
9ccd656a | 66 | var me = this; |
53e3ea84 | 67 | if (!me.onlineValidator || me.allowBlank && !value) { |
9ccd656a EK |
68 | return true; |
69 | } | |
0af13848 | 70 | |
9ccd656a EK |
71 | var offline = []; |
72 | var notAllowed = []; | |
0af13848 | 73 | |
9ccd656a | 74 | Ext.Array.each(value.split(/\s*,\s*/), function(node) { |
8267aa63 | 75 | var rec = me.store.findRecord(me.valueField, node, 0, false, true, true); |
c0d4a151 | 76 | if (!(rec && rec.data) || rec.data.status !== 'online') { |
9ccd656a EK |
77 | offline.push(node); |
78 | } else if (me.allowedNodes && !Ext.Array.contains(me.allowedNodes, node)) { | |
79 | notAllowed.push(node); | |
0af13848 DM |
80 | } |
81 | }); | |
82 | ||
7c115076 | 83 | if (value && notAllowed.length !== 0) { |
9ccd656a EK |
84 | return "Node " + notAllowed.join(', ') + " is not allowed for this action!"; |
85 | } | |
86 | ||
7c115076 | 87 | if (value && offline.length !== 0) { |
9ccd656a EK |
88 | return "Node " + offline.join(', ') + " seems to be offline!"; |
89 | } | |
90 | return true; | |
91 | }, | |
92 | ||
93 | initComponent: function() { | |
94 | var me = this; | |
95 | ||
134b4017 | 96 | if (me.selectCurNode && PVE.curSelectedNode && PVE.curSelectedNode.data.node) { |
0af13848 DM |
97 | me.preferredValue = PVE.curSelectedNode.data.node; |
98 | } | |
99 | ||
100 | me.callParent(); | |
9ccd656a | 101 | me.getStore().load(); |
97ec0d07 TL |
102 | |
103 | // filter out disallowed nodes | |
104 | me.getStore().addFilter(new Ext.util.Filter({ | |
105 | filterFn: function(item) { | |
ce57c4a6 DC |
106 | if (Ext.isArray(me.disallowedNodes)) { |
107 | return !Ext.Array.contains(me.disallowedNodes, item.data.node); | |
108 | } else { | |
109 | return true; | |
110 | } | |
f6710aac | 111 | }, |
97ec0d07 TL |
112 | })); |
113 | ||
8058410f | 114 | me.mon(me.getStore(), 'load', function() { |
e4ad4e06 DC |
115 | me.isValid(); |
116 | }); | |
f6710aac | 117 | }, |
0af13848 | 118 | }); |