From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 9F58993E00 for ; Tue, 20 Sep 2022 14:51:50 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id F25FF1C100 for ; Tue, 20 Sep 2022 14:51:06 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for ; Tue, 20 Sep 2022 14:51:00 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 22EE044476 for ; Tue, 20 Sep 2022 14:50:47 +0200 (CEST) From: Dominik Csapak To: pve-devel@lists.proxmox.com Date: Tue, 20 Sep 2022 14:50:30 +0200 Message-Id: <20220920125041.3636561-25-d.csapak@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220920125041.3636561-1-d.csapak@proxmox.com> References: <20220920125041.3636561-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.079 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% 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 URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [hardware.pm, backupinfo.pm, metricserver.pm, jobs.pm, defines.mk, cluster.pm, ceph.pm] Subject: [pve-devel] [PATCH manager v3 02/13] PVE/API2/Cluster: add Hardware mapping list api call 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: , X-List-Received-Date: Tue, 20 Sep 2022 12:51:50 -0000 this is a cluster wide api call that returns the list of mappings in a manner that is easy to consume by the ui (as a tree) it also automatically includes the validity of mappings on the node where it is called. for a consumer of this api call to get a complete picture, it is necessary to do an api call for each node Signed-off-by: Dominik Csapak --- PVE/API2/Cluster.pm | 8 +++ PVE/API2/Cluster/Hardware.pm | 117 +++++++++++++++++++++++++++++++++++ PVE/API2/Cluster/Makefile | 1 + 3 files changed, 126 insertions(+) create mode 100644 PVE/API2/Cluster/Hardware.pm diff --git a/PVE/API2/Cluster.pm b/PVE/API2/Cluster.pm index d6b405e2..85c4965d 100644 --- a/PVE/API2/Cluster.pm +++ b/PVE/API2/Cluster.pm @@ -25,6 +25,7 @@ use PVE::API2::ACMEPlugin; use PVE::API2::Backup; use PVE::API2::Cluster::BackupInfo; use PVE::API2::Cluster::Ceph; +use PVE::API2::Cluster::Hardware; use PVE::API2::Cluster::Jobs; use PVE::API2::Cluster::MetricServer; use PVE::API2::ClusterConfig; @@ -89,6 +90,12 @@ __PACKAGE__->register_method ({ subclass => "PVE::API2::Cluster::Jobs", path => 'jobs', }); + +__PACKAGE__->register_method ({ + subclass => "PVE::API2::Cluster::Hardware", + path => 'hardware', +}); + if ($have_sdn) { __PACKAGE__->register_method ({ subclass => "PVE::API2::Network::SDN", @@ -138,6 +145,7 @@ __PACKAGE__->register_method ({ { name => 'firewall' }, { name => 'ha' }, { name => 'jobs' }, + { name => 'hardware' }, { name => 'log' }, { name => 'metrics' }, { name => 'nextid' }, diff --git a/PVE/API2/Cluster/Hardware.pm b/PVE/API2/Cluster/Hardware.pm new file mode 100644 index 00000000..233d5efa --- /dev/null +++ b/PVE/API2/Cluster/Hardware.pm @@ -0,0 +1,117 @@ +package PVE::API2::Cluster::Hardware; + +use strict; +use warnings; + +use PVE::HardwareMap; +use PVE::RESTHandler; + +use base qw(PVE::RESTHandler); + +__PACKAGE__->register_method ({ + name => 'index', + path => '', + method => 'GET', + description => "Hardware index.", + permissions => { user => 'all' }, + parameters => { + additionalProperties => 0, + properties => {}, + }, + returns => { + type => 'array', + items => { + type => "object", + properties => {}, + }, + links => [ { rel => 'child', href => "{name}" } ], + }, + code => sub { + my ($param) = @_; + + my $result = [ + { name => 'mapping' }, + ]; + + return $result; + } +}); + +__PACKAGE__->register_method ({ + name => 'mapping_index', + path => 'mapping', + method => 'GET', + description => "List mapped hardware.", + permissions => { + description => "Only lists entries where you have 'Hardware.Audit', 'Hardware.Use', 'Hardware.Configure' permissions on '/hardware/'.", + user => 'all', + }, + parameters => { + additionalProperties => 0, + properties => { + node => { + type => 'string', + format => 'pve-node', + description => "Only show hardware mapped on this node.", + optional => 1, + } + }, + }, + returns => { + type => 'array', + items => { + type => "object", + }, + }, + code => sub { + my ($param) = @_; + + my $res = []; + my $cfg = PVE::HardwareMap::config(); + my $nodename = PVE::INotify::nodename(); + my $rpcenv = PVE::RPCEnvironment::get(); + my $authuser = $rpcenv->get_user(); + my $privs = ['Hardware.Audit', 'Hardware.Use', 'Hardware.Configure']; + + for my $type (keys %$cfg) { + next if $type eq 'digest'; + for my $id (keys $cfg->{$type}->%*) { + next if !$rpcenv->check_full($authuser, "/hardware/$id", $privs, 1, 1); + my $id_entry = { + text => $id, + ntype => 'entry', + type => $type, + children => [], + }; + for my $node (keys $cfg->{$type}->{$id}->%*) { + my $entry = { + text => $node, + node => $node, + entry => $id, + type => $type, + ntype => 'mapping', + }; + for my $p (keys $cfg->{$type}->{$id}->{$node}->%*) { + $entry->{$p} = $cfg->{$type}->{$id}->{$node}->{$p}; + } + if ($nodename eq $node) { + eval { + PVE::HardwareMap::assert_device_valid($type, $entry); + }; + if (my $err = $@) { + $entry->{valid} = 0; + $entry->{errmsg} = "$err"; + } else { + $entry->{valid} = 1; + } + } + push $id_entry->{children}->@*, $entry; + } + push @$res, $id_entry; + } + } + + return $res; + }}); + +1; diff --git a/PVE/API2/Cluster/Makefile b/PVE/API2/Cluster/Makefile index 8d306507..2d9e2dde 100644 --- a/PVE/API2/Cluster/Makefile +++ b/PVE/API2/Cluster/Makefile @@ -5,6 +5,7 @@ include ../../../defines.mk PERLSOURCE= \ BackupInfo.pm \ MetricServer.pm \ + Hardware.pm \ Jobs.pm \ Ceph.pm -- 2.30.2