]>
git.proxmox.com Git - pve-network.git/blob - src/PVE/Network/SDN/Ipams/NetboxPlugin.pm
1 package PVE
::Network
::SDN
::Ipams
::NetboxPlugin
;
9 use base
('PVE::Network::SDN::Ipams::Plugin');
23 url
=> { optional
=> 0},
24 token
=> { optional
=> 0 },
28 # Plugin implementation
31 my ($class, $plugin_config, $subnetid, $subnet, $noerr) = @_;
33 my $cidr = $subnet->{cidr
};
34 my $gateway = $subnet->{gateway
};
35 my $url = $plugin_config->{url
};
36 my $token = $plugin_config->{token
};
37 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Authorization' => "token $token"];
39 my $internalid = get_prefix_id
($url, $cidr, $headers);
44 my $params = { prefix
=> $cidr };
47 my $result = PVE
::Network
::SDN
::api_request
("POST", "$url/ipam/prefixes/", $headers, $params);
50 die "error add subnet to ipam: $@" if !$noerr;
57 my ($class, $plugin_config, $subnetid, $subnet, $noerr) = @_;
59 my $cidr = $subnet->{cidr
};
60 my $url = $plugin_config->{url
};
61 my $token = $plugin_config->{token
};
62 my $gateway = $subnet->{gateway
};
63 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Authorization' => "token $token"];
65 my $internalid = get_prefix_id
($url, $cidr, $headers);
66 return if !$internalid;
68 return; #fixme: check that prefix is empty exluding gateway, before delete
71 PVE
::Network
::SDN
::api_request
("DELETE", "$url/ipam/prefixes/$internalid/", $headers);
74 die "error deleting subnet from ipam: $@" if !$noerr;
80 my ($class, $plugin_config, $subnetid, $subnet, $ip, $hostname, $mac, $vmid, $is_gateway, $noerr) = @_;
82 my $mask = $subnet->{mask
};
83 my $url = $plugin_config->{url
};
84 my $token = $plugin_config->{token
};
85 my $section = $plugin_config->{section
};
86 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Authorization' => "token $token"];
88 my $description = undef;
90 $description = 'gateway'
92 $description = "mac:$mac";
95 my $params = { address
=> "$ip/$mask", dns_name
=> $hostname, description
=> $description };
98 PVE
::Network
::SDN
::api_request
("POST", "$url/ipam/ip-addresses/", $headers, $params);
103 die "error add subnet ip to ipam: ip $ip already exist: $@" if !is_ip_gateway
($url, $ip, $headers) && !$noerr;
105 die "error add subnet ip to ipam: ip already exist: $@" if !$noerr;
111 my ($class, $plugin_config, $subnetid, $subnet, $ip, $hostname, $mac, $vmid, $is_gateway, $noerr) = @_;
113 my $mask = $subnet->{mask
};
114 my $url = $plugin_config->{url
};
115 my $token = $plugin_config->{token
};
116 my $section = $plugin_config->{section
};
117 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Authorization' => "token $token"];
119 my $description = undef;
121 $description = 'gateway'
123 $description = "mac:$mac";
126 my $params = { address
=> "$ip/$mask", dns_name
=> $hostname, description
=> $description };
128 my $ip_id = get_ip_id
($url, $ip, $headers);
129 die "can't find ip $ip in ipam" if !$ip_id;
132 PVE
::Network
::SDN
::api_request
("PATCH", "$url/ipam/ip-addresses/$ip_id/", $headers, $params);
135 die "error update ip $ip : $@" if !$noerr;
139 sub add_next_freeip
{
140 my ($class, $plugin_config, $subnetid, $subnet, $hostname, $mac, $vmid, $noerr) = @_;
142 my $cidr = $subnet->{cidr
};
144 my $url = $plugin_config->{url
};
145 my $token = $plugin_config->{token
};
146 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Authorization' => "token $token"];
148 my $internalid = get_prefix_id
($url, $cidr, $headers);
150 my $description = "mac:$mac" if $mac;
152 my $params = { dns_name
=> $hostname, description
=> $description };
156 my $result = PVE
::Network
::SDN
::api_request
("POST", "$url/ipam/prefixes/$internalid/available-ips/", $headers, $params);
157 $ip = $result->{address
};
161 die "can't find free ip in subnet $cidr: $@" if !$noerr;
167 sub add_range_next_freeip
{
168 my ($class, $plugin_config, $subnet, $range, $data, $noerr) = @_;
170 my $url = $plugin_config->{url
};
171 my $token = $plugin_config->{token
};
172 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Authorization' => "token $token"];
174 my $internalid = get_iprange_id
($url, $range, $headers);
175 my $description = "mac:$data->{mac}" if $data->{mac
};
177 my $params = { dns_name
=> $data->{hostname
}, description
=> $description };
181 my $result = PVE
::Network
::SDN
::api_request
("POST", "$url/ipam/ip-ranges/$internalid/available-ips/", $headers, $params);
182 $ip = $result->{address
};
183 print "found ip free $ip in range $range->{'start-address'}-$range->{'end-address'}\n" if $ip;
187 die "can't find free ip in range $range->{'start-address'}-$range->{'end-address'}: $@" if !$noerr;
195 my ($class, $plugin_config, $subnetid, $subnet, $ip, $noerr) = @_;
199 my $url = $plugin_config->{url
};
200 my $token = $plugin_config->{token
};
201 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Authorization' => "token $token"];
203 my $ip_id = get_ip_id
($url, $ip, $headers);
204 die "can't find ip $ip in ipam" if !$ip_id;
207 PVE
::Network
::SDN
::api_request
("DELETE", "$url/ipam/ip-addresses/$ip_id/", $headers);
210 die "error delete ip $ip : $@" if !$noerr;
214 sub get_ips_from_mac
{
215 my ($class, $plugin_config, $mac, $zoneid) = @_;
217 my $url = $plugin_config->{url
};
218 my $token = $plugin_config->{token
};
219 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Authorization' => "token $token"];
224 my $data = PVE
::Network
::SDN
::api_request
("GET", "$url/ipam/ip-addresses/?description__ic=$mac", $headers);
225 for my $ip (@{$data->{results
}}) {
226 if ($ip->{family
}->{value
} == 4 && !$ip4) {
227 ($ip4, undef) = split(/\//, $ip->{address
});
230 if ($ip->{family
}->{value
} == 6 && !$ip6) {
231 ($ip6, undef) = split(/\//, $ip->{address
});
240 my ($class, $plugin_config) = @_;
242 my $url = $plugin_config->{url
};
243 my $token = $plugin_config->{token
};
244 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Authorization' => "token $token"];
248 PVE
::Network
::SDN
::api_request
("GET", "$url/ipam/aggregates/", $headers);
251 die "Can't connect to netbox api: $@";
256 my ($class, $plugin_config) = @_;
258 PVE
::Network
::SDN
::Ipams
::NetboxPlugin
::verify_api
($class, $plugin_config);
264 my ($url, $cidr, $headers) = @_;
266 my $result = PVE
::Network
::SDN
::api_request
("GET", "$url/ipam/prefixes/?q=$cidr", $headers);
267 my $data = @{$result->{results
}}[0];
268 my $internalid = $data->{id
};
273 my ($url, $range, $headers) = @_;
275 my $result = PVE
::Network
::SDN
::api_request
("GET", "$url/ipam/ip-ranges/?start_address=$range->{'start-address'}&end_address=$range->{'end-address'}", $headers);
276 my $data = @{$result->{results
}}[0];
277 my $internalid = $data->{id
};
282 my ($url, $ip, $headers) = @_;
283 my $result = PVE
::Network
::SDN
::api_request
("GET", "$url/ipam/ip-addresses/?q=$ip", $headers);
284 my $data = @{$result->{results
}}[0];
285 my $ip_id = $data->{id
};
290 my ($url, $ip, $headers) = @_;
291 my $result = PVE
::Network
::SDN
::api_request
("GET", "$url/addresses/search/$ip", $headers);
292 my $data = @{$result->{data
}}[0];
293 my $description = $data->{description
};
294 my $is_gateway = 1 if $description eq 'gateway';