[pve-devel] [PATCH manager 13/14] ceph: mon destroy: remove from mon_host

Dominik Csapak d.csapak at proxmox.com
Wed Jun 19 12:03:28 CEST 2019


On 6/19/19 11:58 AM, Thomas Lamprecht wrote:
> On 6/18/19 3:42 PM, Dominik Csapak wrote:
>> 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>
>> ---
>>   PVE/API2/Ceph/MON.pm | 38 ++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 38 insertions(+)
>>
>> diff --git a/PVE/API2/Ceph/MON.pm b/PVE/API2/Ceph/MON.pm
>> index a8ece0b4..975e1848 100644
>> --- a/PVE/API2/Ceph/MON.pm
>> +++ b/PVE/API2/Ceph/MON.pm
>> @@ -337,6 +337,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);
>>   
>>   		$rados->mon_command({ prefix => "mon remove", name => $monid, format => 'plain' });
>> @@ -347,6 +356,35 @@ __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 only
>> +		    $monhost =~ s/(^|[ ,;]+)\Q$addr\E(?:[ ,;]+|$)/$1/;
>> +		    # ip + port
>> +		    $monhost =~ s/(^|[ ,;]+)\Q$addr\E:\d+(?:[ ,;]+|$)/$1/;
> 
> why not both at once with \d*

should work, but we have to do '(:\d+)?'

> 
>> +
>> +		    # ipv6 only without brackets
>> +		    if ($addr =~ m/^\[?(.*?:.*?)\]?$/) {
>> +			$addr = $1;
>> +			$monhost =~ s/(^|[ ,;]+)\Q$addr\E(?:[ ,;]+|$)/$1/;
>> +		    }
>> +
>> +		    # remove trailing seperators
>> +		    $monhost =~ s/[ ,;]+$//;
> 
> not too happy about all above to be honest... but could work for now, I mean
> you did not invent this "nice" format..

me neither... but the only alternative i see is to build a full 
parser/writer, which is even more complicated code...

> 
>> +
>> +		    $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) };
>>
> 





More information about the pve-devel mailing list