]>
Commit | Line | Data |
---|---|---|
70b03506 AD |
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 | ||
e8736dac AD |
43 | my $cidr = $subnet->{cidr}; |
44 | my $network = $subnet->{network}; | |
45 | my $mask = $subnet->{mask}; | |
46 | ||
70b03506 AD |
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) { | |
70b03506 AD |
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 | ||
e8736dac | 77 | my $cidr = $subnet->{cidr}; |
70b03506 AD |
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 | ||
e8736dac | 86 | return; #fixme: check that prefix is empty exluding gateway, before delete |
70b03506 AD |
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 { | |
e9365ab0 | 98 | my ($class, $plugin_config, $subnetid, $subnet, $ip, $hostname, $mac, $description, $is_gateway) = @_; |
70b03506 | 99 | |
e8736dac | 100 | my $cidr = $subnet->{cidr}; |
70b03506 AD |
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, | |
ceb972a9 AD |
111 | hostname => $hostname, |
112 | description => $description, | |
70b03506 | 113 | }; |
e9365ab0 | 114 | $params->{mac} = $mac if $mac; |
70b03506 AD |
115 | |
116 | eval { | |
117 | PVE::Network::SDN::Ipams::Plugin::api_request("POST", "$url/addresses/", $headers, $params); | |
118 | }; | |
119 | ||
120 | if ($@) { | |
121 | die "error add subnet ip to ipam: ip $ip already exist: $@"; | |
122 | } | |
123 | } | |
124 | ||
125 | sub add_next_freeip { | |
e9365ab0 | 126 | my ($class, $plugin_config, $subnetid, $subnet, $hostname, $mac, $description) = @_; |
70b03506 | 127 | |
e8736dac AD |
128 | my $cidr = $subnet->{cidr}; |
129 | my $mask = $subnet->{mask}; | |
70b03506 AD |
130 | my $url = $plugin_config->{url}; |
131 | my $token = $plugin_config->{token}; | |
132 | my $section = $plugin_config->{section}; | |
133 | my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Token' => $token]; | |
134 | ||
ceb972a9 | 135 | my $internalid = get_internalid($url, $cidr, $headers); |
70b03506 | 136 | |
ceb972a9 AD |
137 | my $params = { hostname => $hostname, |
138 | description => $description, | |
139 | }; | |
70b03506 | 140 | |
e9365ab0 AD |
141 | $params->{mac} = $mac if $mac; |
142 | ||
70b03506 AD |
143 | my $ip = undef; |
144 | eval { | |
145 | my $result = PVE::Network::SDN::Ipams::Plugin::api_request("POST", "$url/addresses/first_free/$internalid/", $headers, $params); | |
146 | $ip = $result->{data}; | |
147 | }; | |
148 | ||
149 | if ($@) { | |
150 | die "can't find free ip in subnet $cidr: $@"; | |
151 | } | |
152 | ||
70b03506 AD |
153 | return "$ip/$mask"; |
154 | } | |
155 | ||
156 | sub del_ip { | |
e8736dac | 157 | my ($class, $plugin_config, $subnetid, $subnet, $ip) = @_; |
70b03506 AD |
158 | |
159 | return if !$ip; | |
160 | ||
161 | my $url = $plugin_config->{url}; | |
162 | my $token = $plugin_config->{token}; | |
163 | my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Token' => $token]; | |
164 | ||
165 | my $ip_id = get_ip_id($url, $ip, $headers); | |
166 | return if !$ip_id; | |
167 | ||
168 | eval { | |
169 | PVE::Network::SDN::Ipams::Plugin::api_request("DELETE", "$url/addresses/$ip_id", $headers); | |
170 | }; | |
171 | if ($@) { | |
172 | die "error delete ip $ip: $@"; | |
173 | } | |
174 | } | |
175 | ||
176 | sub verify_api { | |
177 | my ($class, $plugin_config) = @_; | |
178 | ||
179 | my $url = $plugin_config->{url}; | |
180 | my $token = $plugin_config->{token}; | |
181 | my $sectionid = $plugin_config->{section}; | |
182 | my $headers = ['Content-Type' => 'application/json; charset=UTF-8', 'Token' => $token]; | |
183 | ||
184 | eval { | |
185 | PVE::Network::SDN::Ipams::Plugin::api_request("GET", "$url/sections/$sectionid", $headers); | |
186 | }; | |
187 | if ($@) { | |
188 | die "Can't connect to phpipam api: $@"; | |
189 | } | |
190 | } | |
191 | ||
192 | sub on_update_hook { | |
193 | my ($class, $plugin_config) = @_; | |
194 | ||
195 | PVE::Network::SDN::Ipams::PhpIpamPlugin::verify_api($class, $plugin_config); | |
196 | } | |
197 | ||
198 | ||
199 | #helpers | |
200 | ||
201 | sub get_internalid { | |
202 | my ($url, $cidr, $headers) = @_; | |
203 | ||
204 | my $result = PVE::Network::SDN::Ipams::Plugin::api_request("GET", "$url/subnets/cidr/$cidr", $headers); | |
205 | my $data = @{$result->{data}}[0]; | |
206 | my $internalid = $data->{id}; | |
207 | return $internalid; | |
208 | } | |
209 | ||
210 | sub get_ip_id { | |
211 | my ($url, $ip, $headers) = @_; | |
212 | my $result = PVE::Network::SDN::Ipams::Plugin::api_request("GET", "$url/addresses/search/$ip", $headers); | |
213 | my $data = @{$result->{data}}[0]; | |
214 | my $ip_id = $data->{id}; | |
215 | return $ip_id; | |
216 | } | |
217 | ||
218 | 1; | |
219 | ||
220 |