From: "Fabian Grünbichler" <f.gruenbichler@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH cluster 1/4] remote.cfg: add new config file
Date: Tue, 13 Apr 2021 14:16:25 +0200 [thread overview]
Message-ID: <20210413121640.3602975-8-f.gruenbichler@proxmox.com> (raw)
In-Reply-To: <20210413121640.3602975-1-f.gruenbichler@proxmox.com>
with two section/entry types:
pve-cluster, referencing at least one node + an API token
pve-node, containing the connection information (address + optional
fingerprint)
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
---
data/PVE/Makefile | 2 +-
data/src/status.c | 1 +
data/PVE/Cluster.pm | 1 +
data/PVE/RemoteConfig.pm | 226 +++++++++++++++++++++++++++++
debian/libpve-cluster-perl.install | 1 +
5 files changed, 230 insertions(+), 1 deletion(-)
create mode 100644 data/PVE/RemoteConfig.pm
diff --git a/data/PVE/Makefile b/data/PVE/Makefile
index c8e0d2d..3c28597 100644
--- a/data/PVE/Makefile
+++ b/data/PVE/Makefile
@@ -11,7 +11,7 @@ PVE_VENDORARCH=${DESTDIR}/${PERL_VENDORARCH}/auto/PVE/IPCC
PERL_DOC_INC_DIRS:=..
SUBDIRS=Cluster CLI API2
-SOURCES=IPCC.pm Cluster.pm Corosync.pm RRD.pm DataCenterConfig.pm SSHInfo.pm
+SOURCES=IPCC.pm Cluster.pm Corosync.pm RRD.pm DataCenterConfig.pm SSHInfo.pm RemoteConfig.pm
all:
diff --git a/data/src/status.c b/data/src/status.c
index 8e93221..40782d5 100644
--- a/data/src/status.c
+++ b/data/src/status.c
@@ -101,6 +101,7 @@ static memdb_change_t memdb_change_array[] = {
{ .path = "sdn/controllers.cfg" },
{ .path = "sdn/.version" },
{ .path = "virtual-guest/cpu-models.conf" },
+ { .path = "remote.cfg" },
};
static GMutex mutex;
diff --git a/data/PVE/Cluster.pm b/data/PVE/Cluster.pm
index 210ea85..0f636af 100644
--- a/data/PVE/Cluster.pm
+++ b/data/PVE/Cluster.pm
@@ -71,6 +71,7 @@ my $observed = {
'sdn/controllers.cfg' => 1,
'sdn/.version' => 1,
'virtual-guest/cpu-models.conf' => 1,
+ 'remote.cfg' => 1,
};
sub prepare_observed_file_basedirs {
diff --git a/data/PVE/RemoteConfig.pm b/data/PVE/RemoteConfig.pm
new file mode 100644
index 0000000..23274de
--- /dev/null
+++ b/data/PVE/RemoteConfig.pm
@@ -0,0 +1,226 @@
+package PVE::RemoteConfig;
+
+use strict;
+use warnings;
+
+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;
+
+use PVE::SectionConfig;
+
+use base qw(PVE::SectionConfig);
+
+my $remote_cfg_filename = 'remote.cfg';
+
+cfs_register_file($remote_cfg_filename,
+ sub { __PACKAGE__->parse_config(@_); },
+ sub { __PACKAGE__->write_config(@_); });
+
+my $defaultData = {
+ propertyList => {
+ type => { description => "Remote type." },
+ id => get_standard_option('pve-node', {
+ description => "Remote identifier.",
+ }),
+ comment => {
+ description => "Description.",
+ type => 'string',
+ optional => 1,
+ maxLength => 4096,
+ },
+ },
+};
+
+sub private {
+ return $defaultData;
+}
+
+sub parse_section_header {
+ my ($class, $line) = @_;
+
+ if ($line =~ m/^(\S+):\s*(\S+)\s*$/) {
+ my ($type, $id) = (lc($1), lc($2));
+ my $errmsg = undef; # set if you want to skip whole section
+ eval { PVE::JSONSchema::pve_verify_node_name($id); };
+ $errmsg = $@ if $@;
+ my $config = {};
+ return ($type, $id, $errmsg, $config);
+ }
+ return undef;
+}
+
+sub decode_value {
+ my ($class, $type, $key, $value) = @_;
+
+ my $def = $defaultData->{plugindata}->{$type};
+
+ if ($key eq 'nodes') {
+ my $res = {};
+
+ foreach my $node (PVE::Tools::split_list($value)) {
+ if (PVE::JSONSchema::pve_verify_node_name($node)) {
+ $res->{$node} = 1;
+ }
+ }
+
+ return $res;
+ }
+
+ return $value;
+}
+
+sub encode_value {
+ my ($class, $type, $key, $value) = @_;
+
+ if ($key eq 'nodes') {
+ return join(',', keys(%$value));
+ }
+
+ return $value;
+}
+
+sub parse_config {
+ my ($class, $filename, $raw) = @_;
+
+ my $cfg = $class->SUPER::parse_config($filename, $raw);
+
+ foreach my $id (sort keys %{$cfg->{ids}}) {
+ my $data = $cfg->{ids}->{$id};
+
+ if ($data->{type} eq 'cluster') {
+ my $nodes = $data->{nodes};
+ foreach my $node (keys %$nodes) {
+ my $node_data = $cfg->{ids}->{$node};
+ if (!defined($node_data)) {
+ warn "Ignoring undefined remote node '$node' in remote cluster '$id'!\n";
+ delete $nodes->{$node};
+ }
+ }
+ }
+
+ $data->{comment} = PVE::Tools::decode_text($data->{comment})
+ if defined($data->{comment});
+ }
+
+ return $cfg;
+}
+
+sub write_config {
+ my ($class, $filename, $cfg) = @_;
+
+ my $target_hash = {};
+
+ foreach my $id (keys %{$cfg->{ids}}) {
+ my $data = $cfg->{ids}->{$id};
+
+ if ($data->{type} eq 'cluster') {
+ my $nodes = $data->{nodes};
+ foreach my $node (keys %$nodes) {
+ my $node_data = $cfg->{ids}->{$node};
+ if (!defined($node_data)) {
+ warn "Ignoring undefined remote node '$node' in remote cluster '$id'!\n";
+ delete $nodes->{$node};
+ }
+ }
+ }
+
+ $data->{comment} = PVE::Tools::encode_text($data->{comment})
+ if defined($data->{comment});
+ }
+
+ return $class->SUPER::write_config($filename, $cfg);
+}
+
+sub new {
+ my ($type) = @_;
+
+ my $class = ref($type) || $type;
+
+ my $cfg = cfs_read_file($remote_cfg_filename);
+
+ return bless $cfg, $class;
+}
+
+sub write {
+ my ($cfg) = @_;
+
+ cfs_write_file($remote_cfg_filename, $cfg);
+}
+
+sub lock {
+ my ($code, $errmsg) = @_;
+
+ cfs_lock_file($remote_cfg_filename, undef, $code);
+ my $err = $@;
+ if ($err) {
+ $errmsg ? die "$errmsg: $err" : die $err;
+ }
+}
+
+package PVE::RemoteConfig::Cluster;
+
+use PVE::RemoteConfig;
+use base qw(PVE::RemoteConfig);
+
+sub type {
+ return 'pvecluster';
+}
+
+sub properties {
+ return {
+ nodes => {
+ description => "Cluster nodes.",
+ type => 'string', format => 'pve-node-list',
+ },
+ token => {
+ description => "PVE API Token",
+ type => 'string',
+ },
+ };
+}
+
+sub options {
+ return {
+ nodes => { optional => 0 },
+ comment => { optional => 1 },
+ token => { optional => 1 },
+ };
+}
+
+package PVE::RemoteConfig::Node;
+
+use PVE::JSONSchema qw(get_standard_option);
+
+use PVE::RemoteConfig;
+use base qw(PVE::RemoteConfig);
+
+sub type {
+ return 'pvenode';
+}
+
+sub properties {
+ return {
+ endpoint => {
+ description => "Remote IP/FQDN.",
+ type => 'string',
+ },
+ fingerprint => get_standard_option('fingerprint-sha256'),
+ };
+}
+
+sub options {
+ return {
+ endpoint => { optional => 0 },
+ fingerprint => { optional => 1 },
+ token => { optional => 1 },
+ comment => { optional => 1 },
+ };
+}
+
+
+PVE::RemoteConfig::Cluster->register();
+PVE::RemoteConfig::Node->register();
+PVE::RemoteConfig->init();
+
+1;
diff --git a/debian/libpve-cluster-perl.install b/debian/libpve-cluster-perl.install
index 51223f9..0610384 100644
--- a/debian/libpve-cluster-perl.install
+++ b/debian/libpve-cluster-perl.install
@@ -1,5 +1,6 @@
usr/share/man/man5/datacenter.cfg.5
usr/share/perl5/PVE/Corosync.pm
usr/share/perl5/PVE/DataCenterConfig.pm
+usr/share/perl5/PVE/RemoteConfig.pm
usr/share/perl5/PVE/RRD.pm
usr/share/perl5/PVE/SSHInfo.pm
--
2.20.1
next prev parent reply other threads:[~2021-04-13 12:17 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-13 12:16 [pve-devel] [RFC qemu-server++ 0/22] remote migration Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH proxmox 1/2] websocket: make field public Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH proxmox 2/2] websocket: adapt for client connection Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH proxmox-websocket-tunnel 1/2] initial commit Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH proxmox-websocket-tunnel 2/2] add tunnel implementation Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH access-control 1/2] tickets: add tunnel ticket Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH access-control 2/2] ticket: normalize path for verification Fabian Grünbichler
2021-04-13 12:16 ` Fabian Grünbichler [this message]
2021-04-13 12:16 ` [pve-devel] [PATCH cluster 2/4] add get_remote_info Fabian Grünbichler
2021-04-18 17:07 ` Thomas Lamprecht
2021-04-19 7:48 ` Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH cluster 3/4] remote: add option/completion Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH cluster 4/4] get_remote_info: also return FP if available Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH common 1/2] schema: pull out abstract 'id-pair' verifier Fabian Grünbichler
2021-04-16 10:24 ` [pve-devel] applied: " Thomas Lamprecht
2021-04-19 8:43 ` [pve-devel] [PATCH common] fixup: remove double braces Stefan Reiter
2021-04-19 9:56 ` [pve-devel] applied: " Thomas Lamprecht
2021-04-13 12:16 ` [pve-devel] [PATCH common 2/2] schema: add pve-bridge-id option/format/pair Fabian Grünbichler
2021-04-16 9:53 ` Thomas Lamprecht
2021-04-16 10:10 ` Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH guest-common] migrate: handle migration_network with remote migration Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH manager] API: add node address(es) API endpoint Fabian Grünbichler
2021-04-16 10:17 ` Thomas Lamprecht
2021-04-16 11:37 ` Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH storage] import: allow import from UNIX socket Fabian Grünbichler
2021-04-16 10:24 ` [pve-devel] applied: " Thomas Lamprecht
2021-04-13 12:16 ` [pve-devel] [PATCH qemu-server 1/7] migrate: factor out storage checks Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH qemu-server 2/7] refactor map_storage to map_id Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH qemu-server 3/7] schema: use pve-bridge-id Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH qemu-server 4/7] mtunnel: add API endpoints Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH qemu-server 5/7] migrate: refactor remote VM/tunnel start Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH qemu-server 6/7] migrate: add remote migration handling Fabian Grünbichler
2021-04-13 12:16 ` [pve-devel] [PATCH qemu-server 7/7] api: add remote migrate endpoint Fabian Grünbichler
2021-04-15 14:04 ` [pve-devel] [RFC qemu-server++ 0/22] remote migration alexandre derumier
2021-04-15 14:32 ` Fabian Grünbichler
2021-04-15 14:36 ` Thomas Lamprecht
2021-04-15 16:38 ` Moula BADJI
2021-05-05 6:02 ` aderumier
2021-05-05 9:22 ` Dominik Csapak
2021-04-16 7:36 ` alexandre derumier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210413121640.3602975-8-f.gruenbichler@proxmox.com \
--to=f.gruenbichler@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox