The "Join successful, possible new node SSL certificate, tell user and try to reload" semantic to work nicely the not yet reviewed "API/Cluster: autoflush STDOUT for join and create" series is needed, just FYI.
On 3/27/18 3:45 PM, Thomas Lamprecht wrote: > Signed-off-by: Thomas Lamprecht <t.lampre...@proxmox.com> > --- > www/manager6/dc/Cluster.js | 21 +++++ > www/manager6/dc/ClusterEdit.js | 190 > +++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 211 insertions(+) > > diff --git a/www/manager6/dc/Cluster.js b/www/manager6/dc/Cluster.js > index ca43c8f9..11e24c66 100644 > --- a/www/manager6/dc/Cluster.js > +++ b/www/manager6/dc/Cluster.js > @@ -113,6 +113,19 @@ Ext.define('PVE.ClusterAdministration', { > } > }); > win.show(); > + }, > + > + onJoin: function() { > + var view = this.getView(); > + view.store.stopUpdate(); > + var win = Ext.create('PVE.ClusterJoinNodeWindow', { > + autoShow: true, > + listeners: { > + destroy: function() { > + view.store.startUpdate(); > + } > + } > + }); > } > }, > tbar: [ > @@ -131,6 +144,14 @@ Ext.define('PVE.ClusterAdministration', { > bind: { > disabled: '{!isInCluster}' > } > + }, > + { > + text: gettext('Join Cluster'), > + reference: 'joinButton', > + handler: 'onJoin', > + bind: { > + disabled: '{isInCluster}' > + } > } > ], > layout: 'hbox', > diff --git a/www/manager6/dc/ClusterEdit.js b/www/manager6/dc/ClusterEdit.js > index 249801c3..25ca6607 100644 > --- a/www/manager6/dc/ClusterEdit.js > +++ b/www/manager6/dc/ClusterEdit.js > @@ -105,3 +105,193 @@ Ext.define('PVE.ClusterInfoWindow', { > }] > }] > }); > + > +Ext.define('PVE.ClusterJoinNodeWindow', { > + extend: 'Proxmox.window.Edit', > + xtype: 'pveClusterJoinNodeWindow', > + > + title: gettext('Cluster Join'), > + width: 800, > + > + method: 'POST', > + url: '/cluster/config/join', > + > + defaultFocus: 'textarea[name=serializedinfo]', > + isCreate: true, > + submitText: gettext('Join'), > + showTaskViewer: true, > + > + onlineHelp: 'chapter_pvecm', > + > + viewModel: { > + parent: null, > + data: { > + info: { > + fp: '', > + ip: '', > + ring1Possible: false, > + ring1Needed: false > + } > + } > + }, > + > + controller: { > + xclass: 'Ext.app.ViewController', > + control: { > + 'proxmoxcheckbox[name=assistedInput]': { > + change: 'onInputTypeChange' > + }, > + 'textarea[name=serializedinfo]': { > + change: 'recomputeSerializedInfo', > + enable: 'resetField' > + }, > + 'proxmoxtextfield[name=ring1_addr]': { > + enable: 'ring1Needed' > + }, > + 'textfield': { > + disable: 'resetField' > + } > + }, > + resetField: function(field) { > + field.reset(); > + }, > + ring1Needed: function(f) { > + var vm = this.getViewModel(); > + f.allowBlank = !vm.get('info.ring1Needed'); > + }, > + onInputTypeChange: function(field, assistedInput) { > + var vm = this.getViewModel(); > + if (!assistedInput) { > + vm.set('info.ring1Possible', true); > + } > + }, > + recomputeSerializedInfo: function(field, value) { > + var vm = this.getViewModel(); > + var jsons = Ext.util.Base64.decode(value); > + var joinInfo = Ext.JSON.decode(jsons, true); > + > + var info = { > + fp: '', > + ring1Needed: false, > + ring1Possible: false, > + ip: '' > + }; > + > + var totem = {}; > + if (!(joinInfo && joinInfo.totem)) { > + field.valid = false; > + } else { > + info = { > + ip: joinInfo.ipAddress, > + fp: joinInfo.fingerprint, > + ring1Possible: !!joinInfo.totem['interface']['1'], > + ring1Needed: !!joinInfo.totem['interface']['1'] > + }; > + totem = joinInfo.totem; > + field.valid = true; > + } > + > + vm.set('info', info); > + } > + }, > + > + taskDone: function(success) { > + if (success) { > + var txt = gettext('Cluster join task finished, node certificate may > have changed, reload GUI!'); > + // ensure user cannot do harm > + Ext.getBody().mask(txt, ['pve-static-mask']); > + // TaskView may hide above mask, so tell him directly > + Ext.Msg.show({ > + title: gettext('Join Task Finished'), > + icon: Ext.Msg.INFO, > + msg: txt > + }); > + // reload always (if user wasn't faster), but wait a bit for > pveproxy > + Ext.defer(function() { > + window.location.reload(true); > + }, 5000); > + } > + }, > + > + items: [{ > + xtype: 'proxmoxcheckbox', > + reference: 'assistedEntry', > + submitValue: false, > + value: true, > + autoEl: { > + tag: 'div', > + 'data-qtip': gettext('Select if join information should be > extracted from pasted cluster information, deselect for manual entering') > + }, > + boxLabel: gettext('Assisted join: Paste encoded cluster join > information and enter password.') > + }, > + { > + xtype: 'textarea', > + name: 'serializedinfo', > + submitValue: false, > + allowBlank: false, > + fieldLabel: gettext('Information'), > + emptyText: gettext('Paste encoded Cluster Information here'), > + validator: function(val) { > + return val === '' || this.valid || > + gettext('Does not seem like a valid encoded Cluster > Information!'); > + }, > + bind: { > + disabled: '{!assistedEntry.checked}', > + hidden: '{!assistedEntry.checked}' > + }, > + value: '' > + }, > + { > + xtype: 'inputpanel', > + column1: [ > + { > + xtype: 'textfield', > + fieldLabel: gettext('Peer Address'), > + allowBlank: false, > + bind: { > + value: '{info.ip}', > + readOnly: '{assistedEntry.checked}' > + }, > + name: 'hostname' > + }, > + { > + xtype: 'textfield', > + inputType: 'password', > + emptyText: gettext("Peer's root password"), > + fieldLabel: gettext('Password'), > + allowBlank: false, > + name: 'password' > + } > + ], > + column2: [ > + { > + xtype: 'proxmoxtextfield', > + fieldLabel: gettext('Corosync Ring 0'), > + emptyText: gettext("Default: IP resolved by node's hostname"), > + skipEmptyText: true, > + name: 'ring0_addr' > + }, > + { > + xtype: 'proxmoxtextfield', > + fieldLabel: gettext('Corosync Ring 1'), > + skipEmptyText: true, > + bind: { > + disabled: '{!info.ring1Possible}' > + }, > + name: 'ring1_addr' > + } > + ], > + columnB: [ > + { > + xtype: 'textfield', > + fieldLabel: gettext('Fingerprint'), > + allowBlank: false, > + bind: { > + value: '{info.fp}', > + readOnly: '{assistedEntry.checked}' > + }, > + name: 'fingerprint' > + } > + ] > + }] > +}); > _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel