instead of having multiple regexes in various places for the name, define a 'SERVICE_REGEX' in PVE::Ceph::Services, and use that everywhere in the api where we need it
additionally limit new sevices to 200 characters, since systemd units have a limit of 256 characters[0] (including suffix), and 200 seems to be enough. users can now create ceph services on machines with hostnames longer than 32 characters 0: https://www.freedesktop.org/software/systemd/man/systemd.unit.html Signed-off-by: Dominik Csapak <d.csa...@proxmox.com> --- replaces my patch "ceph: increase allowed service names to 63 characters" PVE/API2/Ceph.pm | 6 +++--- PVE/API2/Ceph/MDS.pm | 5 +++-- PVE/API2/Ceph/MGR.pm | 5 +++-- PVE/API2/Ceph/MON.pm | 5 +++-- PVE/Ceph/Services.pm | 4 +++- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/PVE/API2/Ceph.pm b/PVE/API2/Ceph.pm index 391382f8..85a04101 100644 --- a/PVE/API2/Ceph.pm +++ b/PVE/API2/Ceph.pm @@ -424,7 +424,7 @@ __PACKAGE__->register_method ({ type => 'string', optional => 1, default => 'ceph.target', - pattern => '(ceph|mon|mds|osd|mgr)(\.[A-Za-z0-9\-]{1,32})?', + pattern => '(ceph|mon|mds|osd|mgr)(\.'.PVE::Ceph::Services::SERVICE_REGEX.')?', }, }, }, @@ -475,7 +475,7 @@ __PACKAGE__->register_method ({ type => 'string', optional => 1, default => 'ceph.target', - pattern => '(ceph|mon|mds|osd|mgr)(\.[A-Za-z0-9\-]{1,32})?', + pattern => '(ceph|mon|mds|osd|mgr)(\.'.PVE::Ceph::Services::SERVICE_REGEX.')?', }, }, }, @@ -526,7 +526,7 @@ __PACKAGE__->register_method ({ type => 'string', optional => 1, default => 'ceph.target', - pattern => '(mon|mds|osd|mgr)(\.[A-Za-z0-9\-]{1,32})?', + pattern => '(mon|mds|osd|mgr)(\.'.PVE::Ceph::Services::SERVICE_REGEX.')?', }, }, }, diff --git a/PVE/API2/Ceph/MDS.pm b/PVE/API2/Ceph/MDS.pm index 532eb404..1cb0b74f 100644 --- a/PVE/API2/Ceph/MDS.pm +++ b/PVE/API2/Ceph/MDS.pm @@ -104,7 +104,8 @@ __PACKAGE__->register_method ({ type => 'string', optional => 1, default => 'nodename', - pattern => '[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?', + pattern => PVE::Ceph::Services::SERVICE_REGEX, + maxLength => 200, description => "The ID for the mds, when omitted the same as the nodename", }, hotstandby => { @@ -195,7 +196,7 @@ __PACKAGE__->register_method ({ name => { description => 'The name (ID) of the mds', type => 'string', - pattern => '[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?', + pattern => PVE::Ceph::Services::SERVICE_REGEX, }, }, }, diff --git a/PVE/API2/Ceph/MGR.pm b/PVE/API2/Ceph/MGR.pm index ffae7495..2dc679ef 100644 --- a/PVE/API2/Ceph/MGR.pm +++ b/PVE/API2/Ceph/MGR.pm @@ -97,7 +97,8 @@ __PACKAGE__->register_method ({ id => { type => 'string', optional => 1, - pattern => '[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?', + pattern => PVE::Ceph::Services::SERVICE_REGEX, + maxLength => 200, description => "The ID for the manager, when omitted the same as the nodename", }, }, @@ -144,7 +145,7 @@ __PACKAGE__->register_method ({ id => { description => 'The ID of the manager', type => 'string', - pattern => '[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?', + pattern => PVE::Ceph::Services::SERVICE_REGEX, }, }, }, diff --git a/PVE/API2/Ceph/MON.pm b/PVE/API2/Ceph/MON.pm index 0432ca67..18b563c9 100644 --- a/PVE/API2/Ceph/MON.pm +++ b/PVE/API2/Ceph/MON.pm @@ -172,7 +172,8 @@ __PACKAGE__->register_method ({ monid => { type => 'string', optional => 1, - pattern => '[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?', + pattern => PVE::Ceph::Services::SERVICE_REGEX, + maxLength => 200, description => "The ID for the monitor, when omitted the same as the nodename", }, 'mon-address' => { @@ -320,7 +321,7 @@ __PACKAGE__->register_method ({ monid => { description => 'Monitor ID', type => 'string', - pattern => '[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?', + pattern => PVE::Ceph::Services::SERVICE_REGEX, }, }, }, diff --git a/PVE/Ceph/Services.pm b/PVE/Ceph/Services.pm index 45eb6c3f..c17008cf 100644 --- a/PVE/Ceph/Services.pm +++ b/PVE/Ceph/Services.pm @@ -11,6 +11,8 @@ use PVE::RADOS; use JSON; use File::Path; +use constant SERVICE_REGEX => '[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?'; + # checks /etc/systemd/system/ceph-* to list all services, even if not running # also checks /var/lib/ceph/$type sub get_local_services { @@ -62,7 +64,7 @@ sub ceph_service_cmd { my ($action, $service) = @_; my $pve_ceph_cfgpath = PVE::Ceph::Tools::get_config('pve_ceph_cfgpath'); - if ($service && $service =~ m/^(mon|osd|mds|mgr|radosgw)(\.([A-Za-z0-9\-]{1,32}))?$/) { + if ($service && $service =~ m/^(mon|osd|mds|mgr|radosgw)(\.(${\SERVICE_REGEX}))?$/) { $service = defined($3) ? "ceph-$1\@$3" : "ceph-$1.target"; } else { $service = "ceph.target"; -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel