]> git.proxmox.com Git - pve-network.git/blame - PVE/Network/SDN.pm
zones: simple|evpn: add gateway ip from subnets to vnet
[pve-network.git] / PVE / Network / SDN.pm
CommitLineData
86d22462 1package PVE::Network::SDN;
92b6f291
AD
2
3use strict;
4use warnings;
434125ce 5
92b6f291 6use Data::Dumper;
c665cefc 7use JSON;
434125ce 8
7129a3ca 9use PVE::Network::SDN::Vnets;
f5eabba0
AD
10use PVE::Network::SDN::Zones;
11
434125ce 12use PVE::Tools qw(extract_param dir_glob_regex run_command);
92b6f291 13use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file);
92b6f291 14
f9bc9640
AD
15
16my $version_cfg = "sdn/.version";
17
18my $parse_version_cfg = sub {
19 my ($filename, $raw) = @_;
20
28664c9b
TL
21 return 0 if !defined($raw) || $raw eq '';
22
23 warn "invalid sdn version '$raw'" if $raw !~ m/\d+$/;
f9bc9640
AD
24
25 return $raw,
26};
27
28my $write_version_cfg = sub {
29 my ($filename, $version) = @_;
30
31 warn "invalid sdn version" if $version !~ m/\d+$/;
32
33 return $version;
34};
35
36PVE::Cluster::cfs_register_file($version_cfg, $parse_version_cfg, $write_version_cfg);
37
38
f5eabba0 39# improve me : move status code inside plugins ?
92b6f291 40
e424c7ac 41sub ifquery_check {
c665cefc
AD
42
43 my $cmd = ['ifquery', '-a', '-c', '-o','json'];
c665cefc 44
0c5021ad
TL
45 my $result = '';
46 my $reader = sub { $result .= shift };
c665cefc
AD
47
48 eval {
6e9fff39 49 run_command($cmd, outfunc => $reader);
c665cefc
AD
50 };
51
6e9fff39 52 my $resultjson = decode_json($result);
c665cefc
AD
53 my $interfaces = {};
54
55 foreach my $interface (@$resultjson) {
6e9fff39
AD
56 my $name = $interface->{name};
57 $interfaces->{$name} = {
58 status => $interface->{status},
59 config => $interface->{config},
60 config_status => $interface->{config_status},
61 };
c665cefc
AD
62 }
63
64 return $interfaces;
65}
66
e424c7ac
AD
67sub status {
68
56cdcac9
AD
69 my ($zone_status, $vnet_status) = PVE::Network::SDN::Zones::status();
70 return($zone_status, $vnet_status);
e424c7ac
AD
71}
72
f9bc9640
AD
73
74sub increase_version {
75
76 my $version = cfs_read_file($version_cfg);
22b24447 77 if ($version) {
f9bc9640
AD
78 $version++;
79 } else {
80 $version = 1;
81 }
82
83 cfs_write_file($version_cfg, $version);
84}
85
86sub lock_sdn_config {
87 my ($code, $errmsg) = @_;
88
89 cfs_lock_file($version_cfg, undef, $code);
90
91 if (my $err = $@) {
92 $errmsg ? die "$errmsg: $err" : die $err;
93 }
94}
95
7129a3ca
AD
96sub get_local_vnets {
97
98 my $rpcenv = PVE::RPCEnvironment::get();
99
100 my $authuser = $rpcenv->get_user();
101
102 my $nodename = PVE::INotify::nodename();
103
104 my $vnets_cfg = PVE::Network::SDN::Vnets::config();
105 my $zones_cfg = PVE::Network::SDN::Zones::config();
106
107 my @vnetids = PVE::Network::SDN::Vnets::sdn_vnets_ids($vnets_cfg);
108
109 my $vnets = {};
110
111 foreach my $vnetid (@vnetids) {
112
113 my $vnet = PVE::Network::SDN::Vnets::sdn_vnets_config($vnets_cfg, $vnetid);
114 my $zoneid = $vnet->{zone};
115 my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
116
117 next if !$zoneid;
118 next if !$rpcenv->check_any($authuser, "/sdn/zones/$zoneid", $privs, 1);
119
120 my $zone_config = PVE::Network::SDN::Zones::sdn_zones_config($zones_cfg, $zoneid);
121
122 next if defined($zone_config->{nodes}) && !$zone_config->{nodes}->{$nodename};
123 $vnets->{$vnetid} = { type => 'vnet', active => '1' };
124 }
125
126 return $vnets;
127}
128
22b24447
TL
129sub generate_zone_config {
130 my $raw_config = PVE::Network::SDN::Zones::generate_etc_network_config();
131 PVE::Network::SDN::Zones::write_etc_network_config($raw_config);
132}
133
134sub generate_controller_config {
135 my ($reload) = @_;
136
137 my $raw_config = PVE::Network::SDN::Controllers::generate_controller_config();
138 PVE::Network::SDN::Controllers::write_controller_config($raw_config);
139
140 PVE::Network::SDN::Controllers::reload_controller() if $reload;
141}
142
e424c7ac 1431;
80348b2d 144