From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id E735F1FF168 for ; Tue, 10 Dec 2024 16:12:02 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id CA61C328C0; Tue, 10 Dec 2024 16:12:07 +0100 (CET) From: Gabriel Goller To: pve-devel@lists.proxmox.com Date: Tue, 10 Dec 2024 16:11:29 +0100 Message-Id: <20241210151130.321984-3-g.goller@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20241210151130.321984-1-g.goller@proxmox.com> References: <20241210151130.321984-1-g.goller@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.034 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH manager v2 2/3] guest: refactor and reuse AgentIPView for containers X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" Refactor AgentIPView to be generic over container and vms. Reuse it in the Container Summary to show the ip addresses of the container. Signed-off-by: Gabriel Goller --- www/manager6/Makefile | 2 +- www/manager6/panel/GuestStatusView.js | 139 +++++++++++++++++- www/manager6/panel/GuestSummary.js | 2 +- .../{qemu/AgentIPView.js => panel/IPView.js} | 78 ++-------- 4 files changed, 153 insertions(+), 68 deletions(-) rename www/manager6/{qemu/AgentIPView.js => panel/IPView.js} (59%) diff --git a/www/manager6/Makefile b/www/manager6/Makefile index c94a5cdfbf70..aa10eb420c5b 100644 --- a/www/manager6/Makefile +++ b/www/manager6/Makefile @@ -102,6 +102,7 @@ JSSRC= \ panel/BackupJobPrune.js \ panel/HealthWidget.js \ panel/IPSet.js \ + panel/IPView.js \ panel/RunningChart.js \ panel/StatusPanel.js \ panel/GuestStatusView.js \ @@ -231,7 +232,6 @@ JSSRC= \ pool/Config.js \ pool/StatusView.js \ pool/Summary.js \ - qemu/AgentIPView.js \ qemu/AudioEdit.js \ qemu/BootOrderEdit.js \ qemu/CDEdit.js \ diff --git a/www/manager6/panel/GuestStatusView.js b/www/manager6/panel/GuestStatusView.js index 6401811c73bb..c9fb7badc4f1 100644 --- a/www/manager6/panel/GuestStatusView.js +++ b/www/manager6/panel/GuestStatusView.js @@ -146,14 +146,149 @@ Ext.define('PVE.panel.GuestStatusView', { height: 15, }, { - itemId: 'ips', - xtype: 'pveAgentIPView', + itemId: 'agentIPs', + xtype: 'pveIPView', cbind: { rstore: '{rstore}', pveSelNode: '{pveSelNode}', hidden: '{isLxc}', disabled: '{isLxc}', }, + createUpdateStoreCallback: function(ipview, nodename, vmid) { + ipview.ipStore = Ext.create('Proxmox.data.UpdateStore', { + interval: 10000, + storeid: 'pve-qemu-agent-' + vmid, + method: 'POST', + proxy: { + type: 'proxmox', + url: '/api2/json/nodes/' + nodename + '/qemu/' + vmid + '/agent/network-get-interfaces', + }, + }); + ipview.callParent(); + + ipview.mon(ipview.ipStore, 'load', function(_store, records, success) { + if (records && records.length) { + ipview.nics = records[0].data.result; + } else { + ipview.nics = undefined; + } + ipview.updateStatus(!success); + }); + }, + updateStatusCallback: function(ipview, unsuccessful, defaulttext) { + var text = defaulttext || gettext('No network information'); + var more = false; + if (unsuccessful) { + text = gettext('Guest Agent not running'); + } else if (ipview.agent && ipview.running) { + if (Ext.isArray(ipview.nics) && ipview.nics.length) { + more = true; + var ips = ipview.getDefaultIps(ipview.nics); + if (ips.length !== 0) { + text = ips.join('
'); + } + } else if (ipview.nics && ipview.nics.error) { + text = Ext.String.format(text, ipview.nics.error.desc); + } + } else if (ipview.agent) { + text = gettext('Guest Agent not running'); + } else { + text = gettext('No Guest Agent configured'); + } + + var ipBox = ipview.down('#ipBox'); + ipBox.update(text); + + var moreBtn = ipview.down('#moreBtn'); + moreBtn.setVisible(more); + }, + startIPStoreCallback: function(ipview, store) { + let agentRec = store.getById('agent'); + let state = store.getById('status'); + + ipview.agent = agentRec && agentRec.data.value === 1; + ipview.running = state && state.data.value === 'running'; + + var caps = Ext.state.Manager.get('GuiCap'); + + if (!caps.vms['VM.Monitor']) { + var errorText = gettext("Requires '{0}' Privileges"); + ipview.updateStatus(false, Ext.String.format(errorText, 'VM.Monitor')); + return; + } + + if (ipview.agent && ipview.running && ipview.ipStore.isStopped) { + ipview.ipStore.startUpdate(); + } else if (ipview.ipStore.isStopped) { + ipview.updateStatus(); + } + }, + }, + { + itemId: 'ctIPS', + xtype: 'pveIPView', + cbind: { + rstore: '{rstore}', + pveSelNode: '{pveSelNode}', + hidden: '{!isLxc}', + disabled: '{!isLxc}', + }, + createUpdateStoreCallback: function(ipview, nodename, vmid) { + ipview.ipStore = Ext.create('Proxmox.data.UpdateStore', { + interval: 10000, + storeid: 'lxc-interfaces-' + vmid, + method: 'GET', + proxy: { + type: 'proxmox', + url: '/api2/json/nodes/' + nodename + '/lxc/' + vmid + '/interfaces', + }, + }); + ipview.callParent(); + + ipview.mon(ipview.ipStore, 'load', function(_store, records, success) { + if (records && records.length) { + ipview.nics = records.map(r => r.data); + } else { + ipview.nics = undefined; + } + ipview.updateStatus(!success); + }); + }, + updateStatusCallback: function(ipview, _unsuccessful, defaulttext) { + var text = defaulttext || gettext('No network information'); + var more = false; + if (Ext.isArray(ipview.nics) && ipview.nics.length) { + more = true; + var ips = ipview.getDefaultIps(ipview.nics); + if (ips.length !== 0) { + text = ips.join('
'); + } + } + var ipBox = ipview.down('#ipBox'); + ipBox.update(text); + + var moreBtn = ipview.down('#moreBtn'); + moreBtn.setVisible(more); + }, + startIPStoreCallback: function(ipview, store) { + let state = store.getById('status'); + + ipview.running = state && state.data.value === 'running'; + + var caps = Ext.state.Manager.get('GuiCap'); + + if (!caps.vms['VM.Audit']) { + var errorText = gettext("Requires '{0}' Privileges"); + ipview.updateStatus(false, Ext.String.format(errorText, 'VM.Audit')); + return; + } + + if (ipview.running && ipview.ipStore.isStopped) { + ipview.ipStore.startUpdate(); + } else if (ipview.ipStore.isStopped) { + ipview.updateStatus(); + } + }, }, ], diff --git a/www/manager6/panel/GuestSummary.js b/www/manager6/panel/GuestSummary.js index 1565db3f658d..2186967f62da 100644 --- a/www/manager6/panel/GuestSummary.js +++ b/www/manager6/panel/GuestSummary.js @@ -54,7 +54,7 @@ Ext.define('PVE.guest.Summary', { items = [ { xtype: 'container', - height: 300, + height: 370, layout: { type: 'hbox', align: 'stretch', diff --git a/www/manager6/qemu/AgentIPView.js b/www/manager6/panel/IPView.js similarity index 59% rename from www/manager6/qemu/AgentIPView.js rename to www/manager6/panel/IPView.js index 829e55960b23..ba58b372a0e4 100644 --- a/www/manager6/qemu/AgentIPView.js +++ b/www/manager6/panel/IPView.js @@ -1,7 +1,7 @@ Ext.define('PVE.window.IPInfo', { extend: 'Ext.window.Window', width: 600, - title: gettext('Guest Agent Network Information'), + title: gettext('Network Information'), height: 300, layout: { type: 'fit', @@ -51,9 +51,9 @@ Ext.define('PVE.window.IPInfo', { ], }); -Ext.define('PVE.qemu.AgentIPView', { +Ext.define('PVE.IPView', { extend: 'Ext.container.Container', - xtype: 'pveAgentIPView', + xtype: 'pveIPView', layout: { type: 'hbox', @@ -61,6 +61,9 @@ Ext.define('PVE.qemu.AgentIPView', { }, nics: [], + startIPStoreCallback: undefined, + updateStatusCallback: undefined, + createUpdateStoreCallback: undefined, items: [ { @@ -90,7 +93,7 @@ Ext.define('PVE.qemu.AgentIPView', { hidden: true, ui: 'default-toolbar', handler: function(btn) { - let view = this.up('pveAgentIPView'); + let view = this.up('pveIPView'); var win = Ext.create('PVE.window.IPInfo'); win.down('grid').getStore().setData(view.nics); @@ -125,53 +128,19 @@ Ext.define('PVE.qemu.AgentIPView', { startIPStore: function(store, records, success) { var me = this; - let agentRec = store.getById('agent'); - let state = store.getById('status'); - me.agent = agentRec && agentRec.data.value === 1; - me.running = state && state.data.value === 'running'; - - var caps = Ext.state.Manager.get('GuiCap'); - - if (!caps.vms['VM.Monitor']) { - var errorText = gettext("Requires '{0}' Privileges"); - me.updateStatus(false, Ext.String.format(errorText, 'VM.Monitor')); - return; - } - - if (me.agent && me.running && me.ipStore.isStopped) { - me.ipStore.startUpdate(); - } else if (me.ipStore.isStopped) { - me.updateStatus(); - } + me.startIPStoreCallback(me, store); }, updateStatus: function(unsuccessful, defaulttext) { var me = this; - var text = defaulttext || gettext('No network information'); - var more = false; - if (unsuccessful) { - text = gettext('Guest Agent not running'); - } else if (me.agent && me.running) { - if (Ext.isArray(me.nics) && me.nics.length) { - more = true; - var ips = me.getDefaultIps(me.nics); - if (ips.length !== 0) { - text = ips.join('
'); - } - } else if (me.nics && me.nics.error) { - text = Ext.String.format(text, me.nics.error.desc); - } - } else if (me.agent) { - text = gettext('Guest Agent not running'); - } else { - text = gettext('No Guest Agent configured'); - } - var ipBox = me.down('#ipBox'); + me.updateStatusCallback(me, unsuccessful, defaulttext); + + var ipBox = ipview.down('#ipBox'); ipBox.update(text); - var moreBtn = me.down('#moreBtn'); + var moreBtn = ipview.down('#moreBtn'); moreBtn.setVisible(more); }, @@ -189,26 +158,7 @@ Ext.define('PVE.qemu.AgentIPView', { var nodename = me.pveSelNode.data.node; var vmid = me.pveSelNode.data.vmid; - me.ipStore = Ext.create('Proxmox.data.UpdateStore', { - interval: 10000, - storeid: 'pve-qemu-agent-' + vmid, - method: 'POST', - proxy: { - type: 'proxmox', - url: '/api2/json/nodes/' + nodename + '/qemu/' + vmid + '/agent/network-get-interfaces', - }, - }); - - me.callParent(); - - me.mon(me.ipStore, 'load', function(store, records, success) { - if (records && records.length) { - me.nics = records[0].data.result; - } else { - me.nics = undefined; - } - me.updateStatus(!success); - }); + me.createUpdateStoreCallback(me, nodename, vmid); me.on('destroy', me.ipStore.stopUpdate, me.ipStore); @@ -217,7 +167,7 @@ Ext.define('PVE.qemu.AgentIPView', { me.startIPStore(me.rstore, me.rstore.getData(), false); } - // check if the guest agent is there on every statusstore load me.mon(me.rstore, 'load', me.startIPStore, me); }, }); + -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel