]> git.proxmox.com Git - pve-network.git/blame - PVE/Network/SDN.pm
api: generate 'running-config' state instead of version increase on apply
[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 10use PVE::Network::SDN::Zones;
5d3e0248
AD
11use PVE::Network::SDN::Controllers;
12use PVE::Network::SDN::Subnets;
f5eabba0 13
434125ce 14use PVE::Tools qw(extract_param dir_glob_regex run_command);
92b6f291 15use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file);
92b6f291 16
f9bc9640 17
5d3e0248 18my $running_cfg = "sdn/.running-config";
f9bc9640 19
5d3e0248 20my $parse_running_cfg = sub {
f9bc9640
AD
21 my ($filename, $raw) = @_;
22
5d3e0248 23 my $cfg = {};
28664c9b 24
5d3e0248 25 return $cfg if !defined($raw) || $raw eq '';
f9bc9640 26
5d3e0248
AD
27 eval {
28 $cfg = from_json($raw);
29 };
30 return {} if $@;
31
32 return $cfg;
f9bc9640
AD
33};
34
5d3e0248
AD
35my $write_running_cfg = sub {
36 my ($filename, $cfg) = @_;
f9bc9640 37
5d3e0248 38 my $json = to_json($cfg);
f9bc9640 39
5d3e0248 40 return $json;
f9bc9640
AD
41};
42
5d3e0248 43PVE::Cluster::cfs_register_file($running_cfg, $parse_running_cfg, $write_running_cfg);
f9bc9640
AD
44
45
f5eabba0 46# improve me : move status code inside plugins ?
92b6f291 47
e424c7ac 48sub ifquery_check {
c665cefc
AD
49
50 my $cmd = ['ifquery', '-a', '-c', '-o','json'];
c665cefc 51
0c5021ad
TL
52 my $result = '';
53 my $reader = sub { $result .= shift };
c665cefc
AD
54
55 eval {
6e9fff39 56 run_command($cmd, outfunc => $reader);
c665cefc
AD
57 };
58
6e9fff39 59 my $resultjson = decode_json($result);
c665cefc
AD
60 my $interfaces = {};
61
62 foreach my $interface (@$resultjson) {
6e9fff39
AD
63 my $name = $interface->{name};
64 $interfaces->{$name} = {
65 status => $interface->{status},
66 config => $interface->{config},
67 config_status => $interface->{config_status},
68 };
c665cefc
AD
69 }
70
71 return $interfaces;
72}
73
e424c7ac
AD
74sub status {
75
56cdcac9
AD
76 my ($zone_status, $vnet_status) = PVE::Network::SDN::Zones::status();
77 return($zone_status, $vnet_status);
e424c7ac
AD
78}
79
5d3e0248
AD
80sub config {
81 return cfs_read_file($running_cfg);
82}
83
84sub commit_config {
f9bc9640 85
5d3e0248
AD
86 my $cfg = cfs_read_file($running_cfg);
87 my $version = $cfg->{version};
f9bc9640 88
22b24447 89 if ($version) {
f9bc9640
AD
90 $version++;
91 } else {
92 $version = 1;
93 }
94
5d3e0248
AD
95 my $vnets_cfg = PVE::Network::SDN::Vnets::config();
96 my $zones_cfg = PVE::Network::SDN::Zones::config();
97 my $controllers_cfg = PVE::Network::SDN::Controllers::config();
98 my $subnets_cfg = PVE::Network::SDN::Subnets::config();
99
100 my $vnets = { ids => $vnets_cfg->{ids} };
101 my $zones = { ids => $zones_cfg->{ids} };
102 my $controllers = { ids => $controllers_cfg->{ids} };
103 my $subnets = { ids => $subnets_cfg->{ids} };
104
105 $cfg = { version => $version, vnets => $vnets, zones => $zones, controllers => $controllers, subnets => $subnets };
106
107 cfs_write_file($running_cfg, $cfg);
f9bc9640
AD
108}
109
110sub lock_sdn_config {
111 my ($code, $errmsg) = @_;
112
5d3e0248 113 cfs_lock_file($running_cfg, undef, $code);
f9bc9640
AD
114
115 if (my $err = $@) {
116 $errmsg ? die "$errmsg: $err" : die $err;
117 }
118}
119
7129a3ca
AD
120sub get_local_vnets {
121
122 my $rpcenv = PVE::RPCEnvironment::get();
123
124 my $authuser = $rpcenv->get_user();
125
126 my $nodename = PVE::INotify::nodename();
127
5d3e0248
AD
128 my $cfg = PVE::Network::SDN::config();
129 my $vnets_cfg = $cfg->{vnets};
130 my $zones_cfg = $cfg->{zones};
7129a3ca
AD
131
132 my @vnetids = PVE::Network::SDN::Vnets::sdn_vnets_ids($vnets_cfg);
133
134 my $vnets = {};
135
136 foreach my $vnetid (@vnetids) {
137
138 my $vnet = PVE::Network::SDN::Vnets::sdn_vnets_config($vnets_cfg, $vnetid);
139 my $zoneid = $vnet->{zone};
140 my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
141
142 next if !$zoneid;
143 next if !$rpcenv->check_any($authuser, "/sdn/zones/$zoneid", $privs, 1);
144
145 my $zone_config = PVE::Network::SDN::Zones::sdn_zones_config($zones_cfg, $zoneid);
146
147 next if defined($zone_config->{nodes}) && !$zone_config->{nodes}->{$nodename};
148 $vnets->{$vnetid} = { type => 'vnet', active => '1' };
149 }
150
151 return $vnets;
152}
153
22b24447
TL
154sub generate_zone_config {
155 my $raw_config = PVE::Network::SDN::Zones::generate_etc_network_config();
156 PVE::Network::SDN::Zones::write_etc_network_config($raw_config);
157}
158
159sub generate_controller_config {
160 my ($reload) = @_;
161
162 my $raw_config = PVE::Network::SDN::Controllers::generate_controller_config();
163 PVE::Network::SDN::Controllers::write_controller_config($raw_config);
164
165 PVE::Network::SDN::Controllers::reload_controller() if $reload;
166}
167
e424c7ac 1681;
80348b2d 169