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);
29 return cfs_read_file
("sdn/vnets.cfg");
35 cfs_write_file
("sdn/vnets.cfg", $cfg);
41 return sort keys %{$cfg->{ids
}};
44 sub complete_sdn_vnet
{
45 my ($cmdname, $pname, $cvalue) = @_;
47 my $cfg = PVE
::Network
::SDN
::Vnets
::config
();
49 return $cmdname eq 'add' ?
[] : [ PVE
::Network
::SDN
::Vnets
::sdn_vnet_ids
($cfg) ];
53 my ($vnetid, $running) = @_;
59 my $cfg = PVE
::Network
::SDN
::running_config
();
62 $cfg = PVE
::Network
::SDN
::Vnets
::config
();
65 my $vnet = PVE
::Network
::SDN
::Vnets
::sdn_vnets_config
($cfg, $vnetid, 1);
76 my $subnets_cfg = PVE
::Network
::SDN
::Subnets
::config
();
77 foreach my $subnetid (sort keys %{$subnets_cfg->{ids
}}) {
78 my $subnet = PVE
::Network
::SDN
::Subnets
::sdn_subnets_config
($subnets_cfg, $subnetid);
79 next if !$subnet->{vnet
} || $subnet->{vnet
} ne $vnetid;
80 $subnets->{$subnetid} = $subnet;
86 sub get_subnet_from_vnet_cidr
{
87 my ($vnetid, $cidr) = @_;
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);
94 my ($ip, $mask) = split(/\//, $cidr);
95 die "ip address is not in cidr format" if !$mask;
97 my ($subnetid, $subnet) = PVE
::Network
::SDN
::Subnets
::find_ip_subnet
($ip, $mask, $subnets);
99 return ($zone, $subnetid, $subnet, $ip);
102 sub get_next_free_cidr
{
103 my ($vnetid, $hostname, $mac, $description, $ipversion) = @_;
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);
109 return if !$zone->{ipam
};
111 $ipversion = 4 if !$ipversion;
112 my $subnets = PVE
::Network
::SDN
::Vnets
::get_subnets
($vnetid, 1);
116 foreach my $subnetid (sort keys %{$subnets}) {
117 my $subnet = $subnets->{$subnetid};
118 my $network = $subnet->{network
};
120 next if $ipversion != Net
::IP
::ip_get_version
($network);
124 $ip = PVE
::Network
::SDN
::Subnets
::next_free_ip
($zone, $subnetid, $subnet, $hostname, $mac, $description);
129 die "can't find any free ip" if !$ip && $subnetcount > 0;
135 my ($vnetid, $cidr, $hostname, $mac, $description) = @_;
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);
144 my ($vnetid, $cidr, $hostname, $oldhostname, $mac, $description) = @_;
148 my ($zone, $subnetid, $subnet, $ip) = PVE
::Network
::SDN
::Vnets
::get_subnet_from_vnet_cidr
($vnetid, $cidr);
149 PVE
::Network
::SDN
::Subnets
::update_ip
($zone, $subnetid, $subnet, $ip, $hostname, $oldhostname, $mac, $description);
153 my ($vnetid, $cidr, $hostname) = @_;
157 my ($zone, $subnetid, $subnet, $ip) = PVE
::Network
::SDN
::Vnets
::get_subnet_from_vnet_cidr
($vnetid, $cidr);
158 PVE
::Network
::SDN
::Subnets
::del_ip
($zone, $subnetid, $subnet, $ip, $hostname);