as a unified helper for talking to a remote node. if the requested node
has an entry in the remote config, the information from that entry is
used.  else, the first locally defined node of the requested cluster is
used as proxy.

Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com>
---
 data/PVE/RemoteConfig.pm | 55 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/data/PVE/RemoteConfig.pm b/data/PVE/RemoteConfig.pm
index 23274de..7c395ba 100644
--- a/data/PVE/RemoteConfig.pm
+++ b/data/PVE/RemoteConfig.pm
@@ -3,6 +3,7 @@ package PVE::RemoteConfig;
 use strict;
 use warnings;
 
+use PVE::APIClient::LWP;
 use PVE::Cluster qw(cfs_register_file cfs_read_file cfs_write_file 
cfs_lock_file);
 use PVE::JSONSchema qw(get_standard_option);
 use PVE::Tools;
@@ -158,6 +159,60 @@ sub lock {
     }
 }
 
+# will attempt to connect with node's locally defined endpoint if possible
+sub get_remote_info {
+    my ($self, $cluster, $node, $network_cidr) = @_;
+
+    my $cluster_info = $self->{ids}->{$cluster};
+    die "Remote cluster '$cluster' is not defined!\n"
+       if !defined($cluster_info) || $cluster_info->{type} ne 'pvecluster';
+
+    my $host = $node;
+
+    # fallback to random node/endpoint if $node is not locally defined
+    if (!$cluster_info->{nodes}->{$node}) {
+       my @defined_nodes = keys %{$cluster_info->{nodes}};
+       $host = $defined_nodes[0];
+    }
+
+    my $api_node = $self->{ids}->{$host};
+
+    my $api_token = $cluster_info->{token} // $api_node->{token};
+
+    my $conn_args = {
+       username => 'root@pam',
+       protocol => 'https',
+       host => $api_node->{endpoint},
+       apitoken => $api_token,
+       port => 8006,
+    };
+
+    if (my $fp = $api_node->{fingerprint}) {
+       $conn_args->{cached_fingerprints} = { uc($fp) => 1 };
+    } else {
+       # FIXME add proper parameter to APIClient
+       die "IMPLEMENT ME";
+       my $ssl_opts = {
+           verify_hostname => 1,
+#          SSL_ca_path => '/etc/ssl/certs',
+           SSL_verify_callback => 1,
+       };
+    }
+
+    print "Establishing API connection with cluster '$cluster' node '$host'\n";
+
+    my $conn = PVE::APIClient::LWP->new(%$conn_args);
+
+
+    my $args = {};
+    $args->{cidr} = $network_cidr if $network_cidr;
+
+    print "Request IP information of node '$node'\n";
+    my $res = $conn->get("/nodes/$node/addr", $args);
+
+    return ($res, $conn_args);
+}
+
 package PVE::RemoteConfig::Cluster;
 
 use PVE::RemoteConfig;
-- 
2.20.1



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to