]> git.proxmox.com Git - pve-network.git/blobdiff - PVE/Network/SDN/Controllers.pm
controllers: evpn : use frr restart if reload fail
[pve-network.git] / PVE / Network / SDN / Controllers.pm
index 16c664d5c3833510f757ad0f1c0cfa9dde8cc79d..a23048e57a6a3847da9e984e68cfd32e13f2954f 100644 (file)
@@ -13,9 +13,11 @@ use PVE::Network::SDN::Vnets;
 use PVE::Network::SDN::Zones;
 
 use PVE::Network::SDN::Controllers::EvpnPlugin;
+use PVE::Network::SDN::Controllers::BgpPlugin;
 use PVE::Network::SDN::Controllers::FaucetPlugin;
 use PVE::Network::SDN::Controllers::Plugin;
 PVE::Network::SDN::Controllers::EvpnPlugin->register();
+PVE::Network::SDN::Controllers::BgpPlugin->register();
 PVE::Network::SDN::Controllers::FaucetPlugin->register();
 PVE::Network::SDN::Controllers::Plugin->init();
 
@@ -32,7 +34,7 @@ sub sdn_controllers_config {
 }
 
 sub config {
-    my $config = cfs_read_file("sdn/controllers.cfg.new");
+    my $config = cfs_read_file("sdn/controllers.cfg");
     $config = cfs_read_file("sdn/controllers.cfg") if !keys %{$config->{ids}};
     return $config;
 }
@@ -40,13 +42,13 @@ sub config {
 sub write_config {
     my ($cfg) = @_;
 
-    cfs_write_file("sdn/controllers.cfg.new", $cfg);
+    cfs_write_file("sdn/controllers.cfg", $cfg);
 }
 
 sub lock_sdn_controllers_config {
     my ($code, $errmsg) = @_;
 
-    cfs_lock_file("sdn/controllers.cfg.new", undef, $code);
+    cfs_lock_file("sdn/controllers.cfg", undef, $code);
     if (my $err = $@) {
         $errmsg ? die "$errmsg: $err" : die $err;
     }
@@ -55,22 +57,24 @@ sub lock_sdn_controllers_config {
 sub sdn_controllers_ids {
     my ($cfg) = @_;
 
-    return keys %{$cfg->{ids}};
+    return sort keys %{$cfg->{ids}};
 }
 
 sub complete_sdn_controller {
     my ($cmdname, $pname, $cvalue) = @_;
 
-    my $cfg = PVE::Network::SDN::config();
+    my $cfg = PVE::Network::SDN::running_config();
 
     return  $cmdname eq 'add' ? [] : [ PVE::Network::SDN::sdn_controllers_ids($cfg) ];
 }
 
 sub generate_controller_config {
 
-    my $vnet_cfg = PVE::Cluster::cfs_read_file('sdn/vnets.cfg');
-    my $zone_cfg = PVE::Cluster::cfs_read_file('sdn/zones.cfg');
-    my $controller_cfg = PVE::Cluster::cfs_read_file('sdn/controllers.cfg');
+    my $cfg = PVE::Network::SDN::running_config();
+    my $vnet_cfg = $cfg->{vnets};
+    my $zone_cfg = $cfg->{zones};
+    my $controller_cfg = $cfg->{controllers};
+
     return if !$vnet_cfg && !$zone_cfg && !$controller_cfg;
 
     #read main config for physical interfaces
@@ -79,7 +83,7 @@ sub generate_controller_config {
     my $interfaces_config = PVE::INotify::read_etc_network_interfaces(1,$fh);
     $fh->close();
 
-    #check uplinks
+    # check uplinks
     my $uplinks = {};
     foreach my $id (keys %{$interfaces_config->{ifaces}}) {
        my $interface = $interfaces_config->{ifaces}->{$id};
@@ -90,27 +94,27 @@ sub generate_controller_config {
        }
     }
 
-    #generate configuration
+    # generate configuration
     my $config = {};
 
-    foreach my $id (keys %{$controller_cfg->{ids}}) {
+    foreach my $id (sort keys %{$controller_cfg->{ids}}) {
        my $plugin_config = $controller_cfg->{ids}->{$id};
        my $plugin = PVE::Network::SDN::Controllers::Plugin->lookup($plugin_config->{type});
-       $plugin->generate_controller_config($plugin_config, $plugin_config, $id, $uplinks, $config);
+       $plugin->generate_controller_config($plugin_config, $controller_cfg, $id, $uplinks, $config);
     }
 
-    foreach my $id (keys %{$zone_cfg->{ids}}) {
+    foreach my $id (sort keys %{$zone_cfg->{ids}}) {
        my $plugin_config = $zone_cfg->{ids}->{$id};
        my $controllerid = $plugin_config->{controller};
        next if !$controllerid;
        my $controller = $controller_cfg->{ids}->{$controllerid};
        if ($controller) {
            my $controller_plugin = PVE::Network::SDN::Controllers::Plugin->lookup($controller->{type});
-           $controller_plugin->generate_controller_zone_config($plugin_config, $controller, $id, $uplinks, $config);
+           $controller_plugin->generate_controller_zone_config($plugin_config, $controller, $controller_cfg, $id, $uplinks, $config);
        }
     }
 
-    foreach my $id (keys %{$vnet_cfg->{ids}}) {
+    foreach my $id (sort keys %{$vnet_cfg->{ids}}) {
        my $plugin_config = $vnet_cfg->{ids}->{$id};
        my $zoneid = $plugin_config->{zone};
        next if !$zoneid;
@@ -121,7 +125,7 @@ sub generate_controller_config {
        my $controller = $controller_cfg->{ids}->{$controllerid};
        if ($controller) {
            my $controller_plugin = PVE::Network::SDN::Controllers::Plugin->lookup($controller->{type});
-           $controller_plugin->generate_controller_vnet_config($plugin_config, $controller, $zoneid, $id, $config);
+           $controller_plugin->generate_controller_vnet_config($plugin_config, $controller, $zone, $zoneid, $id, $config);
        }
     }
 
@@ -131,7 +135,9 @@ sub generate_controller_config {
 
 sub reload_controller {
 
-    my $controller_cfg = PVE::Cluster::cfs_read_file('sdn/controllers.cfg');
+    my $cfg = PVE::Network::SDN::running_config();
+    my $controller_cfg = $cfg->{controllers};
+
     return if !$controller_cfg;
 
     foreach my $id (keys %{$controller_cfg->{ids}}) {
@@ -141,10 +147,27 @@ sub reload_controller {
     }
 }
 
+sub generate_controller_rawconfig {
+    my ($config) = @_;
+
+    my $cfg = PVE::Network::SDN::running_config();
+    my $controller_cfg = $cfg->{controllers};
+    return if !$controller_cfg;
+
+    my $rawconfig = "";
+    foreach my $id (keys %{$controller_cfg->{ids}}) {
+       my $plugin_config = $controller_cfg->{ids}->{$id};
+       my $plugin = PVE::Network::SDN::Controllers::Plugin->lookup($plugin_config->{type});
+       $rawconfig .= $plugin->generate_controller_rawconfig($plugin_config, $config);
+    }
+    return $rawconfig;
+}
+
 sub write_controller_config {
     my ($config) = @_;
 
-    my $controller_cfg = PVE::Cluster::cfs_read_file('sdn/controllers.cfg');
+    my $cfg = PVE::Network::SDN::running_config();
+    my $controller_cfg = $cfg->{controllers};
     return if !$controller_cfg;
 
     foreach my $id (keys %{$controller_cfg->{ids}}) {