From: Leo Nunner <l.nunner@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH v2 storage] config: add overrides for default directory locations
Date: Mon, 2 Jan 2023 17:04:37 +0100 [thread overview]
Message-ID: <20230102160438.180285-2-l.nunner@proxmox.com> (raw)
In-Reply-To: <20230102160438.180285-1-l.nunner@proxmox.com>
Allowing overrides for the default directory locations seems to
integrate rather well into the existing system. Custom locations
are specified using the "dirs" parameter as a comma-separated list
of "vtype:/location" values.
For now, the option has been enabled for the Directory, CIFS and NFS
backends.
Signed-off-by: Leo Nunner <l.nunner@proxmox.com>
---
PVE/Storage/CIFSPlugin.pm | 1 +
PVE/Storage/DirPlugin.pm | 1 +
PVE/Storage/NFSPlugin.pm | 1 +
PVE/Storage/Plugin.pm | 49 +++++++++++++++++++++++++++++++++++----
test/get_subdir_test.pm | 7 ++++++
5 files changed, 55 insertions(+), 4 deletions(-)
diff --git a/PVE/Storage/CIFSPlugin.pm b/PVE/Storage/CIFSPlugin.pm
index 982040a..4284c35 100644
--- a/PVE/Storage/CIFSPlugin.pm
+++ b/PVE/Storage/CIFSPlugin.pm
@@ -128,6 +128,7 @@ sub properties {
sub options {
return {
path => { fixed => 1 },
+ dirs => { optional => 1 },
server => { fixed => 1 },
share => { fixed => 1 },
nodes => { optional => 1 },
diff --git a/PVE/Storage/DirPlugin.pm b/PVE/Storage/DirPlugin.pm
index 8715a9d..3c907ca 100644
--- a/PVE/Storage/DirPlugin.pm
+++ b/PVE/Storage/DirPlugin.pm
@@ -54,6 +54,7 @@ sub properties {
sub options {
return {
path => { fixed => 1 },
+ dirs => { optional => 1 },
nodes => { optional => 1 },
shared => { optional => 1 },
disable => { optional => 1 },
diff --git a/PVE/Storage/NFSPlugin.pm b/PVE/Storage/NFSPlugin.pm
index 5bd7313..b7e8318 100644
--- a/PVE/Storage/NFSPlugin.pm
+++ b/PVE/Storage/NFSPlugin.pm
@@ -79,6 +79,7 @@ sub properties {
sub options {
return {
path => { fixed => 1 },
+ dirs => { optional => 1 },
server => { fixed => 1 },
export => { fixed => 1 },
nodes => { optional => 1 },
diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm
index 8a41df1..5cb3d90 100644
--- a/PVE/Storage/Plugin.pm
+++ b/PVE/Storage/Plugin.pm
@@ -181,6 +181,11 @@ my $defaultData = {
default => 'metadata',
optional => 1,
},
+ dirs => {
+ description => "Overrides for default directories",
+ type => "string", format => "pve-dir-override-list",
+ optional => 1,
+ },
},
};
@@ -205,6 +210,12 @@ sub valid_content_types {
return $def->{content}->[0];
}
+sub dirs_hash_to_string {
+ my $hash = shift;
+
+ return join(',', map { "$_:$hash->{$_}" } sort keys %$hash);
+}
+
sub default_format {
my ($scfg) = @_;
@@ -335,6 +346,18 @@ sub parse_volume_id {
die "unable to parse volume ID '$volid'\n";
}
+PVE::JSONSchema::register_format('pve-dir-override', \&verify_dir_override);
+sub verify_dir_override {
+ my ($value, $noerr) = @_;
+
+ if($value =~ m/^([a-z]+):(.+)$/ &&
+ verify_content($1, $noerr) && verify_path($2, $noerr)) {
+ return $value;
+ }
+
+ return undef if $noerr;
+ die "invalid override '$value'\n";
+}
sub private {
return $defaultData;
@@ -405,6 +428,22 @@ sub decode_value {
# die "storage '$storeid' does not allow node restrictions\n";
#}
+ return $res;
+ } elsif ($key eq 'dirs') {
+ my $valid_content = $def->{content}->[0];
+ my $res = {};
+
+ foreach my $dir (PVE::Tools::split_list($value)) {
+ my ($content, $path) = split(/:/, $dir, 2);
+
+ if (!$valid_content->{$content}) {
+ warn "storage does not support content type '$content'\n";
+ next;
+ }
+
+ $res->{$content} = $path;
+ }
+
return $res;
}
@@ -419,6 +458,9 @@ sub encode_value {
} elsif ($key eq 'content') {
my $res = content_hash_to_string($value) || 'none';
return $res;
+ } elsif ($key eq 'dirs') {
+ my $res = dirs_hash_to_string($value);
+ return $res;
}
return $value;
@@ -610,12 +652,11 @@ sub get_subdir {
my $path = $scfg->{path};
die "storage definition has no path\n" if !$path;
+ die "unknown vtype '$vtype'\n" if !exists($vtype_subdirs->{$vtype});
- my $subdir = $vtype_subdirs->{$vtype};
-
- die "unknown vtype '$vtype'\n" if !defined($subdir);
+ my $subdir = $scfg->{dirs}->{$vtype} // "/".$vtype_subdirs->{$vtype};
- return "$path/$subdir";
+ return $path.$subdir;
}
sub filesystem_path {
diff --git a/test/get_subdir_test.pm b/test/get_subdir_test.pm
index 1e58350..26c08d5 100644
--- a/test/get_subdir_test.pm
+++ b/test/get_subdir_test.pm
@@ -27,6 +27,13 @@ foreach my $type (keys %$vtype_subdirs) {
push @$tests, [ $scfg_with_path, $type, $path ];
}
+# creates additional tests for overrides
+foreach my $type (keys %$vtype_subdirs) {
+ my $override = "/${type}_override";
+ my $scfg_with_override = { path => '/some/path', dirs => { $type => $override } };
+ push @$tests, [ $scfg_with_override, $type, "$scfg_with_override->{path}$scfg_with_override->{dirs}->{$type}" ];
+}
+
plan tests => scalar @$tests;
foreach my $tt (@$tests) {
--
2.30.2
next prev parent reply other threads:[~2023-01-02 16:04 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-02 16:04 [pve-devel] [PATCH v2 storage docs] Allow overrides for default directories Leo Nunner
2023-01-02 16:04 ` Leo Nunner [this message]
2023-01-05 13:34 ` [pve-devel] applied: [PATCH v2 storage] config: add overrides for default directory locations Wolfgang Bumiller
2023-01-05 13:54 ` [pve-devel] " Thomas Lamprecht
2023-01-02 16:04 ` [pve-devel] [PATCH v2 docs] docs: document 'dirs' parameter for directory storage Leo Nunner
2023-01-05 13:35 ` [pve-devel] applied: " Wolfgang Bumiller
2023-01-05 13:41 ` [pve-devel] [PATCH v2 storage docs] Allow overrides for default directories Wolfgang Bumiller
2023-01-05 13:53 ` Thomas Lamprecht
2023-01-05 14:02 ` Wolfgang Bumiller
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=20230102160438.180285-2-l.nunner@proxmox.com \
--to=l.nunner@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal