[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