Check notification targets configured in datacenter.cfg and jobs.cfg,
failing if the group/endpoint to be removed is still in use there.

Signed-off-by: Lukas Wagner <l.wag...@proxmox.com>
---
 PVE/API2/Cluster/Notifications.pm | 44 ++++++++++++++++++++++++++++++-
 1 file changed, 43 insertions(+), 1 deletion(-)

diff --git a/PVE/API2/Cluster/Notifications.pm 
b/PVE/API2/Cluster/Notifications.pm
index fa2c1d9d..cf913452 100644
--- a/PVE/API2/Cluster/Notifications.pm
+++ b/PVE/API2/Cluster/Notifications.pm
@@ -6,6 +6,7 @@ use strict;
 use Storable qw(dclone);
 use JSON;
 
+use PVE::Exception qw(raise_param_exc);
 use PVE::Tools qw(extract_param);
 use PVE::JSONSchema qw(get_standard_option);
 use PVE::RESTHandler;
@@ -55,6 +56,31 @@ sub raise_api_error {
     die $exc;
 }
 
+sub target_used_by {
+    my ($target) = @_;
+
+    my $used_by = [];
+
+    # Check keys in datacenter.cfg
+    my $dc_conf = PVE::Cluster::cfs_read_file('datacenter.cfg');
+    for my $key (qw(target-package-updates target-replication target-fencing)) 
{
+       if ($dc_conf->{notify} && $dc_conf->{notify}->{$key} eq $target) {
+           push @$used_by, $key;
+       }
+    }
+
+    # Check backup jobs
+    my $jobs_conf = PVE::Cluster::cfs_read_file('jobs.cfg');
+    for my $key (keys %{$jobs_conf->{ids}}) {
+       my $job = $jobs_conf->{ids}->{$key};
+       if ($job->{'notification-target'} eq $target) {
+           push @$used_by, $key;
+       }
+    }
+
+    return join(', ', @$used_by);
+}
+
 __PACKAGE__->register_method ({
     name => 'index',
     path => '',
@@ -492,6 +518,11 @@ __PACKAGE__->register_method ({
        my ($param) = @_;
        my $name = extract_param($param, 'name');
 
+       my $used_by = target_used_by($name);
+       if ($used_by) {
+           raise_param_exc({'name' => "Cannot remove $name, used by: 
$used_by"});
+       }
+
        eval {
            PVE::Notify::lock_config(sub {
                my $config = PVE::Notify::read_config();
@@ -778,11 +809,17 @@ __PACKAGE__->register_method ({
     returns => { type => 'null' },
     code => sub {
        my ($param) = @_;
+       my $name = extract_param($param, 'name');
+
+       my $used_by = target_used_by($name);
+       if ($used_by) {
+           raise_param_exc({'name' => "Cannot remove $name, used by: 
$used_by"});
+       }
 
        eval {
            PVE::Notify::lock_config(sub {
                my $config = PVE::Notify::read_config();
-               $config->delete_sendmail_endpoint($param->{name});
+               $config->delete_sendmail_endpoint($name);
                PVE::Notify::write_config($config);
            });
        };
@@ -1037,6 +1074,11 @@ __PACKAGE__->register_method ({
        my ($param) = @_;
        my $name = extract_param($param, 'name');
 
+       my $used_by = target_used_by($name);
+       if ($used_by) {
+           raise_param_exc({'name' => "Cannot remove $name, used by: 
$used_by"});
+       }
+
        eval {
            PVE::Notify::lock_config(sub {
                my $config = PVE::Notify::read_config();
-- 
2.39.2



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

Reply via email to