diff options
| -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; |
