]>
Commit | Line | Data |
---|---|---|
5221635a AD |
1 | #!/usr/bin/perl |
2 | ||
3 | use strict; | |
4 | use warnings; | |
5 | ||
6 | use lib qw(..); | |
7 | use File::Slurp; | |
8 | ||
9 | use Test::More; | |
10 | use Test::MockModule; | |
11 | ||
12 | use PVE::Network::SDN; | |
13 | use PVE::Network::SDN::Zones; | |
14 | use PVE::Network::SDN::Controllers; | |
15 | use PVE::INotify; | |
16 | use JSON; | |
17 | ||
18 | use Data::Dumper qw(Dumper); | |
19 | $Data::Dumper::Sortkeys = 1; | |
20 | ||
21 | sub read_sdn_config { | |
22 | my ($file) = @_; | |
23 | # Read structure back in again | |
24 | open my $in, '<', $file or die $!; | |
25 | my $sdn_config; | |
26 | { | |
27 | local $/; # slurp mode | |
28 | $sdn_config = eval <$in>; | |
29 | } | |
30 | close $in; | |
31 | ||
32 | return $sdn_config; | |
33 | } | |
34 | ||
35 | ||
36 | my @plugins = read_dir( './subnets/', prefix => 1 ) ; | |
37 | ||
38 | foreach my $path (@plugins) { | |
39 | ||
40 | my (undef, $testid) = split(/\//, $path); | |
41 | ||
42 | my $sdn_config = read_sdn_config ("$path/sdn_config"); | |
43 | ||
44 | ||
45 | my $pve_sdn_subnets; | |
46 | $pve_sdn_subnets = Test::MockModule->new('PVE::Network::SDN::Subnets'); | |
47 | $pve_sdn_subnets->mock( | |
48 | config => sub { | |
49 | return $sdn_config->{subnets}; | |
50 | }, | |
51 | verify_dns_zone => sub { | |
52 | return; | |
53 | }, | |
54 | add_dns_record => sub { | |
55 | return; | |
56 | } | |
57 | ); | |
58 | ||
59 | ||
60 | my $js = JSON->new; | |
61 | $js->canonical(1); | |
62 | ||
63 | ||
64 | #test params; | |
65 | my $subnets = $sdn_config->{subnets}->{ids}; | |
66 | my $subnetid = (keys %{$subnets})[0]; | |
67 | my $subnet = PVE::Network::SDN::Subnets::sdn_subnets_config($sdn_config->{subnets}, $subnetid, 1); | |
68 | ||
69 | my $subnet_cidr = $subnet->{cidr}; | |
70 | my $iplist = NetAddr::IP->new($subnet_cidr); | |
71 | $iplist++; | |
72 | my $ip = $iplist->canon(); | |
73 | $iplist++; | |
74 | my $ipnextfree = $iplist->canon(); | |
75 | $iplist++; | |
76 | my $ip2 = $iplist->canon(); | |
77 | ||
78 | my $ip3 = undef; | |
79 | my $hostname = "myhostname"; | |
80 | my $mac = "da:65:8f:18:9b:6f"; | |
81 | my $description = "mydescription"; | |
82 | my $is_gateway = 1; | |
83 | my $ipamdb = {}; | |
84 | ||
85 | my $zone = $sdn_config->{zones}->{ids}->{"myzone"}; | |
86 | ||
87 | my $plugin = PVE::Network::SDN::Ipams::Plugin->lookup('pve'); | |
88 | my $sdn_ipam_plugin = Test::MockModule->new($plugin); | |
89 | $sdn_ipam_plugin->mock( | |
90 | read_db => sub { | |
91 | return $ipamdb; | |
92 | }, | |
93 | write_db => sub { | |
94 | my ($cfg) = @_; | |
95 | $ipamdb = $cfg; | |
96 | } | |
97 | ); | |
98 | ||
99 | ## add_subnet | |
100 | my $test = "add_subnet"; | |
101 | my $name = "$testid $test"; | |
102 | my $result = undef; | |
103 | my $expected = '{"zones":{"myzone":{"subnets":{"'.$subnet_cidr.'":{"ips":{}}}}}}'; | |
104 | ||
105 | eval { | |
106 | $plugin->add_subnet(undef, $subnetid, $subnet, 1); | |
107 | }; | |
108 | ||
109 | if ($@) { | |
110 | fail($name); | |
111 | } else { | |
112 | $result = $js->encode($plugin->read_db()); | |
113 | is ($result, $expected, $name); | |
114 | } | |
115 | ||
116 | ## add_ip | |
117 | $test = "add_ip"; | |
118 | $name = "$testid $test"; | |
119 | $result = undef; | |
120 | $expected = '{"zones":{"myzone":{"subnets":{"'.$subnet_cidr.'":{"ips":{"'.$ip.'":{}}}}}}}'; | |
121 | ||
122 | eval { | |
123 | PVE::Network::SDN::Subnets::add_ip($zone, $subnetid, $subnet, $ip, $hostname, $mac, $description); | |
124 | }; | |
125 | ||
126 | if ($@) { | |
127 | fail("$name : $@"); | |
128 | } else { | |
129 | $result = $js->encode($plugin->read_db()); | |
130 | is ($result, $expected, $name); | |
131 | } | |
132 | ||
133 | ## add_already_exist_ip | |
134 | $test = "add_already_exist_ip"; | |
135 | $name = "$testid $test"; | |
136 | ||
137 | eval { | |
138 | PVE::Network::SDN::Subnets::add_ip($zone, $subnetid, $subnet, $ip, $hostname, $mac, $description); | |
139 | }; | |
140 | ||
141 | if ($@) { | |
142 | is (undef, undef, $name); | |
143 | } else { | |
144 | fail("$name : $@"); | |
145 | } | |
146 | ||
147 | ## add_second_ip | |
148 | $test = "add_second_ip"; | |
149 | $name = "$testid $test"; | |
150 | $result = undef; | |
151 | $expected = '{"zones":{"myzone":{"subnets":{"'.$subnet_cidr.'":{"ips":{"'.$ip.'":{},"'.$ip2.'":{}}}}}}}'; | |
152 | ||
153 | eval { | |
154 | PVE::Network::SDN::Subnets::add_ip($zone, $subnetid, $subnet, $ip2, $hostname, $mac, $description); | |
155 | }; | |
156 | ||
157 | if ($@) { | |
158 | fail("$name : $@"); | |
159 | } else { | |
160 | $result = $js->encode($plugin->read_db()); | |
161 | is ($result, $expected, $name); | |
162 | } | |
163 | ||
164 | ||
165 | ## add_next_free | |
166 | $test = "add_next_freeip"; | |
167 | $name = "$testid $test"; | |
168 | $result = undef; | |
169 | $expected = '{"zones":{"myzone":{"subnets":{"'.$subnet_cidr.'":{"ips":{"'.$ip.'":{},"'.$ipnextfree.'":{},"'.$ip2.'":{}}}}}}}'; | |
170 | ||
171 | eval { | |
172 | $ip3 = PVE::Network::SDN::Subnets::next_free_ip($zone, $subnetid, $subnet, $hostname, $mac, $description); | |
173 | }; | |
174 | ||
175 | if ($@) { | |
176 | fail("$name : $@"); | |
177 | } else { | |
178 | $result = $js->encode($plugin->read_db()); | |
179 | is ($result, $expected, $name); | |
180 | } | |
181 | ||
182 | ## del_ip | |
183 | $test = "del_ip"; | |
184 | $name = "$testid $test"; | |
185 | $result = undef; | |
186 | $expected = '{"zones":{"myzone":{"subnets":{"'.$subnet_cidr.'":{"ips":{"'.$ipnextfree.'":{},"'.$ip2.'":{}}}}}}}'; | |
187 | ||
188 | eval { | |
189 | PVE::Network::SDN::Subnets::del_ip($zone, $subnetid, $subnet, $ip, $hostname); | |
190 | }; | |
191 | ||
192 | if ($@) { | |
193 | fail("$name : $@"); | |
194 | } else { | |
195 | $result = $js->encode($plugin->read_db()); | |
196 | is ($result, $expected, $name); | |
197 | } | |
198 | ||
199 | ## del_subnet_not_empty | |
200 | $test = "del_subnet_not_empty"; | |
201 | $name = "$testid $test"; | |
202 | $result = undef; | |
203 | $expected = undef; | |
204 | ||
205 | eval { | |
206 | PVE::Network::SDN::Subnets::del_subnet($zone, $subnetid, $subnet); | |
207 | }; | |
208 | ||
209 | if ($@) { | |
210 | is ($result, $expected, $name); | |
211 | } else { | |
212 | fail("$name : $@"); | |
213 | } | |
214 | ||
215 | ||
216 | ||
217 | ## add_ip_rollback_failing_dns | |
218 | $test = "add_ip_rollback_failing_dns"; | |
219 | ||
220 | $pve_sdn_subnets->mock( | |
221 | config => sub { | |
222 | return $sdn_config->{subnets}; | |
223 | }, | |
224 | verify_dns_zone => sub { | |
225 | return; | |
226 | }, | |
227 | add_dns_record => sub { | |
228 | die "error add dns record"; | |
229 | return; | |
230 | } | |
231 | ); | |
232 | ||
233 | $name = "$testid $test"; | |
234 | $result = undef; | |
235 | $expected = '{"zones":{"myzone":{"subnets":{"'.$subnet_cidr.'":{"ips":{"'.$ipnextfree.'":{},"'.$ip2.'":{}}}}}}}'; | |
236 | ||
237 | eval { | |
238 | PVE::Network::SDN::Subnets::add_ip($zone, $subnetid, $subnet, $ip, $hostname, $mac, $description); | |
239 | }; | |
240 | ||
241 | if ($@) { | |
242 | $result = $js->encode($plugin->read_db()); | |
243 | is ($result, $expected, $name); | |
244 | } else { | |
245 | fail("$name : $@"); | |
246 | } | |
247 | ||
248 | ||
249 | ## del_empty_subnet | |
250 | $test = "del_empty_subnet"; | |
251 | $name = "$testid $test"; | |
252 | $result = undef; | |
253 | $expected = '{"zones":{"myzone":{"subnets":{}}}}'; | |
254 | ||
255 | PVE::Network::SDN::Subnets::del_ip($zone, $subnetid, $subnet, $ip2, $hostname); | |
256 | PVE::Network::SDN::Subnets::del_ip($zone, $subnetid, $subnet, $ip3, $hostname); | |
257 | ||
258 | eval { | |
259 | PVE::Network::SDN::Subnets::del_subnet($zone, $subnetid, $subnet); | |
260 | }; | |
261 | ||
262 | if ($@) { | |
263 | fail("$name : $@"); | |
264 | } else { | |
265 | $result = $js->encode($plugin->read_db()); | |
266 | is ($result, $expected, $name); | |
267 | } | |
268 | ||
269 | } | |
270 | ||
271 | done_testing(); | |
272 | ||
273 |