]> git.proxmox.com Git - pve-network.git/blobdiff - PVE/Network/SDN/Zones.pm
move dns options from subnets to zone
[pve-network.git] / PVE / Network / SDN / Zones.pm
index c16bf942aff0678d52500ebabb8e2c292eec9439..e7c7a7cd3e5c148ae9f602c80e9e13e2c537c98d 100644 (file)
@@ -16,6 +16,7 @@ use PVE::Network::SDN::Zones::QinQPlugin;
 use PVE::Network::SDN::Zones::VxlanPlugin;
 use PVE::Network::SDN::Zones::EvpnPlugin;
 use PVE::Network::SDN::Zones::FaucetPlugin;
+use PVE::Network::SDN::Zones::SimplePlugin;
 use PVE::Network::SDN::Zones::Plugin;
 
 PVE::Network::SDN::Zones::VlanPlugin->register();
@@ -23,6 +24,7 @@ PVE::Network::SDN::Zones::QinQPlugin->register();
 PVE::Network::SDN::Zones::VxlanPlugin->register();
 PVE::Network::SDN::Zones::EvpnPlugin->register();
 PVE::Network::SDN::Zones::FaucetPlugin->register();
+PVE::Network::SDN::Zones::SimplePlugin->register();
 PVE::Network::SDN::Zones::Plugin->init();
 
 my $local_network_sdn_file = "/etc/network/interfaces.d/sdn";
@@ -70,13 +72,32 @@ sub complete_sdn_zone {
     return  $cmdname eq 'add' ? [] : [ PVE::Network::SDN::sdn_zones_ids($cfg) ];
 }
 
+sub get_zone {
+    my ($zoneid, $running) = @_;
+
+    my $cfg = {};
+    if($running) {
+        my $cfg = PVE::Network::SDN::config();
+        $cfg = $cfg->{vnets};
+    } else {
+        $cfg = PVE::Network::SDN::Zones::config();
+    }
+
+    my $zone = PVE::Network::SDN::Zones::sdn_zones_config($cfg, $zoneid, 1);
+
+    return $zone;
+}
+
 
 sub generate_etc_network_config {
 
-    my $version = PVE::Cluster::cfs_read_file('sdn/.version');
-    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::config();
+
+    my $version = $cfg->{version};
+    my $vnet_cfg = $cfg->{vnets};
+    my $zone_cfg = $cfg->{zones};
+    my $subnet_cfg = $cfg->{subnets};
+    my $controller_cfg = $cfg->{controllers};
     return if !$vnet_cfg && !$zone_cfg;
 
     my $interfaces_config = PVE::INotify::read_file('interfaces');
@@ -110,7 +131,7 @@ sub generate_etc_network_config {
 
        my $plugin = PVE::Network::SDN::Zones::Plugin->lookup($plugin_config->{type});
        eval {
-           $plugin->generate_sdn_config($plugin_config, $zone, $id, $vnet, $controller, $interfaces_config, $config);
+           $plugin->generate_sdn_config($plugin_config, $zone, $id, $vnet, $controller, $subnet_cfg, $interfaces_config, $config);
        };
        if (my $err = $@) {
            warn "zone $zone : vnet $id : $err\n";
@@ -177,34 +198,48 @@ sub ifquery_check {
     return $interfaces;
 }
 
-# improve me : move status code inside plugins ?
+my $warned_about_reload;
+
 sub status {
 
     my $err_config = undef;
 
     my $local_version = PVE::Network::SDN::Zones::read_etc_network_config_version();
-    my $sdn_version = PVE::Cluster::cfs_read_file('sdn/.version');
+    my $cfg = PVE::Network::SDN::config();
+    my $sdn_version = $cfg->{version};
 
     return if !$sdn_version;
 
     if (!$local_version) {
        $err_config = "local sdn network configuration is not yet generated, please reload";
-       warn "$err_config\n";
+       if (!$warned_about_reload) {
+           $warned_about_reload = 1;
+           warn "$err_config\n";
+       }
     } elsif ($local_version < $sdn_version) {
        $err_config = "local sdn network configuration is too old, please reload";
-       warn "$err_config\n";
+       if (!$warned_about_reload) {
+           $warned_about_reload = 1;
+           warn "$err_config\n";
+       }
+    } else {
+       $warned_about_reload = 0;
     }
 
     my $status = ifquery_check();
 
-    my $vnet_cfg = PVE::Cluster::cfs_read_file('sdn/vnets.cfg');
-    my $zone_cfg = PVE::Cluster::cfs_read_file('sdn/zones.cfg');
+    
+    my $vnet_cfg = $cfg->{vnets};
+    my $zone_cfg = $cfg->{zones};
     my $nodename = PVE::INotify::nodename();
 
-
     my $vnet_status = {};
     my $zone_status = {};
 
+    for my $id (sort keys %{$zone_cfg->{ids}}) {
+       $zone_status->{$id}->{status} = $err_config ? 'pending' : 'available';
+    }
+
     foreach my $id (sort keys %{$vnet_cfg->{ids}}) {
        my $vnet = $vnet_cfg->{ids}->{$id};
        my $zone = $vnet->{zone};
@@ -213,17 +248,31 @@ sub status {
        my $plugin_config = $zone_cfg->{ids}->{$zone};
        next if defined($plugin_config->{nodes}) && !$plugin_config->{nodes}->{$nodename};
 
+       $vnet_status->{$id}->{zone} = $zone;
+       $vnet_status->{$id}->{status} = 'available';
+
+       if ($err_config) {
+           $vnet_status->{$id}->{status} = 'pending';
+           $vnet_status->{$id}->{statusmsg} = $err_config;
+           next;
+       }
+
        my $plugin = PVE::Network::SDN::Zones::Plugin->lookup($plugin_config->{type});
-       $plugin->status($plugin_config, $zone, $id, $vnet, $err_config, $status, $vnet_status, $zone_status);
+       my $err_msg = $plugin->status($plugin_config, $zone, $id, $vnet, $status);
+       if (@{$err_msg} > 0) {
+           $vnet_status->{$id}->{status} = 'error';
+           $vnet_status->{$id}->{statusmsg} = join(',', @{$err_msg});
+           $zone_status->{$id}->{status} = 'error';
+       }
     }
 
-    return($zone_status, $vnet_status);
+    return ($zone_status, $vnet_status);
 }
 
 sub tap_create {
     my ($iface, $bridge) = @_;
 
-    my $vnet = PVE::Network::SDN::Vnets::get_vnet($bridge);
+    my $vnet = PVE::Network::SDN::Vnets::get_vnet($bridge, 1);
     if (!$vnet) { # fallback for classic bridge
        PVE::Network::tap_create($iface, $bridge);
        return;
@@ -237,7 +286,7 @@ sub tap_create {
 sub veth_create {
     my ($veth, $vethpeer, $bridge, $hwaddr) = @_;
 
-    my $vnet = PVE::Network::SDN::Vnets::get_vnet($bridge);
+    my $vnet = PVE::Network::SDN::Vnets::get_vnet($bridge, 1);
     if (!$vnet) { # fallback for classic bridge
        PVE::Network::veth_create($veth, $vethpeer, $bridge, $hwaddr);
        return;
@@ -251,7 +300,7 @@ sub veth_create {
 sub tap_plug {
     my ($iface, $bridge, $tag, $firewall, $trunks, $rate) = @_;
 
-    my $vnet = PVE::Network::SDN::Vnets::get_vnet($bridge);
+    my $vnet = PVE::Network::SDN::Vnets::get_vnet($bridge, 1);
     if (!$vnet) { # fallback for classic bridge
        PVE::Network::tap_plug($iface, $bridge, $tag, $firewall, $trunks, $rate);
        return;