]> git.proxmox.com Git - pve-network.git/blame - PVE/Network/SDN/Vnets.pm
add DNS plugin
[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
AD
49sub get_vnet {
50 my ($vnetid) = @_;
51
52 my $cfg = PVE::Network::SDN::Vnets::config();
53 my $vnet = PVE::Network::SDN::Vnets::sdn_vnets_config($cfg, $vnetid, 1);
54 return $vnet;
55}
56
70b03506 57sub get_next_free_ip {
ee4f339e 58 my ($vnet, $hostname, $ipversion) = @_;
70b03506
AD
59
60 $ipversion = 4 if !$ipversion;
61 my $subnets_cfg = PVE::Network::SDN::Subnets::config();
62 my @subnets = PVE::Tools::split_list($vnet->{subnets}) if $vnet->{subnets};
63 my $ip = undef;
64 my $subnet = undef;
65 my $subnetcount = 0;
66 foreach my $s (@subnets) {
67 my $subnetid = $s =~ s/\//-/r;
68 my ($network, $mask) = split(/-/, $subnetid);
69 next if $ipversion != Net::IP::ip_get_version($network);
70 $subnetcount++;
71 $subnet = $subnets_cfg->{ids}->{$subnetid};
72 if ($subnet && $subnet->{ipam}) {
73 eval {
ee4f339e 74 $ip = PVE::Network::SDN::Subnets::next_free_ip($subnetid, $subnet, $hostname);
70b03506
AD
75 };
76 warn $@ if $@;
77 }
78 last if $ip;
79 }
80 die "can't find any free ip" if !$ip && $subnetcount > 0;
81
82 return $ip;
83}
84
85sub add_ip {
ee4f339e 86 my ($vnet, $cidr, $hostname) = @_;
70b03506
AD
87
88 my ($ip, $mask) = split(/\//, $cidr);
89 my ($subnetid, $subnet) = PVE::Network::SDN::Subnets::find_ip_subnet($ip, $vnet->{subnets});
90 return if !$subnet->{ipam};
91
ee4f339e 92 PVE::Network::SDN::Subnets::add_ip($subnetid, $subnet, $ip, $hostname);
70b03506
AD
93}
94
95sub del_ip {
ee4f339e 96 my ($vnet, $cidr, $hostname) = @_;
70b03506
AD
97
98 my ($ip, $mask) = split(/\//, $cidr);
99 my ($subnetid, $subnet) = PVE::Network::SDN::Subnets::find_ip_subnet($ip, $vnet->{subnets});
100 return if !$subnet->{ipam};
101
ee4f339e 102 PVE::Network::SDN::Subnets::del_ip($subnetid, $subnet, $ip, $hostname);
70b03506
AD
103}
104
f5eabba0 1051;