]> git.proxmox.com Git - pve-network.git/blame - PVE/Network/SDN/Vnets.pm
api: generate 'running-config' state instead of version increase on apply
[pve-network.git] / PVE / Network / SDN / Vnets.pm
CommitLineData
f5eabba0
AD
1package PVE::Network::SDN::Vnets;
2
3use strict;
4use warnings;
5
6use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file);
70b03506
AD
7use Net::IP;
8use PVE::Network::SDN::Subnets;
f5eabba0 9
f5eabba0
AD
10use PVE::Network::SDN::VnetPlugin;
11PVE::Network::SDN::VnetPlugin->register();
12PVE::Network::SDN::VnetPlugin->init();
13
14sub sdn_vnets_config {
15 my ($cfg, $id, $noerr) = @_;
16
17 die "no sdn vnet ID specified\n" if !$id;
18
19 my $scfg = $cfg->{ids}->{$id};
b2d83056 20 die "sdn vnet '$id' does not exist\n" if (!$noerr && !$scfg);
f5eabba0
AD
21
22 return $scfg;
23}
24
25sub config {
dfe17b64 26 return cfs_read_file("sdn/vnets.cfg");
f5eabba0
AD
27}
28
29sub write_config {
30 my ($cfg) = @_;
31
f703d2ae 32 cfs_write_file("sdn/vnets.cfg", $cfg);
f5eabba0
AD
33}
34
f5eabba0
AD
35sub sdn_vnets_ids {
36 my ($cfg) = @_;
37
38 return keys %{$cfg->{ids}};
39}
40
41sub complete_sdn_vnet {
42 my ($cmdname, $pname, $cvalue) = @_;
43
44 my $cfg = PVE::Network::SDN::Vnets::config();
45
46 return $cmdname eq 'add' ? [] : [ PVE::Network::SDN::Vnets::sdn_vnet_ids($cfg) ];
47}
48
eb1549e7 49sub get_vnet {
5d3e0248
AD
50 my ($vnetid, $running) = @_;
51
52 my $cfg = {};
53 if($running) {
54 my $cfg = PVE::Network::SDN::config();
55 $cfg = $cfg->{vnets};
56 } else {
57 $cfg = PVE::Network::SDN::Vnets::config();
58 }
eb1549e7 59
eb1549e7 60 my $vnet = PVE::Network::SDN::Vnets::sdn_vnets_config($cfg, $vnetid, 1);
5d3e0248 61
eb1549e7
AD
62 return $vnet;
63}
64
e612faf6
AD
65sub get_subnets {
66 my ($vnetid) = @_;
67
68 my $subnets = {};
69 my $subnets_cfg = PVE::Network::SDN::Subnets::config();
70 foreach my $subnetid (sort keys %{$subnets_cfg->{ids}}) {
71 my $subnet = $subnets_cfg->{ids}->{$subnetid};
72 next if !$subnet->{vnet} || $subnet->{vnet} ne $vnetid;
73 $subnets->{$subnetid} = $subnet;
74 }
75 return $subnets;
76
77}
78
70b03506 79sub get_next_free_ip {
e612faf6 80 my ($vnetid, $hostname, $ipversion) = @_;
70b03506
AD
81
82 $ipversion = 4 if !$ipversion;
5d3e0248 83 my $subnets = PVE::Network::SDN::Vnets::get_subnets($vnetid, 1);
70b03506 84 my $ip = undef;
70b03506 85 my $subnetcount = 0;
e612faf6
AD
86
87 foreach my $subnetid (sort keys %{$subnets}) {
88 my $subnet = $subnets->{$subnetid};
70b03506 89 my ($network, $mask) = split(/-/, $subnetid);
e612faf6 90
70b03506
AD
91 next if $ipversion != Net::IP::ip_get_version($network);
92 $subnetcount++;
e612faf6 93 if ($subnet->{ipam}) {
70b03506 94 eval {
ee4f339e 95 $ip = PVE::Network::SDN::Subnets::next_free_ip($subnetid, $subnet, $hostname);
70b03506
AD
96 };
97 warn $@ if $@;
98 }
99 last if $ip;
100 }
101 die "can't find any free ip" if !$ip && $subnetcount > 0;
102
103 return $ip;
104}
105
106sub add_ip {
e612faf6
AD
107 my ($vnetid, $cidr, $hostname) = @_;
108
5d3e0248 109 my $subnets = PVE::Network::SDN::Vnets::get_subnets($vnetid, 1);
70b03506
AD
110
111 my ($ip, $mask) = split(/\//, $cidr);
e612faf6 112 my ($subnetid, $subnet) = PVE::Network::SDN::Subnets::find_ip_subnet($ip, $subnets);
70b03506 113
ee4f339e 114 PVE::Network::SDN::Subnets::add_ip($subnetid, $subnet, $ip, $hostname);
70b03506
AD
115}
116
117sub del_ip {
e612faf6
AD
118 my ($vnetid, $cidr, $hostname) = @_;
119
5d3e0248 120 my $subnets = PVE::Network::SDN::Vnets::get_subnets($vnetid, 1);
70b03506
AD
121
122 my ($ip, $mask) = split(/\//, $cidr);
e612faf6 123 my ($subnetid, $subnet) = PVE::Network::SDN::Subnets::find_ip_subnet($ip, $subnets);
70b03506 124
ee4f339e 125 PVE::Network::SDN::Subnets::del_ip($subnetid, $subnet, $ip, $hostname);
70b03506
AD
126}
127
f5eabba0 1281;