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