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' + } + ] + }] +}); -- 2.14.2 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel