]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/dc/Cluster.js
ui: dc/Cluster: rename ring columns to link
[pve-manager.git] / www / manager6 / dc / Cluster.js
1 /*jslint confusion: true*/
2 Ext.define('pve-cluster-nodes', {
3 extend: 'Ext.data.Model',
4 fields: [
5 'node', { type: 'integer', name: 'nodeid' }, 'ring0_addr', 'ring1_addr',
6 { type: 'integer', name: 'quorum_votes' }
7 ],
8 proxy: {
9 type: 'proxmox',
10 url: "/api2/json/cluster/config/nodes"
11 },
12 idProperty: 'nodeid'
13 });
14
15 Ext.define('pve-cluster-info', {
16 extend: 'Ext.data.Model',
17 proxy: {
18 type: 'proxmox',
19 url: "/api2/json/cluster/config/join"
20 }
21 });
22
23 Ext.define('PVE.ClusterAdministration', {
24 extend: 'Ext.panel.Panel',
25 xtype: 'pveClusterAdministration',
26
27 title: gettext('Cluster Administration'),
28 onlineHelp: 'chapter_pvecm',
29
30 border: false,
31 defaults: { border: false },
32
33 viewModel: {
34 parent: null,
35 data: {
36 totem: {},
37 nodelist: [],
38 preferred_node: {
39 name: '',
40 fp: '',
41 addr: ''
42 },
43 isInCluster: false,
44 nodecount: 0
45 }
46 },
47
48 items: [
49 {
50 xtype: 'panel',
51 title: gettext('Cluster Information'),
52 controller: {
53 xclass: 'Ext.app.ViewController',
54
55 init: function(view) {
56 view.store = Ext.create('Proxmox.data.UpdateStore', {
57 autoStart: true,
58 interval: 15 * 1000,
59 storeid: 'pve-cluster-info',
60 model: 'pve-cluster-info'
61 });
62 view.store.on('load', this.onLoad, this);
63 view.on('destroy', view.store.stopUpdate);
64 },
65
66 onLoad: function(store, records, success) {
67 var vm = this.getViewModel();
68 if (!success || !records || !records[0].data) {
69 vm.set('totem', {});
70 vm.set('isInCluster', false);
71 vm.set('nodelist', []);
72 vm.set('preferred_node', {
73 name: '',
74 addr: '',
75 fp: ''
76 });
77 return;
78 }
79 var data = records[0].data;
80 vm.set('totem', data.totem);
81 vm.set('isInCluster', !!data.totem.cluster_name);
82 vm.set('nodelist', data.nodelist);
83
84 var nodeinfo = Ext.Array.findBy(data.nodelist, function (el) {
85 return el.name === data.preferred_node;
86 });
87
88 vm.set('preferred_node', {
89 name: data.preferred_node,
90 addr: nodeinfo.pve_addr,
91 ring_addr: [ nodeinfo.ring0_addr, nodeinfo.ring1_addr ],
92 fp: nodeinfo.pve_fp
93 });
94 },
95
96 onCreate: function() {
97 var view = this.getView();
98 view.store.stopUpdate();
99 var win = Ext.create('PVE.ClusterCreateWindow', {
100 autoShow: true,
101 listeners: {
102 destroy: function() {
103 view.store.startUpdate();
104 }
105 }
106 });
107 },
108
109 onClusterInfo: function() {
110 var vm = this.getViewModel();
111 var win = Ext.create('PVE.ClusterInfoWindow', {
112 joinInfo: {
113 ipAddress: vm.get('preferred_node.addr'),
114 fingerprint: vm.get('preferred_node.fp'),
115 ring_addr: vm.get('preferred_node.ring_addr'),
116 totem: vm.get('totem')
117 }
118 });
119 win.show();
120 },
121
122 onJoin: function() {
123 var view = this.getView();
124 view.store.stopUpdate();
125 var win = Ext.create('PVE.ClusterJoinNodeWindow', {
126 autoShow: true,
127 listeners: {
128 destroy: function() {
129 view.store.startUpdate();
130 }
131 }
132 });
133 }
134 },
135 tbar: [
136 {
137 text: gettext('Create Cluster'),
138 reference: 'createButton',
139 handler: 'onCreate',
140 bind: {
141 disabled: '{isInCluster}'
142 }
143 },
144 {
145 text: gettext('Join Information'),
146 reference: 'addButton',
147 handler: 'onClusterInfo',
148 bind: {
149 disabled: '{!isInCluster}'
150 }
151 },
152 {
153 text: gettext('Join Cluster'),
154 reference: 'joinButton',
155 handler: 'onJoin',
156 bind: {
157 disabled: '{isInCluster}'
158 }
159 }
160 ],
161 layout: 'hbox',
162 bodyPadding: 5,
163 items: [
164 {
165 xtype: 'displayfield',
166 fieldLabel: gettext('Cluster Name'),
167 bind: {
168 value: '{totem.cluster_name}',
169 hidden: '{!isInCluster}'
170 },
171 flex: 1
172 },
173 {
174 xtype: 'displayfield',
175 fieldLabel: gettext('Config Version'),
176 bind: {
177 value: '{totem.config_version}',
178 hidden: '{!isInCluster}'
179 },
180 flex: 1
181 },
182 {
183 xtype: 'displayfield',
184 fieldLabel: gettext('Number of Nodes'),
185 labelWidth: 120,
186 bind: {
187 value: '{nodecount}',
188 hidden: '{!isInCluster}'
189 },
190 flex: 1
191 },
192 {
193 xtype: 'displayfield',
194 value: gettext('Standalone node - no cluster defined'),
195 bind: {
196 hidden: '{isInCluster}'
197 },
198 flex: 1
199 }
200 ]
201 },
202 {
203 xtype: 'grid',
204 title: gettext('Cluster Nodes'),
205 controller: {
206 xclass: 'Ext.app.ViewController',
207
208 init: function(view) {
209 view.rstore = Ext.create('Proxmox.data.UpdateStore', {
210 autoLoad: true,
211 xtype: 'update',
212 interval: 5 * 1000,
213 autoStart: true,
214 storeid: 'pve-cluster-nodes',
215 model: 'pve-cluster-nodes'
216 });
217 view.setStore(Ext.create('Proxmox.data.DiffStore', {
218 rstore: view.rstore,
219 sorters: {
220 property: 'nodeid',
221 order: 'DESC'
222 }
223 }));
224 Proxmox.Utils.monStoreErrors(view, view.rstore);
225 view.rstore.on('load', this.onLoad, this);
226 view.on('destroy', view.rstore.stopUpdate);
227 },
228
229 onLoad: function(store, records, success) {
230 var vm = this.getViewModel();
231 if (!success || !records) {
232 vm.set('nodecount', 0);
233 return;
234 }
235 vm.set('nodecount', records.length);
236 }
237 },
238 columns: [
239 {
240 header: gettext('Nodename'),
241 flex: 2,
242 dataIndex: 'name'
243 },
244 {
245 header: gettext('ID'),
246 flex: 1,
247 dataIndex: 'nodeid'
248 },
249 {
250 header: gettext('Votes'),
251 flex: 1,
252 dataIndex: 'quorum_votes'
253 },
254 {
255 header: Ext.String.format(gettext('Link {0}'), 0),
256 flex: 2,
257 dataIndex: 'ring0_addr'
258 },
259 {
260 header: Ext.String.format(gettext('Link {0}'), 1),
261 flex: 2,
262 dataIndex: 'ring1_addr'
263 }
264 ]
265 }
266 ]
267 });