From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 553201FF173 for ; Mon, 13 Jan 2025 16:46:43 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 1E31D4F70; Mon, 13 Jan 2025 16:46:27 +0100 (CET) From: Dominik Csapak To: pdm-devel@lists.proxmox.com Date: Mon, 13 Jan 2025 16:45:46 +0100 Message-Id: <20250113154550.3462139-8-d.csapak@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250113154550.3462139-1-d.csapak@proxmox.com> References: <20250113154550.3462139-1-d.csapak@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.016 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: [pdm-devel] [PATCH datacenter-manager 5/9] server: api: pve: add remote cluster-status api call X-BeenThere: pdm-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Datacenter Manager development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pdm-devel-bounces@lists.proxmox.com Sender: "pdm-devel" so we can query the cluster status. Currently very useful to determine the nodename of a target endpoint, since the cluster status contains that information. For this reason we also include an explicit target_endpoint parameter. Signed-off-by: Dominik Csapak --- server/src/api/pve/mod.rs | 41 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/server/src/api/pve/mod.rs b/server/src/api/pve/mod.rs index 48e16b2..2cefbb4 100644 --- a/server/src/api/pve/mod.rs +++ b/server/src/api/pve/mod.rs @@ -21,7 +21,9 @@ use pdm_api_types::{ }; use pve_api_types::client::PveClient; -use pve_api_types::{ClusterResourceKind, ClusterResourceType, ListRealm, PveUpid}; +use pve_api_types::{ + ClusterNodeStatus, ClusterResourceKind, ClusterResourceType, ListRealm, PveUpid, +}; use super::resources::{map_pve_lxc, map_pve_node, map_pve_qemu, map_pve_storage}; @@ -59,6 +61,7 @@ const REMOTE_SUBDIRS: SubdirMap = &sorted!([ ("nodes", &NODES_ROUTER), ("qemu", &qemu::ROUTER), ("resources", &RESOURCES_ROUTER), + ("cluster-status", &STATUS_ROUTER), ("tasks", &tasks::ROUTER), ]); @@ -68,6 +71,8 @@ const NODES_ROUTER: Router = Router::new() const RESOURCES_ROUTER: Router = Router::new().get(&API_METHOD_CLUSTER_RESOURCES); +const STATUS_ROUTER: Router = Router::new().get(&API_METHOD_CLUSTER_STATUS); + // converts a remote + PveUpid into a RemoteUpid and starts tracking it fn new_remote_upid(remote: String, upid: PveUpid) -> Result { let remote_upid: RemoteUpid = (remote, upid.to_string()).try_into()?; @@ -175,6 +180,40 @@ pub async fn cluster_resources( Ok(cluster_resources.collect()) } +#[api( + input: { + properties: { + remote: { schema: REMOTE_ID_SCHEMA }, + "target-endpoint": { + type: String, + optional: true, + description: "The target endpoint to use for the connection.", + }, + }, + }, + returns: { + type: Array, + description: "Get all nodes Cluster Status", + items: { type: ClusterNodeStatus }, + }, + access: { + permission: &Permission::Privilege(&["resource", "{remote}"], PRIV_RESOURCE_AUDIT, false), + }, +)] +/// Query the cluster nodes status. +// FIXME: Use more fine grained permissions and filter on: +// - `/resource/{remote-id}/{resource-type=node}/{resource-id}` +pub async fn cluster_status( + remote: String, + target_endpoint: Option, +) -> Result, Error> { + let (remotes, _) = pdm_config::remotes::config()?; + let remote = get_remote(&remotes, &remote)?; + let client = connection::make_pve_client_with_endpoint(remote, target_endpoint.as_deref())?; + let status = client.cluster_status().await?; + Ok(status) +} + fn map_pve_resource(remote: &str, resource: pve_api_types::ClusterResource) -> Option { match resource.ty { ClusterResourceType::Node => map_pve_node(remote, resource).map(PveResource::Node), -- 2.39.5 _______________________________________________ pdm-devel mailing list pdm-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel