]> git.proxmox.com Git - pve-network.git/blobdiff - PVE/Network/SDN.pm
evpn : remove "ip route add vrf vrf_myzone unreachable default metric 4278198272...
[pve-network.git] / PVE / Network / SDN.pm
index c0c5672a1ffd38c6fea0348cb29e72f47c26632c..d3399ceef858d759a28cecd47086bb0beb5de6ba 100644 (file)
@@ -6,8 +6,6 @@ use warnings;
 use Data::Dumper;
 use JSON;
 
-use PVE::JSONSchema;
-
 use PVE::Network::SDN::Vnets;
 use PVE::Network::SDN::Zones;
 use PVE::Network::SDN::Controllers;
@@ -79,7 +77,7 @@ sub status {
     return($zone_status, $vnet_status);
 }
 
-sub config {
+sub running_config {
     return cfs_read_file($running_cfg);
 }
 
@@ -106,6 +104,7 @@ sub pending_config {
                $pending->{$id}->{state} = "changed";
            }
        }
+       $pending->{$id}->{"pending"} = {} if $pending->{$id}->{state} && !defined($pending->{$id}->{"pending"});
     }
 
    foreach my $id (sort keys %{$config_objects}) {
@@ -126,6 +125,7 @@ sub pending_config {
                $pending->{$id}->{state} = "changed";
            }
        }
+       $pending->{$id}->{"pending"} = {} if  $pending->{$id}->{state} && !defined($pending->{$id}->{"pending"});
    }
 
    return {ids => $pending};
@@ -176,7 +176,7 @@ sub get_local_vnets {
 
     my $nodename = PVE::INotify::nodename();
 
-    my $cfg = PVE::Network::SDN::config();
+    my $cfg = PVE::Network::SDN::running_config();
     my $vnets_cfg = $cfg->{vnets};
     my $zones_cfg = $cfg->{zones};
 
@@ -188,6 +188,8 @@ sub get_local_vnets {
 
        my $vnet = PVE::Network::SDN::Vnets::sdn_vnets_config($vnets_cfg, $vnetid);
        my $zoneid = $vnet->{zone};
+       my $comments = $vnet->{alias};
+
        my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
 
        next if !$zoneid;
@@ -196,7 +198,9 @@ sub get_local_vnets {
        my $zone_config = PVE::Network::SDN::Zones::sdn_zones_config($zones_cfg, $zoneid);
 
        next if defined($zone_config->{nodes}) && !$zone_config->{nodes}->{$nodename};
-       $vnets->{$vnetid} = { type => 'vnet', active => '1' };
+       my $ipam = $zone_config->{ipam} ? 1 : 0;
+       my $vlanaware = $vnet->{vlanaware} ? 1 : 0;
+       $vnets->{$vnetid} = { type => 'vnet', active => '1', ipam => $ipam, vlanaware => $vlanaware, comments => $comments };
     }
 
     return $vnets;
@@ -216,25 +220,6 @@ sub generate_controller_config {
     PVE::Network::SDN::Controllers::reload_controller() if $reload;
 }
 
-
-sub decode_value {
-    my ($type, $key, $value) = @_;
-
-    if ($key eq 'nodes') {
-        my $res = {};
-
-        foreach my $node (PVE::Tools::split_list($value)) {
-            if (PVE::JSONSchema::pve_verify_node_name($node)) {
-                $res->{$node} = 1;
-            }
-        }
-
-        return $res;
-    }
-
-   return $value;
-}
-
 sub encode_value {
     my ($type, $key, $value) = @_;
 
@@ -249,5 +234,50 @@ sub encode_value {
     return $value;
 }
 
-1;
 
+#helpers
+sub api_request {
+    my ($method, $url, $headers, $data) = @_;
+
+    my $encoded_data = to_json($data) if $data;
+
+    my $req = HTTP::Request->new($method,$url, $headers, $encoded_data);
+
+    my $ua = LWP::UserAgent->new(protocols_allowed => ['http', 'https'], timeout => 30);
+    my $proxy = undef;
+
+    if ($proxy) {
+        $ua->proxy(['http', 'https'], $proxy);
+    } else {
+        $ua->env_proxy;
+    }
+
+    $ua->ssl_opts(verify_hostname => 0, SSL_verify_mode => 0x00);
+
+    my $response = $ua->request($req);
+    my $code = $response->code;
+
+    if ($code !~ /^2(\d+)$/) {
+        my $msg = $response->message || 'unknown';
+        die "Invalid response from server: $code $msg\n";
+    }
+
+    my $raw = '';
+    if (defined($response->decoded_content)) {
+       $raw = $response->decoded_content;
+    } else {
+       $raw = $response->content;
+    }
+
+    return if $raw eq '';
+
+    my $json = '';
+    eval {
+       $json = from_json($raw);
+    };
+    die "api response is not a json" if $@;
+
+    return $json;
+}
+
+1;