old status sub was renamed ifquery_check

also check if local config exist or if local config is too old.
(fixme : compare mtime, maybe could we use some kind of version for this?)

we can have 4 status code:

- pending : local config is absent but sdn.cfg exist
- unknown : local config is too old, we can't be sure of the running state
- error : local config is present, but don't match the running state
- available : all is ok, local config is present and match running state.

Signed-off-by: Alexandre Derumier <aderum...@odiso.com>
---
 PVE/Network/SDN.pm  | 59 +++++++++++++++++++++++++++++++++++++++++++--
 test/statuscheck.pl | 37 +---------------------------
 2 files changed, 58 insertions(+), 38 deletions(-)

diff --git a/PVE/Network/SDN.pm b/PVE/Network/SDN.pm
index 9488f4f..771d7a5 100644
--- a/PVE/Network/SDN.pm
+++ b/PVE/Network/SDN.pm
@@ -65,7 +65,7 @@ sub complete_sdn {
     return  $cmdname eq 'add' ? [] : [ PVE::Network::SDN::sdn_ids($cfg) ];
 }
 
-sub status {
+sub ifquery_check {
 
     my $cmd = ['ifquery', '-a', '-c', '-o','json'];
 
@@ -161,7 +161,62 @@ sub write_etc_network_config {
     $writefh->close();
 }
 
-1;
 
+sub status {
+
+    my $cluster_sdn_file = "/etc/pve/sdn.cfg";
+    my $local_sdn_file = "/etc/network/interfaces.d/sdn";
+    my $err_config = undef;
+
+    return if !-e $cluster_sdn_file;
+
+    if (!-e $local_sdn_file) {
+       warn "local sdn network configuration is not yet generated, please 
reload";
+       $err_config = 'pending';
+    } else {
+       # fixme : use some kind of versioning info?
+       my $cluster_sdn_timestamp = (stat($cluster_sdn_file))[9];
+       my $local_sdn_timestamp = (stat($local_sdn_file))[9];
+
+       if ($local_sdn_timestamp < $cluster_sdn_timestamp) {
+           warn "local sdn network configuration is too old, please reload";
+           $err_config = 'unknown';
+        }
+    }
+
+    my $status = ifquery_check();
 
+    my $network_cfg = PVE::Cluster::cfs_read_file('sdn.cfg');
+    my $vnet_cfg = undef;
+    my $transport_cfg = undef;
+
+    my $vnet_status = {};
+    my $transport_status = {};
+
+    foreach my $id (keys %{$network_cfg->{ids}}) {
+       if ($network_cfg->{ids}->{$id}->{type} eq 'vnet') {
+           my $transportzone = $network_cfg->{ids}->{$id}->{transportzone};
+           $transport_status->{$transportzone}->{status} = 'available' if 
!defined($transport_status->{$transportzone}->{status});
+
+           if($err_config) {
+               $vnet_status->{$id}->{status} = $err_config;
+               $transport_status->{$transportzone}->{status} = $err_config;
+           } elsif ($status->{$id}->{status} && $status->{$id}->{status} eq 
'pass') {
+               $vnet_status->{$id}->{status} = 'available';
+               my $bridgeport = $status->{$id}->{config}->{'bridge-ports'};
+
+               if ($status->{$bridgeport}->{status} && 
$status->{$bridgeport}->{status} ne 'pass') {
+                    $vnet_status->{$id}->{status} = 'error';
+                    $transport_status->{$transportzone}->{status} = 'error';
+               }
+           } else {
+               $vnet_status->{$id}->{status} = 'error';
+               $transport_status->{$transportzone}->{status} = 'error';
+           }
+       }
+    }
+    return($transport_status, $vnet_status);
+}
+
+1;
 
diff --git a/test/statuscheck.pl b/test/statuscheck.pl
index 619a957..e43003b 100644
--- a/test/statuscheck.pl
+++ b/test/statuscheck.pl
@@ -1,44 +1,9 @@
 use strict;
 use warnings;
-use File::Copy;
-use PVE::Cluster qw(cfs_read_file);
-
 use PVE::Network::SDN;
 use Data::Dumper;
-use PVE::Network::SDN::Plugin;
-use PVE::Network::SDN::VnetPlugin;
-use PVE::Network::SDN::VlanPlugin;
-use PVE::Network::SDN::VxlanMulticastPlugin;
-
-
-my $status = PVE::Network::SDN::status();
-
-my $network_cfg = PVE::Cluster::cfs_read_file('networks.cfg');
-my $vnet_cfg = undef;
-my $transport_cfg = undef;
-
-my $vnet_status = {};
-my $transport_status = {};
-
-foreach my $id (keys %{$network_cfg->{ids}}) {
-    if ($network_cfg->{ids}->{$id}->{type} eq 'vnet') {
-       my $transportzone = $network_cfg->{ids}->{$id}->{transportzone};
-       $transport_status->{$transportzone}->{status} = 1 if 
!defined($transport_status->{$transportzone}->{status});
-
-       if ($status->{$id}->{status} && $status->{$id}->{status} eq 'pass') {
-           $vnet_status->{$id}->{status} = 1;
-           my $bridgeport = $status->{$id}->{config}->{'bridge-ports'};
 
-           if ($status->{$bridgeport}->{status} && 
$status->{$bridgeport}->{status} ne 'pass') {
-               $vnet_status->{$id}->{status} = 0;
-               $transport_status->{$transportzone}->{status} = 0;
-           }
-       } else {
-           $vnet_status->{$id}->{status} = 0;
-           $transport_status->{$transportzone}->{status} = 0;
-       }
-    }
-}
+my ($transport_status, $vnet_status) = PVE::Network::SDN::status();
 
 print Dumper($vnet_status);
 print Dumper($transport_status);
-- 
2.20.1

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to