]> git.proxmox.com Git - pve-network.git/blob - PVE/Network/SDN/Ipams/PhpIpamPlugin.pm
f89ef297b337d5f9e4ff3e0d01edc57ed00faf58
[pve-network.git] / PVE / Network / SDN / Ipams / PhpIpamPlugin.pm
1 package PVE::Network::SDN::Ipams::PhpIpamPlugin;
2
3 use strict;
4 use warnings;
5 use PVE::INotify;
6 use PVE::Cluster;
7 use PVE::Tools;
8
9 use base('PVE::Network::SDN::Ipams::Plugin');
10
11 sub type {
12 return 'phpipam';
13 }
14
15 sub properties {
16 return {
17 url => {
18 type => 'string',
19 },
20 token => {
21 type => 'string',
22 },
23 section => {
24 type => 'integer',
25 },
26 };
27 }
28
29 sub options {
30
31 return {
32 url => { optional => 0},
33 token => { optional => 0 },
34 section => { optional => 0 },
35 };
36 }
37
38 # Plugin implementation
39
40 sub add_subnet {
41 my ($class, $plugin_config, $subnetid, $subnet) = @_;
42
43 my $cidr = $subnet->{cidr};
44 my $network = $subnet->{network};
45 my $mask = $subnet->{mask};
46
47 my $gateway = $subnet->{gateway};
48 my $url = $plugin_config->{url};
49 my $token = $plugin_config->{token};
50 my $section = $plugin_config->{section};
51 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Token' => $token];
52
53 #search subnet
54 my $internalid = get_internalid($url, $cidr, $headers);
55
56 #create subnet
57 if (!$internalid) {
58
59 my $params = { subnet => $network,
60 mask => $mask,
61 sectionId => $section,
62 };
63
64 eval {
65 PVE::Network::SDN::Ipams::Plugin::api_request("POST", "$url/subnets/", $headers, $params);
66 };
67 if ($@) {
68 die "error add subnet to ipam: $@";
69 }
70 }
71
72 }
73
74 sub del_subnet {
75 my ($class, $plugin_config, $subnetid, $subnet) = @_;
76
77 my $cidr = $subnet->{cidr};
78 my $url = $plugin_config->{url};
79 my $token = $plugin_config->{token};
80 my $section = $plugin_config->{section};
81 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Token' => $token];
82
83 my $internalid = get_internalid($url, $cidr, $headers);
84 return if !$internalid;
85
86 return; #fixme: check that prefix is empty exluding gateway, before delete
87
88 eval {
89 PVE::Network::SDN::Ipams::Plugin::api_request("DELETE", "$url/subnets/$internalid", $headers);
90 };
91 if ($@) {
92 die "error deleting subnet from ipam: $@";
93 }
94
95 }
96
97 sub add_ip {
98 my ($class, $plugin_config, $subnetid, $subnet, $ip, $is_gateway) = @_;
99
100 my $cidr = $subnet->{cidr};
101 my $url = $plugin_config->{url};
102 my $token = $plugin_config->{token};
103 my $section = $plugin_config->{section};
104 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Token' => $token];
105
106 my $internalid = get_internalid($url, $cidr, $headers);
107
108 my $params = { ip => $ip,
109 subnetId => $internalid,
110 is_gateway => $is_gateway,
111 };
112
113 eval {
114 PVE::Network::SDN::Ipams::Plugin::api_request("POST", "$url/addresses/", $headers, $params);
115 };
116
117 if ($@) {
118 die "error add subnet ip to ipam: ip $ip already exist: $@";
119 }
120 }
121
122 sub add_next_freeip {
123 my ($class, $plugin_config, $subnetid, $subnet, $internalid, $hostname) = @_;
124
125 my $cidr = $subnet->{cidr};
126 my $mask = $subnet->{mask};
127 my $url = $plugin_config->{url};
128 my $token = $plugin_config->{token};
129 my $section = $plugin_config->{section};
130 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Token' => $token];
131
132 $internalid = get_internalid($url, $cidr, $headers) if !$internalid;
133
134 my $params = {};
135
136 my $ip = undef;
137 eval {
138 my $result = PVE::Network::SDN::Ipams::Plugin::api_request("POST", "$url/addresses/first_free/$internalid/", $headers, $params);
139 $ip = $result->{data};
140 };
141
142 if ($@) {
143 die "can't find free ip in subnet $cidr: $@";
144 }
145
146 return "$ip/$mask";
147 }
148
149 sub del_ip {
150 my ($class, $plugin_config, $subnetid, $subnet, $ip) = @_;
151
152 return if !$ip;
153
154 my $url = $plugin_config->{url};
155 my $token = $plugin_config->{token};
156 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Token' => $token];
157
158 my $ip_id = get_ip_id($url, $ip, $headers);
159 return if !$ip_id;
160
161 eval {
162 PVE::Network::SDN::Ipams::Plugin::api_request("DELETE", "$url/addresses/$ip_id", $headers);
163 };
164 if ($@) {
165 die "error delete ip $ip: $@";
166 }
167 }
168
169 sub verify_api {
170 my ($class, $plugin_config) = @_;
171
172 my $url = $plugin_config->{url};
173 my $token = $plugin_config->{token};
174 my $sectionid = $plugin_config->{section};
175 my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Token' => $token];
176
177 eval {
178 PVE::Network::SDN::Ipams::Plugin::api_request("GET", "$url/sections/$sectionid", $headers);
179 };
180 if ($@) {
181 die "Can't connect to phpipam api: $@";
182 }
183 }
184
185 sub on_update_hook {
186 my ($class, $plugin_config) = @_;
187
188 PVE::Network::SDN::Ipams::PhpIpamPlugin::verify_api($class, $plugin_config);
189 }
190
191
192 #helpers
193
194 sub get_internalid {
195 my ($url, $cidr, $headers) = @_;
196
197 my $result = PVE::Network::SDN::Ipams::Plugin::api_request("GET", "$url/subnets/cidr/$cidr", $headers);
198 my $data = @{$result->{data}}[0];
199 my $internalid = $data->{id};
200 return $internalid;
201 }
202
203 sub get_ip_id {
204 my ($url, $ip, $headers) = @_;
205 my $result = PVE::Network::SDN::Ipams::Plugin::api_request("GET", "$url/addresses/search/$ip", $headers);
206 my $data = @{$result->{data}}[0];
207 my $ip_id = $data->{id};
208 return $ip_id;
209 }
210
211 1;
212
213