[pve-devel] [PATCH manager v2 6/7] ceph: mon destroy: remove from mon_host

Dominik Csapak d.csapak at proxmox.com
Wed Jun 19 13:45:53 CEST 2019


we need to remove an ip, ip:port or a ipvector from monhost
so use multiple regex search and replaces for this

this looks not really nice, but due to the strange format
of the line (e.g. ',' is a seperator inside and outside of a vector,
also ipv6 adresses may be surrounded with [] but so are vectors),
i found no better way

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
changes from v1:
* combined ip and ip:port regexes
 PVE/API2/Ceph/MON.pm | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/PVE/API2/Ceph/MON.pm b/PVE/API2/Ceph/MON.pm
index 37762f86..036c6374 100644
--- a/PVE/API2/Ceph/MON.pm
+++ b/PVE/API2/Ceph/MON.pm
@@ -338,6 +338,15 @@ __PACKAGE__->register_method ({
 		$monstat = $rados->mon_command({ prefix => 'mon_status' });
 		$monlist = $monstat->{monmap}->{mons};
 
+		my $addr;
+		for my $mon (@$monlist) {
+		    if ($mon->{name} eq $monid) {
+			$addr = $mon->{public_addr} // $mon->{addr};
+			($addr) = $addr =~ m|^(.*):\d+/\d+$|; # extract the ip without port/nonce
+			last;
+		    }
+		}
+
 		$assert_mon_can_remove->($monhash, $monlist, $monid, $mondir);
 
 		$rados->mon_command({ prefix => "mon remove", name => $monid, format => 'plain' });
@@ -348,6 +357,33 @@ __PACKAGE__->register_method ({
 		# delete section
 		delete $cfg->{$monsection};
 
+		# delete from mon_host
+		if (my $monhost = $cfg->{global}->{mon_host}) {
+		    # various replaces to remove the ip
+		    # we always match the beginning or a seperator (also at the end)
+		    # so we do not accidentally remove a wrong ip
+		    # e.g. removing 10.0.0.1 should not remove 10.0.0.101 or 110.0.0.1
+
+		    # remove vector containing this ip
+		    # format is [vX:ip:port/nonce,vY:ip:port/nonce]
+		    my $vectorpart_re = "v\\d+:\Q$addr\E:\\d+\\/\\d+";
+		    $monhost =~ s/(^|[ ,;]*)\[$vectorpart_re(?:,$vectorpart_re)*\](?:[ ,;]+|$)/$1/;
+
+		    # ip (+ port)
+		    $monhost =~ s/(^|[ ,;]+)\Q$addr\E(?::\d+)?(?:[ ,;]+|$)/$1/;
+
+		    # ipv6 only without brackets
+		    if ($addr =~ m/^\[?(.*?:.*?)\]?$/) {
+			$addr = $1;
+			$monhost =~ s/(^|[ ,;]+)\Q$addr\E(?:[ ,;]+|$)/$1/;
+		    }
+
+		    # remove trailing seperators
+		    $monhost =~ s/[ ,;]+$//;
+
+		    $cfg->{global}->{mon_host} = $monhost;
+		}
+
 		cfs_write_file('ceph.conf', $cfg);
 		File::Path::remove_tree($mondir);
 		eval { PVE::Ceph::Services::ceph_service_cmd('disable', $monsection) };
-- 
2.11.0





More information about the pve-devel mailing list