[pve-devel] [PATCH manager 3/3] Fix #2422: allow multiple Ceph public networks

Fabian Grünbichler f.gruenbichler at proxmox.com
Wed Apr 15 10:30:49 CEST 2020


On March 11, 2020 4:22 pm, Alwin Antreich wrote:
> Multiple public networks can be defined in the ceph.conf. The networks
> need to be routed to each other.
> 
> On first service start the Ceph MON will register itself with one of the
> IPs configured locally, matching one of the public networks defined in
> the ceph.conf.
> 
> Signed-off-by: Alwin Antreich <a.antreich at proxmox.com>
> ---
>  PVE/API2/Ceph/MON.pm | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/PVE/API2/Ceph/MON.pm b/PVE/API2/Ceph/MON.pm
> index 3baeac52..5128fea2 100644
> --- a/PVE/API2/Ceph/MON.pm
> +++ b/PVE/API2/Ceph/MON.pm
> @@ -33,11 +33,19 @@ my $find_mon_ip = sub {
>      }
>      $pubnet //= $cfg->{global}->{public_network};
>  
> +    my $public_nets = [ PVE::Tools::split_list($pubnet) ];
> +    warn "Multiple ceph public networks detected on $node: $pubnet\n".
> +    "Networks must be capable of routing to each other.\n" if scalar(@$public_nets) > 1;
> +

style nit: indentation/alignment, also - postfix if for multiline 
statement is confusing.

>      if (!$pubnet) {
>  	return $overwrite_ip // PVE::Cluster::remote_node_ip($node);
>      }

so here we check whether $pubnet is true, but in the new hunk above we 
already split and print it? works in practice (PVE::Tools::split_list 
handles undef fine, and then $public_nets does not have entries, so the 
warn does not trigger), but is the wrong way round ;)

>  
> -    my $allowed_ips = PVE::Network::get_local_ip_from_cidr($pubnet);
> +    my $allowed_ips;

could possibly be converted to a hash, and make the code using it below 
more readably by getting rid of 'check for duplicate/set membership via grep'

> +    foreach my $net (@$public_nets) {
> +        push @$allowed_ips, @{ PVE::Network::get_local_ip_from_cidr($net) };

would it make sense to catch errors from $net not being a valid CIDR 
string here? so that we get a nice error message, instead of whatever 
'ip' does with the invalid input/command line..

> +    }
> +
>      die "No active IP found for the requested ceph public network '$pubnet' on node '$node'\n"
>  	if scalar(@$allowed_ips) < 1;

further below there is still a code path that treats $pubnet as 
containing a single CIDR string:

62	die "Monitor IP '$overwrite_ip' not in ceph public network '$pubnet'\n"
63	    if !PVE::Network::is_ip_in_cidr($overwrite_ip, $pubnet);

>  
> -- 
> 2.20.1
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
> 
> 




More information about the pve-devel mailing list