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