[pve-devel] [PATCH v2 pve-manager] API2 : Network : add network config reload

Alexandre DERUMIER aderumier at odiso.com
Sun Sep 23 17:05:04 CEST 2018


Hi,

seem to be lost in the mailing, can somebody review this V2 ?


----- Mail original -----
De: "aderumier" <aderumier at odiso.com>
À: "pve-devel" <pve-devel at pve.proxmox.com>
Cc: "aderumier" <aderumier at odiso.com>
Envoyé: Mercredi 27 Juin 2018 04:53:57
Objet: [PATCH v2 pve-manager] API2 : Network : add network config reload

changelog: 

- remove restart option 
- check if vm|ct are running on a bridge delete 
- run the networking service reload in a task 


This add a new api to online reload networking configuration 
with ifupdown2. 

This work with native ifupdown2 modules, as ifupdown2 have 
interface dependency relationships. 

--- 
PVE/API2/Network.pm | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 
1 file changed, 68 insertions(+), 1 deletion(-) 

diff --git a/PVE/API2/Network.pm b/PVE/API2/Network.pm 
index c0ae1df3..9475396f 100644 
--- a/PVE/API2/Network.pm 
+++ b/PVE/API2/Network.pm 
@@ -4,7 +4,7 @@ use strict; 
use warnings; 

use Net::IP qw(:PROC); 
-use PVE::Tools qw(extract_param); 
+use PVE::Tools qw(extract_param dir_glob_regex); 
use PVE::SafeSyslog; 
use PVE::INotify; 
use PVE::Exception qw(raise_param_exc); 
@@ -477,6 +477,73 @@ __PACKAGE__->register_method({ 
}}); 

__PACKAGE__->register_method({ 
+ name => 'reload_network_config', 
+ path => '', 
+ method => 'PUT', 
+ permissions => { 
+ check => ['perm', '/nodes/{node}', [ 'Sys.Modify' ]], 
+ }, 
+ description => "Reload network configuration", 
+ protected => 1, 
+ proxyto => 'node', 
+ parameters => { 
+ additionalProperties => 0, 
+ properties => { 
+ node => get_standard_option('pve-node'), 
+ }, 
+ }, 
+ returns => { type => 'string' }, 
+ code => sub { 
+ 
+ my ($param) = @_; 
+ 
+ my $rpcenv = PVE::RPCEnvironment::get(); 
+ 
+ my $authuser = $rpcenv->get_user(); 
+ 
+ my $current_config_file = "/etc/network/interfaces"; 
+ my $new_config_file = "/etc/network/interfaces.new"; 
+ 
+ raise_param_exc({ config => "you need ifupdown2 to reload networking" }) if !-e '/usr/share/ifupdown2'; 
+ raise_param_exc({ config => "no new network config to apply" }) if !-e $new_config_file; 
+ 
+ my $tmp = PVE::INotify::read_file('interfaces', 1); 
+ my $config = $tmp->{data}; 
+ my $changes = $tmp->{changes}; 
+ 
+ raise_param_exc({ config => "no changes detected" }) if !$changes; 
+ 
+ my $ovs_changes = undef; 
+ my $bridges_delete = {}; 
+ my @lines = split(/\n/, $changes); 
+ foreach my $line (@lines) { 
+ if($line =~ m/^\-iface\s(vmbr(\S+))/) { 
+ $bridges_delete->{$1} = 1; 
+ } elsif ($line =~ m/ovs_type/) { 
+ $ovs_changes = 1; 
+ } 
+ } 
+ 
+ raise_param_exc({ config => "reloading config with ovs changes is not possible currently\n" }) 
+ if $ovs_changes && !$param->{restart}; 
+ 
+ foreach my $bridge (keys %$bridges_delete) { 
+ 
+ my (undef, $interface) = dir_glob_regex("/sys/class/net/$bridge/brif", '(tap|veth|fwpr).*'); 
+ raise_param_exc({ config => "bridge deletion is not possible currently if vm or ct are running on this bridge\n" }) 
+ if defined($interface); 
+ } 
+ 
+ PVE::Tools::file_copy($new_config_file, $current_config_file); 
+ unlink $new_config_file; 
+ 
+ my $worker = sub { 
+ PVE::Tools::run_command(['systemctl', 'reload', 'networking']); 
+ }; 
+ return $rpcenv->fork_worker('srvreload', 'networking', $authuser, $worker); 
+ }}); 
+ 
+__PACKAGE__->register_method({ 
name => 'delete_network', 
path => '{iface}', 
method => 'DELETE', 
-- 
2.11.0 



More information about the pve-devel mailing list