]> git.proxmox.com Git - pve-network.git/blobdiff - PVE/Network/SDN.pm
subnets: convert dns private function to public sub
[pve-network.git] / PVE / Network / SDN.pm
index f21de150243c328af566e8a34357dd56ac3f7cbc..befaaeebefd0d69694870cbc1109c6eb40926c29 100644 (file)
@@ -81,6 +81,57 @@ sub config {
     return cfs_read_file($running_cfg);
 }
 
+sub pending_config {
+    my ($running_cfg, $cfg, $type) = @_;
+
+    my $pending = {};
+
+    my $running_objects = $running_cfg->{$type}->{ids};
+    my $config_objects = $cfg->{ids};
+
+    foreach my $id (sort keys %{$running_objects}) {
+       my $running_object = $running_objects->{$id};
+       my $config_object = $config_objects->{$id};
+       foreach my $key (sort keys %{$running_object}) {
+           $pending->{$id}->{$key} = $running_object->{$key};
+           if(!keys %{$config_object}) {
+               $pending->{$id}->{state} = "deleted";
+           } elsif (!defined($config_object->{$key})) {
+               $pending->{$id}->{"pending"}->{$key} = 'deleted';
+               $pending->{$id}->{state} = "changed";
+           } elsif (PVE::Network::SDN::encode_value(undef, $key, $running_object->{$key})
+                        ne PVE::Network::SDN::encode_value(undef, $key, $config_object->{$key})) {
+               $pending->{$id}->{state} = "changed";
+           }
+       }
+       $pending->{$id}->{"pending"} = {} if $pending->{$id}->{state} && !defined($pending->{$id}->{"pending"});
+    }
+
+   foreach my $id (sort keys %{$config_objects}) {
+       my $running_object = $running_objects->{$id};
+       my $config_object = $config_objects->{$id};
+
+       foreach my $key (sort keys %{$config_object}) {
+           my $config_value = PVE::Network::SDN::encode_value(undef, $key, $config_object->{$key}) if $config_object->{$key};
+           my $running_value = PVE::Network::SDN::encode_value(undef, $key, $running_object->{$key}) if $running_object->{$key};
+           if($key eq 'type' || $key eq 'vnet') {
+               $pending->{$id}->{$key} = $config_value;
+           } else {
+               $pending->{$id}->{"pending"}->{$key} = $config_value if !defined($running_value) || ($config_value ne $running_value);
+           }
+           if(!keys %{$running_object}) {
+               $pending->{$id}->{state} = "new";
+           } elsif (!defined($running_value) && defined($config_value)) {
+               $pending->{$id}->{state} = "changed";
+           }
+       }
+       $pending->{$id}->{"pending"} = {} if  $pending->{$id}->{state} && !defined($pending->{$id}->{"pending"});
+   }
+
+   return {ids => $pending};
+
+}
+
 sub commit_config {
 
     my $cfg = cfs_read_file($running_cfg);
@@ -137,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;
@@ -145,7 +198,7 @@ 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' };
+       $vnets->{$vnetid} = { type => 'vnet', active => '1', comments => $comments };
     }
 
     return $vnets;
@@ -165,5 +218,64 @@ sub generate_controller_config {
     PVE::Network::SDN::Controllers::reload_controller() if $reload;
 }
 
-1;
+sub encode_value {
+    my ($type, $key, $value) = @_;
+
+    if ($key eq 'nodes' || $key eq 'exitnodes') {
+        if(ref($value) eq 'HASH') {
+            return join(',', sort keys(%$value));
+        } else {
+            return $value;
+        }
+    }
+
+    return $value;
+}
+
+
+#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;