]>
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: { | |
0af13848 | 22 | fields: [ 'node', 'cpu', 'maxcpu', 'mem', 'maxmem', 'uptime' ], |
0af13848 | 23 | proxy: { |
56a353b9 | 24 | type: 'proxmox', |
0af13848 DM |
25 | url: '/api2/json/nodes' |
26 | }, | |
27 | sorters: [ | |
28 | { | |
29 | property : 'node', | |
30 | direction: 'ASC' | |
31 | }, | |
32 | { | |
33 | property : 'mem', | |
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, | |
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, | |
53 | dataIndex: 'mem' | |
54 | }, | |
55 | { | |
56 | header: gettext('CPU usage'), | |
57 | renderer: PVE.Utils.render_cpu, | |
58 | sortable: true, | |
59 | width: 100, | |
60 | dataIndex: 'cpu' | |
61 | } | |
22f2f9d6 | 62 | ] |
9ccd656a | 63 | }, |
0af13848 | 64 | |
9ccd656a | 65 | validator: function(value) { |
9ccd656a EK |
66 | var me = this; |
67 | if (!me.onlineValidator || (me.allowBlank && !value)) { | |
68 | return true; | |
69 | } | |
0af13848 | 70 | |
9ccd656a EK |
71 | var offline = []; |
72 | var notAllowed = []; | |
0af13848 | 73 | |
9ccd656a EK |
74 | Ext.Array.each(value.split(/\s*,\s*/), function(node) { |
75 | var rec = me.store.findRecord(me.valueField, node); | |
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 | } | |
97ec0d07 TL |
111 | } |
112 | })); | |
113 | ||
e4ad4e06 DC |
114 | me.mon(me.getStore(), 'load', function(){ |
115 | me.isValid(); | |
116 | }); | |
0af13848 DM |
117 | } |
118 | }); |