diff options
Diffstat (limited to 'src/PVE')
| -rw-r--r-- | src/PVE/API2/Network/SDN.pm | 82 | ||||
| -rw-r--r-- | src/PVE/Network/SDN.pm | 23 | 
2 files changed, 105 insertions, 0 deletions
diff --git a/src/PVE/API2/Network/SDN.pm b/src/PVE/API2/Network/SDN.pm index 924c9e4..9e59d08 100644 --- a/src/PVE/API2/Network/SDN.pm +++ b/src/PVE/API2/Network/SDN.pm @@ -116,6 +116,88 @@ my $create_reload_network_worker = sub {  };  __PACKAGE__->register_method({ +    name => 'lock', +    protected => 1, +    path => 'lock', +    method => 'POST', +    description => "Acquire global lock for SDN configuration", +    permissions => { +        check => ['perm', '/sdn', ['SDN.Allocate']], +    }, +    parameters => { +        additionalProperties => 0, +        properties => { +            'allow-pending' => { +                type => 'boolean', +                optional => 1, +                default => 0, +                description => +                    'if true, allow acquiring lock even though there are pending changes', +            }, +        }, +    }, +    returns => { +        type => 'string', +    }, +    code => sub { +        my ($param) = @_; + +        return PVE::Network::SDN::lock_sdn_config( +            sub { +                die "configuration has pending changes" +                    if !$param->{'allow-pending'} && PVE::Network::SDN::has_pending_changes(); + +                return PVE::Network::SDN::create_global_lock(); +            }, +            "could not acquire lock for SDN config", +        ); +    }, +}); + +__PACKAGE__->register_method({ +    name => 'release_lock', +    protected => 1, +    path => 'lock', +    method => 'DELETE', +    description => "Release global lock for SDN configuration", +    permissions => { +        check => ['perm', '/sdn', ['SDN.Allocate']], +    }, +    parameters => { +        additionalProperties => 0, +        properties => { +            'lock-token' => get_standard_option('pve-sdn-lock-token'), +            'force' => { +                type => 'boolean', +                optional => 1, +                default => 0, +                description => 'if true, allow releasing lock without providing the token', +            }, +        }, +    }, +    returns => { +        type => 'null', +    }, +    code => sub { +        my ($param) = @_; + +        my $code = sub { +            PVE::Network::SDN::delete_global_lock(); +        }; + +        if ($param->{force}) { +            $code->(); +        } else { +            PVE::Network::SDN::lock_sdn_config( +                $code, +                "could not release lock", +                $param->{'lock-token'}, +            ); +        } +    }, +}); + +__PACKAGE__->register_method ({      name => 'reload',      protected => 1,      path => '', diff --git a/src/PVE/Network/SDN.pm b/src/PVE/Network/SDN.pm index 8a963cb..83f2cc7 100644 --- a/src/PVE/Network/SDN.pm +++ b/src/PVE/Network/SDN.pm @@ -209,6 +209,29 @@ sub commit_config {      cfs_write_file($running_cfg, $cfg);  } +sub has_pending_changes { +    my $running_cfg = PVE::Network::SDN::running_config(); + +    # only use configuration files which get written by commit_config here +    my $config_files = { +        zones => PVE::Network::SDN::Zones::config(), +        vnets => PVE::Network::SDN::Vnets::config(), +        subnets => PVE::Network::SDN::Subnets::config(), +        controllers => PVE::Network::SDN::Controllers::config(), +    }; + +    for my $config_file (keys %$config_files) { +        my $config = $config_files->{$config_file}; +        my $pending_config = PVE::Network::SDN::pending_config($running_cfg, $config, $config_file); + +        for my $id (keys %{ $pending_config->{ids} }) { +            return 1 if $pending_config->{ids}->{$id}->{pending}; +        } +    } + +    return 0; +} +  sub generate_lock_token {      my $str;      my $uuid;  | 
