]>
git.proxmox.com Git - pve-network.git/blob - PVE/Network/SDN/Ipams/PVEPlugin.pm
0779b53c1408b1cc9fb55bad7665b6e5fa983ea4
1 package PVE
::Network
::SDN
::Ipams
::PVEPlugin
;
6 use PVE
::Cluster
qw(cfs_read_file cfs_write_file cfs_register_file cfs_lock_file);
13 use base
('PVE::Network::SDN::Ipams::Plugin');
16 my $ipamdb_file = "priv/ipam.db";
18 PVE
::Cluster
::cfs_register_file
($ipamdb_file,
19 sub { PVE
::Network
::SDN
::Ipams
::PVEPlugin-
>parse_config(@_); },
20 sub { PVE
::Network
::SDN
::Ipams
::PVEPlugin-
>write_config(@_); });
32 # Plugin implementation
35 my ($class, $plugin_config, $subnetid, $subnet) = @_;
37 my $cidr = $subnet->{cidr
};
38 my $zone = $subnet->{zone
};
39 my $gateway = $subnet->{gateway
};
42 cfs_lock_file
($ipamdb_file, undef, sub {
46 $db->{zones
}->{$zone} = {} if !$db->{zones
}->{$zone};
47 my $zonedb = $db->{zones
}->{$zone};
49 if(!$zonedb->{subnets
}->{$cidr}) {
51 $zonedb->{subnets
}->{$cidr}->{ips
} = {};
59 my ($class, $plugin_config, $subnetid, $subnet) = @_;
61 my $cidr = $subnet->{cidr
};
62 my $zone = $subnet->{zone
};
64 cfs_lock_file
($ipamdb_file, undef, sub {
68 my $dbzone = $db->{zones
}->{$zone};
69 die "zone '$zone' doesn't exist in IPAM DB\n" if !$dbzone;
70 my $dbsubnet = $dbzone->{subnets
}->{$cidr};
71 die "subnet '$cidr' doesn't exist in IPAM DB\n" if !$dbsubnet;
73 die "cannot delete subnet '$cidr', not empty\n" if keys %{$dbsubnet->{ips
}} > 0;
75 delete $dbzone->{subnets
}->{$cidr};
84 my ($class, $plugin_config, $subnetid, $subnet, $ip, $is_gateway) = @_;
86 my $cidr = $subnet->{cidr
};
87 my $zone = $subnet->{zone
};
89 cfs_lock_file
($ipamdb_file, undef, sub {
93 my $dbzone = $db->{zones
}->{$zone};
94 die "zone '$zone' doesn't exist in IPAM DB\n" if !$dbzone;
95 my $dbsubnet = $dbzone->{subnets
}->{$cidr};
96 die "subnet '$cidr' doesn't exist in IPAM DB\n" if !$dbsubnet;
98 die "IP '$ip' already exist\n" if defined($dbsubnet->{ips
}->{$ip});
100 $dbsubnet->{ips
}->{$ip} = 1;
107 sub add_next_freeip
{
108 my ($class, $plugin_config, $subnetid, $subnet) = @_;
110 my $cidr = $subnet->{cidr
};
111 my $network = $subnet->{network
};
112 my $zone = $subnet->{zone
};
113 my $mask = $subnet->{mask
};
116 cfs_lock_file
($ipamdb_file, undef, sub {
119 my $dbzone = $db->{zones
}->{$zone};
120 die "zone '$zone' doesn't exist in IPAM DB\n" if !$dbzone;
121 my $dbsubnet = $dbzone->{subnets
}->{$cidr};
122 die "subnet '$cidr' doesn't exist in IPAM DB" if !$dbsubnet;
124 if (Net
::IP
::ip_is_ipv4
($network) && $mask == 32) {
125 die "cannot find free IP in subnet '$cidr'\n" if defined($dbsubnet->{ips
}->{$network});
128 my $iplist = new NetAddr
::IP
($cidr);
129 my $broadcast = $iplist->broadcast();
133 last if $iplist eq $broadcast;
134 my $ip = $iplist->addr();
135 next if defined($dbsubnet->{ips
}->{$ip});
141 die "can't find free ip in subnet '$cidr'\n" if !$freeip;
143 $dbsubnet->{ips
}->{$freeip} = 1;
148 return "$freeip/$mask";
152 my ($class, $plugin_config, $subnetid, $subnet, $ip) = @_;
154 my $cidr = $subnet->{cidr
};
155 my $zone = $subnet->{zone
};
157 cfs_lock_file
($ipamdb_file, undef, sub {
160 die "zone $zone don't exist in ipam db" if !$db->{zones
}->{$zone};
161 my $dbzone = $db->{zones
}->{$zone};
162 die "subnet $cidr don't exist in ipam db" if !$dbzone->{subnets
}->{$cidr};
163 my $dbsubnet = $dbzone->{subnets
}->{$cidr};
165 die "IP '$ip' does not exist in IPAM DB\n" if !defined($dbsubnet->{ips
}->{$ip});
166 delete $dbsubnet->{ips
}->{$ip};
176 my $db = cfs_read_file
($ipamdb_file);
183 my $json = to_json
($cfg);
184 cfs_write_file
($ipamdb_file, $json);
188 my ($class, $filename, $cfg) = @_;
194 my ($class, $filename, $raw) = @_;
196 $raw = '{}' if !defined($raw) ||$raw eq '';
197 my $cfg = from_json
($raw);