]> git.proxmox.com Git - pve-network.git/blame - PVE/Network/SDN/Vnets.pm
vnets: subroutines: return if !$vnetid
[pve-network.git] / PVE / Network / SDN / Vnets.pm
CommitLineData
f5eabba0
AD
1package PVE::Network::SDN::Vnets;
2
3use strict;
4use warnings;
5
70b03506 6use Net::IP;
d1ab9bdb
TL
7
8use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file);
d101e5ed 9use PVE::Network::SDN;
70b03506 10use PVE::Network::SDN::Subnets;
4ad78442 11use PVE::Network::SDN::Zones;
f5eabba0 12
f5eabba0
AD
13use PVE::Network::SDN::VnetPlugin;
14PVE::Network::SDN::VnetPlugin->register();
15PVE::Network::SDN::VnetPlugin->init();
16
17sub sdn_vnets_config {
18 my ($cfg, $id, $noerr) = @_;
19
20 die "no sdn vnet ID specified\n" if !$id;
21
22 my $scfg = $cfg->{ids}->{$id};
b2d83056 23 die "sdn vnet '$id' does not exist\n" if (!$noerr && !$scfg);
f5eabba0
AD
24
25 return $scfg;
26}
27
28sub config {
dfe17b64 29 return cfs_read_file("sdn/vnets.cfg");
f5eabba0
AD
30}
31
32sub write_config {
33 my ($cfg) = @_;
34
f703d2ae 35 cfs_write_file("sdn/vnets.cfg", $cfg);
f5eabba0
AD
36}
37
f5eabba0
AD
38sub sdn_vnets_ids {
39 my ($cfg) = @_;
40
b184ebc3 41 return sort keys %{$cfg->{ids}};
f5eabba0
AD
42}
43
44sub complete_sdn_vnet {
45 my ($cmdname, $pname, $cvalue) = @_;
46
47 my $cfg = PVE::Network::SDN::Vnets::config();
48
49 return $cmdname eq 'add' ? [] : [ PVE::Network::SDN::Vnets::sdn_vnet_ids($cfg) ];
50}
51
eb1549e7 52sub get_vnet {
5d3e0248
AD
53 my ($vnetid, $running) = @_;
54
9f1e7934
AD
55 return if !$vnetid;
56
5d3e0248
AD
57 my $cfg = {};
58 if($running) {
d73c7c36 59 my $cfg = PVE::Network::SDN::running_config();
5d3e0248
AD
60 $cfg = $cfg->{vnets};
61 } else {
62 $cfg = PVE::Network::SDN::Vnets::config();
63 }
eb1549e7 64
eb1549e7 65 my $vnet = PVE::Network::SDN::Vnets::sdn_vnets_config($cfg, $vnetid, 1);
5d3e0248 66
eb1549e7
AD
67 return $vnet;
68}
69
e612faf6
AD
70sub get_subnets {
71 my ($vnetid) = @_;
72
9f1e7934
AD
73 return if !$vnetid;
74
e8736dac 75 my $subnets = undef;
e612faf6
AD
76 my $subnets_cfg = PVE::Network::SDN::Subnets::config();
77 foreach my $subnetid (sort keys %{$subnets_cfg->{ids}}) {
e8736dac 78 my $subnet = PVE::Network::SDN::Subnets::sdn_subnets_config($subnets_cfg, $subnetid);
e612faf6
AD
79 next if !$subnet->{vnet} || $subnet->{vnet} ne $vnetid;
80 $subnets->{$subnetid} = $subnet;
81 }
82 return $subnets;
83
84}
85
dd54b5a3
AD
86sub get_subnet_from_vnet_cidr {
87 my ($vnetid, $cidr) = @_;
88
89 my $subnets = PVE::Network::SDN::Vnets::get_subnets($vnetid, 1);
90 my $vnet = PVE::Network::SDN::Vnets::get_vnet($vnetid);
91 my $zoneid = $vnet->{zone};
92 my $zone = PVE::Network::SDN::Zones::get_zone($zoneid);
93
94 my ($ip, $mask) = split(/\//, $cidr);
95 die "ip address is not in cidr format" if !$mask;
96
97 my ($subnetid, $subnet) = PVE::Network::SDN::Subnets::find_ip_subnet($ip, $mask, $subnets);
98
99 return ($zone, $subnetid, $subnet, $ip);
100}
101
e8736dac 102sub get_next_free_cidr {
e9365ab0 103 my ($vnetid, $hostname, $mac, $description, $ipversion) = @_;
70b03506 104
4ad78442
AD
105 my $vnet = PVE::Network::SDN::Vnets::get_vnet($vnetid);
106 my $zoneid = $vnet->{zone};
107 my $zone = PVE::Network::SDN::Zones::get_zone($zoneid);
108
3c0fc96d
AD
109 return if !$zone->{ipam};
110
70b03506 111 $ipversion = 4 if !$ipversion;
5d3e0248 112 my $subnets = PVE::Network::SDN::Vnets::get_subnets($vnetid, 1);
70b03506 113 my $ip = undef;
70b03506 114 my $subnetcount = 0;
e612faf6
AD
115
116 foreach my $subnetid (sort keys %{$subnets}) {
117 my $subnet = $subnets->{$subnetid};
e8736dac 118 my $network = $subnet->{network};
e612faf6 119
70b03506
AD
120 next if $ipversion != Net::IP::ip_get_version($network);
121 $subnetcount++;
3c0fc96d
AD
122
123 eval {
124 $ip = PVE::Network::SDN::Subnets::next_free_ip($zone, $subnetid, $subnet, $hostname, $mac, $description);
125 };
126 warn $@ if $@;
70b03506
AD
127 last if $ip;
128 }
129 die "can't find any free ip" if !$ip && $subnetcount > 0;
130
131 return $ip;
132}
133
e8736dac 134sub add_cidr {
e9365ab0 135 my ($vnetid, $cidr, $hostname, $mac, $description) = @_;
e612faf6 136
9f1e7934
AD
137 return if !$vnetid;
138
dd54b5a3
AD
139 my ($zone, $subnetid, $subnet, $ip) = PVE::Network::SDN::Vnets::get_subnet_from_vnet_cidr($vnetid, $cidr);
140 PVE::Network::SDN::Subnets::add_ip($zone, $subnetid, $subnet, $ip, $hostname, $mac, $description);
141}
70b03506 142
dd54b5a3 143sub update_cidr {
0d2396b0 144 my ($vnetid, $cidr, $hostname, $oldhostname, $mac, $description) = @_;
70b03506 145
9f1e7934
AD
146 return if !$vnetid;
147
dd54b5a3 148 my ($zone, $subnetid, $subnet, $ip) = PVE::Network::SDN::Vnets::get_subnet_from_vnet_cidr($vnetid, $cidr);
0d2396b0 149 PVE::Network::SDN::Subnets::update_ip($zone, $subnetid, $subnet, $ip, $hostname, $oldhostname, $mac, $description);
70b03506
AD
150}
151
e8736dac 152sub del_cidr {
e612faf6
AD
153 my ($vnetid, $cidr, $hostname) = @_;
154
9f1e7934
AD
155 return if !$vnetid;
156
dd54b5a3 157 my ($zone, $subnetid, $subnet, $ip) = PVE::Network::SDN::Vnets::get_subnet_from_vnet_cidr($vnetid, $cidr);
4ad78442 158 PVE::Network::SDN::Subnets::del_ip($zone, $subnetid, $subnet, $ip, $hostname);
70b03506
AD
159}
160
dd54b5a3
AD
161
162
f5eabba0 1631;