From: Thomas Lamprecht <t.lamprecht@proxmox.com>
To: Proxmox VE development discussion <pve-devel@lists.proxmox.com>,
Aaron Lauterer <a.lauterer@proxmox.com>
Subject: Re: [pve-devel] [PATCH storage 1/2] rbd: fix #3286 add namespace support
Date: Thu, 1 Apr 2021 16:48:09 +0200 [thread overview]
Message-ID: <5f42111c-488d-a702-69a6-7deebec46b92@proxmox.com> (raw)
In-Reply-To: <20210401134057.26305-1-a.lauterer@proxmox.com>
On 01.04.21 15:40, Aaron Lauterer wrote:
> This patch introduces support for Cephs RBD namespaces.
>
> A new storage config parameter 'namespace' defines the namespace to be
> used for the RBD storage.
>
> The namespace must already exist in the Ceph cluster as it is not
> automatically created.
>
> The main intention is to use this for external Ceph clusters. With
> namespaces, each PVE cluster can get its own namespace and will not
> conflict with other PVE clusters.
>
> Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com>
>
> remove just style changes
> ---
> Changes from RFC:
>
> add --namespace parameter centrally in sub $build_cmd. All commands
> except one (rbd unmap) support it. To handle commands that don't support
> it, a hash with them was introduced.
>
> In a few places paths (FS, Ceph hierarchy) are needed. These are the
> places scattered throughout the plugin where the namespace is inserted
> if it is configured.
>
> PVE/Storage/RBDPlugin.pm | 34 ++++++++++++++++++++++++++++------
> 1 file changed, 28 insertions(+), 6 deletions(-)
>
> diff --git a/PVE/Storage/RBDPlugin.pm b/PVE/Storage/RBDPlugin.pm
> index fab6d57..2d78f40 100644
> --- a/PVE/Storage/RBDPlugin.pm
> +++ b/PVE/Storage/RBDPlugin.pm
> @@ -27,7 +27,9 @@ my $add_pool_to_disk = sub {
>
> my $pool = $scfg->{pool} ? $scfg->{pool} : 'rbd';
>
> - return "$pool/$disk";
> + my $namespace = $scfg->{namespace} ? "/$scfg->{namespace}" : "";
can I have "0" as namespace? as then above check may break. Maybe do:
my $namespace = '/' . ($scfg->{namespace} // '');
return "${pool}${namespace}${disk}";
> +
> + return "${pool}${namespace}/${disk}";
> };
>
> my $build_cmd = sub {
> @@ -38,6 +40,14 @@ my $build_cmd = sub {
>
> my $cmd = [$binary, '-p', $pool];
>
> + # some subcommands will fail if the --namespace parameter is present
> + my $no_namespace_parameter = {
> + unmap => 1,
> + };
> +
> + push @$cmd, '--namespace', $scfg->{namespace}
> + if ($scfg->{namespace} && !$no_namespace_parameter->{$op});
> +
> push @$cmd, '-c', $cmd_option->{ceph_conf} if ($cmd_option->{ceph_conf});
> push @$cmd, '-m', $cmd_option->{mon_host} if ($cmd_option->{mon_host});
> push @$cmd, '--auth_supported', $cmd_option->{auth_supported} if ($cmd_option->{auth_supported});
> @@ -154,6 +164,7 @@ sub rbd_ls {
>
> my $cmd = &$rbd_cmd($scfg, $storeid, 'ls', '-l', '--format', 'json');
> my $pool = $scfg->{pool} ? $scfg->{pool} : 'rbd';
> + $pool .= "/$scfg->{namespace}" if $scfg->{namespace};
>
> my $raw = '';
> my $parser = sub { $raw .= shift };
> @@ -281,6 +292,10 @@ sub properties {
> description => "Pool.",
> type => 'string',
> },
> + namespace=> {
> + description => "RBD Namespace.",
> + type => 'string',
> + },
> username => {
> description => "RBD Id.",
> type => 'string',
> @@ -302,6 +317,7 @@ sub options {
> disable => { optional => 1 },
> monhost => { optional => 1},
> pool => { optional => 1 },
> + namespace => { optional => 1 },
> username => { optional => 1 },
> content => { optional => 1 },
> krbd => { optional => 1 },
> @@ -349,9 +365,10 @@ sub path {
> $name .= '@'.$snapname if $snapname;
>
> my $pool = $scfg->{pool} ? $scfg->{pool} : 'rbd';
> - return ("/dev/rbd/$pool/$name", $vmid, $vtype) if $scfg->{krbd};
> + my $namespace = $scfg->{namespace} ? "/$scfg->{namespace}" : "";
same as above, a for perl falsy $ns value "breaks" this.
maybe we could use a `get_pool_ns_path($scfg)` (possible better name possible,
should be relatively short and not too misguiding) sub returning both of above?
Or actually: maybe even a `get_rbd_path($scfg, $image)` returning
"${pool}${namespace}${image}"
(with $ns omitted/added depending on config)
There's seems to be more use for that one when looking at the changes made here.
> + return ("/dev/rbd/${pool}${namespace}/${name}", $vmid, $vtype) if $scfg->{krbd};
>
> - my $path = "rbd:$pool/$name";
> + my $path = "rbd:${pool}${namespace}/${name}";
>
> $path .= ":conf=$cmd_option->{ceph_conf}" if $cmd_option->{ceph_conf};
> if (defined($scfg->{monhost})) {
> @@ -370,6 +387,7 @@ sub find_free_diskname {
> my ($class, $storeid, $scfg, $vmid, $fmt, $add_fmt_suffix) = @_;
>
> my $cmd = &$rbd_cmd($scfg, $storeid, 'ls');
> +
unrelated new line added? (albeit this one may improve code readability, so fine for me)
> my $disk_list = [];
>
> my $parser = sub {
> @@ -487,6 +505,7 @@ sub free_image {
> my ($vtype, $name, $vmid, undef, undef, undef) =
> $class->parse_volname($volname);
>
> +
bogus new lien added?
> my $snaps = rbd_ls_snap($scfg, $storeid, $name);
> foreach my $snap (keys %$snaps) {
> if ($snaps->{$snap}->{protected}) {
> @@ -511,6 +530,7 @@ sub list_images {
>
> $cache->{rbd} = rbd_ls($scfg, $storeid) if !$cache->{rbd};
> my $pool = $scfg->{pool} ? $scfg->{pool} : 'rbd';
> + $pool .= "/$scfg->{namespace}" if $scfg->{namespace};
>
> my $res = [];
>
> @@ -575,7 +595,9 @@ sub deactivate_storage {
> }
>
> my $get_kernel_device_name = sub {
> - my ($pool, $name) = @_;
> + my ($pool, $name, $namespace) = @_;
> +
> + return "/dev/rbd/${pool}/${namespace}/${name}" if $namespace;
>
> return "/dev/rbd/$pool/$name";
> };
> @@ -590,7 +612,7 @@ sub map_volume {
>
> my $pool = $scfg->{pool} ? $scfg->{pool} : 'rbd';
>
> - my $kerneldev = $get_kernel_device_name->($pool, $name);
> + my $kerneldev = $get_kernel_device_name->($pool, $name, $scfg->{namespace});
>
> return $kerneldev if -b $kerneldev; # already mapped
>
> @@ -611,7 +633,7 @@ sub unmap_volume {
>
> my $pool = $scfg->{pool} ? $scfg->{pool} : 'rbd';
>
> - my $kerneldev = $get_kernel_device_name->($pool, $name);
> + my $kerneldev = $get_kernel_device_name->($pool, $name, $scfg->{namespace});
>
> if (-b $kerneldev) {
> my $cmd = &$rbd_cmd($scfg, $storeid, 'unmap', $kerneldev);
>
next prev parent reply other threads:[~2021-04-01 14:48 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-01 13:40 Aaron Lauterer
2021-04-01 13:40 ` [pve-devel] [PATCH storage 2/2] rbd: add integration test for namespace handling Aaron Lauterer
2021-04-01 14:34 ` Thomas Lamprecht
2021-04-01 14:48 ` Thomas Lamprecht [this message]
2021-04-02 12:20 ` [pve-devel] [PATCH storage 1/2] rbd: fix #3286 add namespace support Aaron Lauterer
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=5f42111c-488d-a702-69a6-7deebec46b92@proxmox.com \
--to=t.lamprecht@proxmox.com \
--cc=a.lauterer@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.