to reduce code duplication and make it easier to add more options for
pool commands.

Use a new rados object for each 'osd pool set', as each command can set
an option independent of the previous commands success/failure. On
failure a new rados object would need to be created and that will
confuse task tracking of the REST environment.

Signed-off-by: Alwin Antreich <a.antre...@proxmox.com>
---
Note:
    v1 -> v2:
        * reorder patches, since pool create & set share common pool
          options.
        * include new setpool API

 PVE/API2/Ceph.pm  | 17 +++++++----
 PVE/Ceph/Tools.pm | 74 +++++++++++++++++++++++++----------------------
 2 files changed, 52 insertions(+), 39 deletions(-)

diff --git a/PVE/API2/Ceph.pm b/PVE/API2/Ceph.pm
index d7e5892c..48d0484f 100644
--- a/PVE/API2/Ceph.pm
+++ b/PVE/API2/Ceph.pm
@@ -751,14 +751,21 @@ __PACKAGE__->register_method ({
                if !PVE::JSONSchema::parse_storage_id($pool);
        }
 
-       my $pg_num = $param->{pg_num} || 128;
-       my $size = $param->{size} || 3;
-       my $min_size = $param->{min_size} || 2;
-       my $application = $param->{application} // 'rbd';
+       my $ceph_param = \%$param;
+       for my $item ('add_storages', 'name', 'node') {
+           # not ceph parameters
+           delete $ceph_param->{$item};
+       }
+
+       # pool defaults
+       $ceph_param->{pg_num} //= 128;
+       $ceph_param->{size} //= 3;
+       $ceph_param->{min_size} //= 2;
+       $ceph_param->{application} //= 'rbd';
 
        my $worker = sub {
 
-           PVE::Ceph::Tools::create_pool($pool, $param);
+           PVE::Ceph::Tools::create_pool($pool, $ceph_param);
 
            if ($param->{add_storages}) {
                my $err;
diff --git a/PVE/Ceph/Tools.pm b/PVE/Ceph/Tools.pm
index 2d8a4c1d..cc4238c9 100644
--- a/PVE/Ceph/Tools.pm
+++ b/PVE/Ceph/Tools.pm
@@ -202,6 +202,45 @@ sub check_ceph_enabled {
     return 1;
 }
 
+sub set_pool {
+    my ($pool, $param) = @_;
+
+    foreach my $setting (keys %$param) {
+       my $value = $param->{$setting};
+
+       my $command;
+       if ($setting eq 'application') {
+           $command = {
+               prefix => "osd pool application enable",
+               pool   => "$pool",
+               app    => "$value",
+           };
+       } else {
+           $command = {
+               prefix => "osd pool set",
+               pool   => "$pool",
+               var    => "$setting",
+               val    => "$value",
+               format => 'plain',
+           };
+       }
+
+       my $rados = PVE::RADOS->new();
+       eval { $rados->mon_command($command); };
+       if ($@) {
+           print "$@";
+       } else {
+           delete $param->{$setting};
+       }
+    }
+
+    if ((keys %$param) > 0) {
+       my @missing = join(', ', keys %$param );
+       die "Could not set: @missing\n";
+    }
+
+}
+
 sub create_pool {
     my ($pool, $param, $rados) = @_;
 
@@ -210,9 +249,6 @@ sub create_pool {
     }
 
     my $pg_num = $param->{pg_num} || 128;
-    my $size = $param->{size} || 3;
-    my $min_size = $param->{min_size} || 2;
-    my $application = $param->{application} // 'rbd';
 
     $rados->mon_command({
        prefix => "osd pool create",
@@ -221,37 +257,7 @@ sub create_pool {
        format => 'plain',
     });
 
-    $rados->mon_command({
-       prefix => "osd pool set",
-       pool => $pool,
-       var => 'min_size',
-       val => "$min_size",
-       format => 'plain',
-    });
-
-    $rados->mon_command({
-       prefix => "osd pool set",
-       pool => $pool,
-       var => 'size',
-       val => "$size",
-       format => 'plain',
-    });
-
-    if (defined($param->{crush_rule})) {
-       $rados->mon_command({
-           prefix => "osd pool set",
-           pool => $pool,
-           var => 'crush_rule',
-           val => $param->{crush_rule},
-           format => 'plain',
-       });
-    }
-
-    $rados->mon_command({
-       prefix => "osd pool application enable",
-       pool => $pool,
-       app => $application,
-    });
+    set_pool($pool, $param);
 
 }
 
-- 
2.27.0



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to