summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/PVE/API2/Network/SDN.pm82
-rw-r--r--src/PVE/Network/SDN.pm23
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;