]> git.proxmox.com Git - pve-storage.git/commitdiff
rbd: use pve-storage-portal-dns-list for monhost
authorWolfgang Bumiller <w.bumiller@proxmox.com>
Mon, 11 Jul 2016 11:55:48 +0000 (13:55 +0200)
committerFabian Grünbichler <f.gruenbichler@proxmox.com>
Mon, 11 Jul 2016 11:58:56 +0000 (13:58 +0200)
This way we get parameter verification on monitor addresses
as well as the ability to pass multiple `--monhost`
arguments to `pvesm add`.

Since our '-list' schemas default to using commas we now
need to properly support these, so all uses of the monhost
property now replace all of semicolon, space or comma into
the currently required character.
This should fix the issues reported by Alwin Antreich on the
pve-user list.

Since this schema supports both ipv6+port notations we need
to make sure we convert to the bracket enclosed variant.
Added a helper for this.

PVE/Storage/RBDPlugin.pm

index ced9af09d5c9d6471e6e395131611ad43e784f21..2788a349f85f3af921d7cc736a04ee82943a1968 100644 (file)
@@ -3,6 +3,7 @@ package PVE::Storage::RBDPlugin;
 use strict;
 use warnings;
 use IO::File;
+use Net::IP;
 use PVE::Tools qw(run_command trim);
 use PVE::Storage::Plugin;
 use PVE::JSONSchema qw(get_standard_option);
@@ -25,11 +26,21 @@ my $add_pool_to_disk = sub {
     return "$pool/$disk";
 };
 
+my $hostlist = sub {
+    my ($list_text, $separator) = @_;
+    my @monhostlist = PVE::Tools::split_list($list_text);
+    return join($separator, map {
+       my ($host, $port) = PVE::Tools::parse_host_and_port($_);
+       $port = defined($port) ? ":$port" : '';
+       $host = "[$host]" if Net::IP::ip_is_ipv6($host);
+       "${host}${port}"
+    } @monhostlist);
+};
+
 my $rbd_cmd = sub {
     my ($scfg, $storeid, $op, @options) = @_;
 
-    my $monhost = $scfg->{monhost};
-    $monhost =~ s/;/,/g;
+    my $monhost = &$hostlist($scfg->{monhost}, ',');
 
     my $keyring = "/etc/pve/priv/ceph/${storeid}.keyring";
     my $pool =  $scfg->{pool} ? $scfg->{pool} : 'rbd';
@@ -55,8 +66,7 @@ my $rbd_cmd = sub {
 my $rados_cmd = sub {
     my ($scfg, $storeid, $op, @options) = @_;
 
-    my $monhost = $scfg->{monhost};
-    $monhost =~ s/;/,/g;
+    my $monhost = &$hostlist($scfg->{monhost}, ',');
 
     my $keyring = "/etc/pve/priv/ceph/${storeid}.keyring";
     my $pool =  $scfg->{pool} ? $scfg->{pool} : 'rbd';
@@ -248,7 +258,7 @@ sub properties {
     return {
        monhost => {
            description => "Monitors daemon ips.",
-           type => 'string',
+           type => 'string', format => 'pve-storage-portal-dns-list',
        },
        pool => {
            description => "Pool.",
@@ -302,7 +312,7 @@ sub path {
     my $pool =  $scfg->{pool} ? $scfg->{pool} : 'rbd';
     return ("/dev/rbd/$pool/$name", $vmid, $vtype) if $scfg->{krbd};
 
-    my $monhost = $scfg->{monhost};
+    my $monhost = &$hostlist($scfg->{monhost}, ';');
     $monhost =~ s/:/\\:/g;
 
     my $username =  $scfg->{username} ? $scfg->{username} : 'admin';