gui/cluster: add structured peerLinks to join info

Instead of the old 'ring_addr' property (which is kept for
compatibility), we also encode the link numbers into the new peerLinks
structure. This allows us to display which IP is assigned to which link
on the cluster in the join dialog, helping a user identify which link
should receive which interface on the new node.

Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
This commit is contained in:
Stefan Reiter 2020-03-23 13:41:14 +01:00 committed by Thomas Lamprecht
parent 5957f47f72
commit b1e7a7d3b7
3 changed files with 32 additions and 8 deletions

View File

@ -85,14 +85,18 @@ Ext.define('PVE.ClusterAdministration', {
return el.name === data.preferred_node; return el.name === data.preferred_node;
}); });
var links = []; let links = {};
PVE.Utils.forEachCorosyncLink(nodeinfo, let ring_addr = [];
(num, link) => links.push(link)); PVE.Utils.forEachCorosyncLink(nodeinfo, (num, link) => {
links[num] = link;
ring_addr.push(link);
});
vm.set('preferred_node', { vm.set('preferred_node', {
name: data.preferred_node, name: data.preferred_node,
addr: nodeinfo.pve_addr, addr: nodeinfo.pve_addr,
ring_addr: links, peerLinks: links,
ring_addr: ring_addr,
fp: nodeinfo.pve_fp fp: nodeinfo.pve_fp
}); });
}, },
@ -116,6 +120,7 @@ Ext.define('PVE.ClusterAdministration', {
joinInfo: { joinInfo: {
ipAddress: vm.get('preferred_node.addr'), ipAddress: vm.get('preferred_node.addr'),
fingerprint: vm.get('preferred_node.fp'), fingerprint: vm.get('preferred_node.fp'),
peerLinks: vm.get('preferred_node.peerLinks'),
ring_addr: vm.get('preferred_node.ring_addr'), ring_addr: vm.get('preferred_node.ring_addr'),
totem: vm.get('totem') totem: vm.get('totem')
} }

View File

@ -223,10 +223,15 @@ Ext.define('PVE.ClusterJoinNodeWindow', {
} else { } else {
let interfaces = joinInfo.totem.interface; let interfaces = joinInfo.totem.interface;
let links = Object.values(interfaces).map(iface => { let links = Object.values(interfaces).map(iface => {
let linkNumber = iface.linknumber;
let peerLink;
if (joinInfo.peerLinks) {
peerLink = joinInfo.peerLinks[linkNumber];
}
return { return {
number: iface.linknumber, number: linkNumber,
value: '', value: '',
text: '', text: peerLink ? Ext.String.format(gettext("peer's link address: {0}"), peerLink) : '',
allowBlank: false allowBlank: false
}; };
}); });

View File

@ -14,7 +14,7 @@ Ext.define('PVE.form.CorosyncLinkEditorController', {
this.addLink(); this.addLink();
}, },
addLink: function(number, value, allowBlank) { addLink: function(number, value, allowBlank, text) {
let me = this; let me = this;
let view = me.getView(); let view = me.getView();
let vm = view.getViewModel(); let vm = view.getViewModel();
@ -37,6 +37,7 @@ Ext.define('PVE.form.CorosyncLinkEditorController', {
allowBlankNetwork: allowBlank, allowBlankNetwork: allowBlank,
initNumber: number, initNumber: number,
initNetwork: value, initNetwork: value,
text: text,
// needs to be set here, because we need to update the viewmodel // needs to be set here, because we need to update the viewmodel
removeBtnHandler: function() { removeBtnHandler: function() {
@ -130,6 +131,7 @@ Ext.define('PVE.form.CorosyncLinkSelector', {
// values // values
initNumber: 0, initNumber: 0,
initNetwork: '', initNetwork: '',
text: '',
layout: 'hbox', layout: 'hbox',
bodyPadding: 5, bodyPadding: 5,
@ -190,6 +192,17 @@ Ext.define('PVE.form.CorosyncLinkSelector', {
parent.removeBtnHandler(); parent.removeBtnHandler();
} }
} }
},
{
xtype: 'label',
margin: '-1px 0 0 5px',
// for muted effect
cls: 'x-form-item-label-default',
cbind: {
text: '{text}'
}
} }
], ],
@ -327,7 +340,8 @@ Ext.define('PVE.form.CorosyncLinkEditor', {
vm.set('linkCount', 0); vm.set('linkCount', 0);
Ext.Array.each(links, link => { Ext.Array.each(links, link => {
controller.addLink(link['number'], link['value'], link['allowBlank']); controller.addLink(link['number'], link['value'],
link['allowBlank'], link['text']);
}); });
}, },