]>
git.proxmox.com Git - pve-network.git/blob - src/PVE/Network/SDN/Vnets.pm
1 package PVE
::Network
::SDN
::Vnets
;
8 use PVE
::Cluster
qw(cfs_read_file cfs_write_file cfs_lock_file);
10 use PVE
::Network
::SDN
::Subnets
;
11 use PVE
::Network
::SDN
::Zones
;
13 use PVE
::Network
::SDN
::VnetPlugin
;
14 PVE
::Network
::SDN
::VnetPlugin-
>register();
15 PVE
::Network
::SDN
::VnetPlugin-
>init();
17 sub sdn_vnets_config
{
18 my ($cfg, $id, $noerr) = @_;
20 die "no sdn vnet ID specified\n" if !$id;
22 my $scfg = $cfg->{ids
}->{$id};
23 die "sdn vnet '$id' does not exist\n" if (!$noerr && !$scfg);
32 my $cfg = PVE
::Network
::SDN
::running_config
();
36 return cfs_read_file
("sdn/vnets.cfg");
42 cfs_write_file
("sdn/vnets.cfg", $cfg);
48 return sort keys %{$cfg->{ids
}};
51 sub complete_sdn_vnet
{
52 my ($cmdname, $pname, $cvalue) = @_;
54 my $cfg = PVE
::Network
::SDN
::Vnets
::config
();
56 return $cmdname eq 'add' ?
[] : [ PVE
::Network
::SDN
::Vnets
::sdn_vnet_ids
($cfg) ];
60 my ($vnetid, $running) = @_;
64 my $cfg = PVE
::Network
::SDN
::Vnets
::config
($running);
65 return PVE
::Network
::SDN
::Vnets
::sdn_vnets_config
($cfg, $vnetid, 1);
69 my ($vnetid, $running) = @_;
72 my $subnets_cfg = PVE
::Network
::SDN
::Subnets
::config
($running);
74 foreach my $subnetid (sort keys %{$subnets_cfg->{ids
}}) {
75 my $subnet = PVE
::Network
::SDN
::Subnets
::sdn_subnets_config
($subnets_cfg, $subnetid);
76 next if !$subnet->{vnet
} || ($vnetid && $subnet->{vnet
} ne $vnetid);
77 $subnets->{$subnetid} = $subnet;
83 sub get_subnet_from_vnet_ip
{
84 my ($vnetid, $ip) = @_;
86 my $subnets = PVE
::Network
::SDN
::Vnets
::get_subnets
($vnetid, 1);
87 my $vnet = PVE
::Network
::SDN
::Vnets
::get_vnet
($vnetid);
88 my $zoneid = $vnet->{zone
};
89 my $zone = PVE
::Network
::SDN
::Zones
::get_zone
($zoneid);
91 my ($subnetid, $subnet) = PVE
::Network
::SDN
::Subnets
::find_ip_subnet
($ip, $subnets);
93 return ($zone, $subnetid, $subnet, $ip);
96 sub add_next_free_cidr
{
97 my ($vnetid, $hostname, $mac, $vmid, $skipdns, $dhcprange) = @_;
99 my $vnet = PVE
::Network
::SDN
::Vnets
::get_vnet
($vnetid);
102 my $zoneid = $vnet->{zone
};
103 my $zone = PVE
::Network
::SDN
::Zones
::get_zone
($zoneid);
105 return if !$zone->{ipam
} || !$zone->{dhcp
};
107 my $subnets = PVE
::Network
::SDN
::Vnets
::get_subnets
($vnetid, 1);
111 my @ipversions = qw
/ 4 6 /;
112 for my $ipversion (@ipversions) {
115 foreach my $subnetid (sort keys %{$subnets}) {
116 my $subnet = $subnets->{$subnetid};
117 my $network = $subnet->{network
};
119 next if Net
::IP
::ip_get_version
($network) != $ipversion || $ips->{$ipversion};
123 $ip = PVE
::Network
::SDN
::Subnets
::add_next_free_ip
($zone, $subnetid, $subnet, $hostname, $mac, $vmid, $skipdns, $dhcprange);
128 $ips->{$ipversion} = $ip;
132 die "can't find any free ip" if !$ip && $subnetcount > 0;
137 my ($vnetid, $ip, $hostname, $mac, $vmid, $skipdns) = @_;
141 my ($zone, $subnetid, $subnet) = PVE
::Network
::SDN
::Vnets
::get_subnet_from_vnet_ip
($vnetid, $ip);
142 PVE
::Network
::SDN
::Subnets
::add_ip
($zone, $subnetid, $subnet, $ip, $hostname, $mac, $vmid, undef, $skipdns);
146 my ($vnetid, $ip, $hostname, $oldhostname, $mac, $vmid, $skipdns) = @_;
150 my ($zone, $subnetid, $subnet) = PVE
::Network
::SDN
::Vnets
::get_subnet_from_vnet_ip
($vnetid, $ip);
151 PVE
::Network
::SDN
::Subnets
::update_ip
($zone, $subnetid, $subnet, $ip, $hostname, $oldhostname, $mac, $vmid, $skipdns);
155 my ($vnetid, $ip, $hostname, $mac, $skipdns) = @_;
159 my ($zone, $subnetid, $subnet) = PVE
::Network
::SDN
::Vnets
::get_subnet_from_vnet_ip
($vnetid, $ip);
160 PVE
::Network
::SDN
::Subnets
::del_ip
($zone, $subnetid, $subnet, $ip, $hostname, $mac, $skipdns);
163 sub get_ips_from_mac
{
164 my ($vnetid, $mac) = @_;
166 my $vnet = PVE
::Network
::SDN
::Vnets
::get_vnet
($vnetid);
169 my $zoneid = $vnet->{zone
};
170 my $zone = PVE
::Network
::SDN
::Zones
::get_zone
($zoneid);
172 return if !$zone->{ipam
} || !$zone->{dhcp
};
174 return PVE
::Network
::SDN
::Ipams
::get_ips_from_mac
($mac, $zoneid, $zone);
177 sub del_ips_from_mac
{
178 my ($vnetid, $mac, $hostname) = @_;
180 my ($ip4, $ip6) = PVE
::Network
::SDN
::Vnets
::get_ips_from_mac
($vnetid, $mac);
181 PVE
::Network
::SDN
::Vnets
::del_ip
($vnetid, $ip4, $hostname, $mac) if $ip4;
182 PVE
::Network
::SDN
::Vnets
::del_ip
($vnetid, $ip6, $hostname, $mac) if $ip6;