]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/dc/Cluster.js
1 Ext
.define('pve-cluster-nodes', {
2 extend
: 'Ext.data.Model',
4 'node', { type
: 'integer', name
: 'nodeid' }, 'ring0_addr', 'ring1_addr',
5 { type
: 'integer', name
: 'quorum_votes' },
9 url
: "/api2/json/cluster/config/nodes",
14 Ext
.define('pve-cluster-info', {
15 extend
: 'Ext.data.Model',
18 url
: "/api2/json/cluster/config/join",
22 Ext
.define('PVE.ClusterAdministration', {
23 extend
: 'Ext.panel.Panel',
24 xtype
: 'pveClusterAdministration',
26 title
: gettext('Cluster Administration'),
27 onlineHelp
: 'chapter_pvecm',
30 defaults
: { border
: false },
50 title
: gettext('Cluster Information'),
52 xclass
: 'Ext.app.ViewController',
54 init: function(view
) {
55 view
.store
= Ext
.create('Proxmox.data.UpdateStore', {
58 storeid
: 'pve-cluster-info',
59 model
: 'pve-cluster-info',
61 view
.store
.on('load', this.onLoad
, this);
62 view
.on('destroy', view
.store
.stopUpdate
);
65 onLoad: function(store
, records
, success
, operation
) {
66 let vm
= this.getViewModel();
68 let data
= records
?.[0]?.data
;
69 if (!success
|| !data
|| !data
.nodelist
?.length
) {
70 let error
= operation
.getError();
72 let msg
= Proxmox
.Utils
.getResponseErrorMessage(error
);
73 if (error
.status
!== 424 && !msg
.match(/node is not in a cluster/i)) {
74 // an actual error, not just the "not in a cluster one", so show it!
75 Proxmox
.Utils
.setErrorMask(this.getView(), error
);
79 vm
.set('isInCluster', false);
80 vm
.set('nodelist', []);
81 vm
.set('preferred_node', {
88 vm
.set('totem', data
.totem
);
89 vm
.set('isInCluster', !!data
.totem
.cluster_name
);
90 vm
.set('nodelist', data
.nodelist
);
92 let nodeinfo
= data
.nodelist
.find(el
=> el
.name
=== data
.preferred_node
);
96 PVE
.Utils
.forEachCorosyncLink(nodeinfo
, (num
, link
) => {
101 vm
.set('preferred_node', {
102 name
: data
.preferred_node
,
103 addr
: nodeinfo
.pve_addr
,
105 ring_addr
: ring_addr
,
110 onCreate: function() {
111 let view
= this.getView();
112 view
.store
.stopUpdate();
113 Ext
.create('PVE.ClusterCreateWindow', {
116 destroy: function() {
117 view
.store
.startUpdate();
123 onClusterInfo: function() {
124 let vm
= this.getViewModel();
125 Ext
.create('PVE.ClusterInfoWindow', {
128 ipAddress
: vm
.get('preferred_node.addr'),
129 fingerprint
: vm
.get('preferred_node.fp'),
130 peerLinks
: vm
.get('preferred_node.peerLinks'),
131 ring_addr
: vm
.get('preferred_node.ring_addr'),
132 totem
: vm
.get('totem'),
138 let view
= this.getView();
139 view
.store
.stopUpdate();
140 Ext
.create('PVE.ClusterJoinNodeWindow', {
143 destroy: function() {
144 view
.store
.startUpdate();
152 text
: gettext('Create Cluster'),
153 reference
: 'createButton',
156 disabled
: '{isInCluster}',
160 text
: gettext('Join Information'),
161 reference
: 'addButton',
162 handler
: 'onClusterInfo',
164 disabled
: '{!isInCluster}',
168 text
: gettext('Join Cluster'),
169 reference
: 'joinButton',
172 disabled
: '{isInCluster}',
180 xtype
: 'displayfield',
181 fieldLabel
: gettext('Cluster Name'),
183 value
: '{totem.cluster_name}',
184 hidden
: '{!isInCluster}',
189 xtype
: 'displayfield',
190 fieldLabel
: gettext('Config Version'),
192 value
: '{totem.config_version}',
193 hidden
: '{!isInCluster}',
198 xtype
: 'displayfield',
199 fieldLabel
: gettext('Number of Nodes'),
202 value
: '{nodecount}',
203 hidden
: '{!isInCluster}',
208 xtype
: 'displayfield',
209 value
: gettext('Standalone node - no cluster defined'),
211 hidden
: '{isInCluster}',
219 title
: gettext('Cluster Nodes'),
221 enableColumnHide
: false,
223 xclass
: 'Ext.app.ViewController',
225 init: function(view
) {
226 view
.rstore
= Ext
.create('Proxmox.data.UpdateStore', {
231 storeid
: 'pve-cluster-nodes',
232 model
: 'pve-cluster-nodes',
234 view
.setStore(Ext
.create('Proxmox.data.DiffStore', {
241 Proxmox
.Utils
.monStoreErrors(view
, view
.rstore
);
242 view
.rstore
.on('load', this.onLoad
, this);
243 view
.on('destroy', view
.rstore
.stopUpdate
);
246 onLoad: function(store
, records
, success
) {
247 let view
= this.getView();
248 let vm
= this.getViewModel();
250 if (!success
|| !records
|| !records
.length
) {
251 vm
.set('nodecount', 0);
254 vm
.set('nodecount', records
.length
);
256 // show/hide columns according to used links
257 let linkIndex
= view
.columns
.length
;
258 Ext
.each(view
.columns
, (col
, i
) => {
259 if (col
.linkNumber
!== undefined) {
261 // save offset at which link columns start, so we can address them directly below
268 PVE
.Utils
.forEachCorosyncLink(records
[0].data
,
273 view
.columns
[linkIndex
+ linknum
].setHidden(false);
281 header
: gettext('Nodename'),
286 header
: gettext('ID'),
294 header
: gettext('Votes'),
299 dataIndex
: 'quorum_votes',
302 header
: Ext
.String
.format(gettext('Link {0}'), 0),
303 dataIndex
: 'ring0_addr',
307 header
: Ext
.String
.format(gettext('Link {0}'), 1),
308 dataIndex
: 'ring1_addr',
312 header
: Ext
.String
.format(gettext('Link {0}'), 2),
313 dataIndex
: 'ring2_addr',
317 header
: Ext
.String
.format(gettext('Link {0}'), 3),
318 dataIndex
: 'ring3_addr',
322 header
: Ext
.String
.format(gettext('Link {0}'), 4),
323 dataIndex
: 'ring4_addr',
327 header
: Ext
.String
.format(gettext('Link {0}'), 5),
328 dataIndex
: 'ring5_addr',
332 header
: Ext
.String
.format(gettext('Link {0}'), 6),
333 dataIndex
: 'ring6_addr',
337 header
: Ext
.String
.format(gettext('Link {0}'), 7),
338 dataIndex
: 'ring7_addr',