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

Reply via email to