]> git.proxmox.com Git - pve-network.git/blob - src/test/run_test_vnets.pl
tests: test VNets functionality as a blackbox
[pve-network.git] / src / test / run_test_vnets.pl
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use lib qw(..);
7 use File::Slurp;
8 use NetAddr::IP qw(:lower);
9
10 use Test::More;
11 use Test::MockModule;
12
13 use PVE::Network::SDN;
14 use PVE::Network::SDN::Zones;
15 use PVE::Network::SDN::Controllers;
16 use PVE::INotify;
17 use JSON;
18
19 use Data::Dumper qw(Dumper);
20 $Data::Dumper::Sortkeys = 1;
21
22 sub read_sdn_config {
23 my ($file) = @_;
24
25 # Read structure back in again
26 open my $in, '<', $file or die $!;
27 my $sdn_config;
28 {
29 local $/; # slurp mode
30 $sdn_config = eval <$in>;
31 }
32 close $in;
33 return $sdn_config;
34 }
35
36 my @plugins = read_dir('./vnets/', prefix => 1);
37
38 foreach my $path (@plugins) {
39
40 my (undef, $testid) = split(/\//, $path);
41
42 print "test: $testid\n";
43 my $sdn_config = read_sdn_config("$path/sdn_config");
44
45 my $pve_sdn_zones;
46 $pve_sdn_zones = Test::MockModule->new('PVE::Network::SDN::Zones');
47 $pve_sdn_zones->mock(
48 config => sub {
49 return $sdn_config->{zones};
50 },
51 );
52
53 my $pve_sdn_vnets;
54 $pve_sdn_vnets = Test::MockModule->new('PVE::Network::SDN::Vnets');
55 $pve_sdn_vnets->mock(
56 config => sub {
57 return $sdn_config->{vnets};
58 },
59 );
60
61 my $pve_sdn_subnets;
62 $pve_sdn_subnets = Test::MockModule->new('PVE::Network::SDN::Subnets');
63 $pve_sdn_subnets->mock(
64 config => sub {
65 return $sdn_config->{subnets};
66 },
67 verify_dns_zone => sub {
68 return;
69 },
70 add_dns_record => sub {
71 return;
72 },
73 );
74
75 my $js = JSON->new;
76 $js->canonical(1);
77
78 #test params;
79 #test params;
80 my $subnets = $sdn_config->{subnets}->{ids};
81
82 my $subnetid = (sort keys %{$subnets})[0];
83 my $subnet =
84 PVE::Network::SDN::Subnets::sdn_subnets_config($sdn_config->{subnets}, $subnetid, 1);
85 my $subnet_cidr = $subnet->{cidr};
86 my $iplist = NetAddr::IP->new($subnet_cidr);
87 my $mask = $iplist->masklen();
88 my $ipversion = undef;
89
90 if (Net::IP::ip_is_ipv4($iplist->canon())) {
91 $iplist++; #skip network address for ipv4
92 $ipversion = 4;
93 } else {
94 $ipversion = 6;
95 }
96
97 my $cidr1 = $iplist->canon() . "/$mask";
98 $iplist++;
99 my $cidr2 = $iplist->canon() . "/$mask";
100 my $cidr_outofrange = '8.8.8.8/8';
101
102 my $subnetid2 = (sort keys %{$subnets})[1];
103 my $subnet2 =
104 PVE::Network::SDN::Subnets::sdn_subnets_config($sdn_config->{subnets}, $subnetid2, 1);
105 my $subnet2_cidr = $subnet2->{cidr};
106 my $iplist2 = NetAddr::IP->new($subnet2_cidr);
107 $iplist2++;
108 my $cidr3 = $iplist2->canon() . "/$mask";
109 $iplist2++;
110 my $cidr4 = $iplist2->canon() . "/$mask";
111
112 my $hostname = "myhostname";
113 my $mac = "da:65:8f:18:9b:6f";
114 my $description = "mydescription";
115 my $ipamdb = read_sdn_config("$path/ipam.db");
116
117 my $zone = $sdn_config->{zones}->{ids}->{"myzone"};
118 my $ipam = $zone->{ipam};
119
120 my $plugin;
121 my $sdn_ipam_plugin;
122 if ($ipam) {
123 $plugin = PVE::Network::SDN::Ipams::Plugin->lookup($ipam);
124 $sdn_ipam_plugin = Test::MockModule->new($plugin);
125 $sdn_ipam_plugin->mock(
126 read_db => sub {
127 return $ipamdb;
128 },
129 write_db => sub {
130 my ($cfg) = @_;
131 $ipamdb = $cfg;
132 },
133 );
134 }
135
136 my $pve_sdn_ipams;
137 $pve_sdn_ipams = Test::MockModule->new('PVE::Network::SDN::Ipams');
138 $pve_sdn_ipams->mock(
139 config => sub {
140 my $ipam_config = read_sdn_config("$path/ipam_config");
141 return $ipam_config;
142 },
143 );
144
145 my $vnetid = "myvnet";
146
147 ## add_ip
148 my $test = "add_cidr $cidr1";
149 my $name = "$testid $test";
150 my $result = undef;
151 my $expected = '';
152
153 eval { PVE::Network::SDN::Vnets::add_cidr($vnetid, $cidr1, $hostname, $mac, $description); };
154
155 if ($@) {
156 fail("$name : $@");
157 } else {
158 is(undef, undef, $name);
159 }
160
161 ## add_ip
162 $test = "add_already_exist_cidr $cidr1";
163 $name = "$testid $test";
164 $result = undef;
165 $expected = '';
166
167 eval { PVE::Network::SDN::Vnets::add_cidr($vnetid, $cidr1, $hostname, $mac, $description); };
168
169 if ($@) {
170 is(undef, undef, $name);
171 } elsif ($ipam) {
172 fail("$name : $@");
173 } else {
174 is(undef, undef, $name);
175 }
176
177 ## add_ip
178 $test = "add_cidr $cidr2";
179 $name = "$testid $test";
180 $result = undef;
181 $expected = '';
182
183 eval { PVE::Network::SDN::Vnets::add_cidr($vnetid, $cidr2, $hostname, $mac, $description); };
184
185 if ($@) {
186 fail("$name : $@");
187 } else {
188 is(undef, undef, $name);
189 }
190
191 ## add_ip
192 $test = "add_ip_out_of_range_subnets $cidr_outofrange";
193 $name = "$testid $test";
194 $result = undef;
195 $expected = '';
196
197 eval {
198 PVE::Network::SDN::Vnets::add_cidr($vnetid, $cidr_outofrange, $hostname, $mac,
199 $description);
200 };
201
202 if ($@) {
203 is(undef, undef, $name);
204 } else {
205 fail("$name : $@");
206 }
207
208 ## add_ip
209 $test = "add_cidr $cidr4";
210 $name = "$testid $test";
211 $result = undef;
212 $expected = '';
213
214 eval { PVE::Network::SDN::Vnets::add_cidr($vnetid, $cidr4, $hostname, $mac, $description); };
215
216 if ($@) {
217 fail("$name : $@");
218 } else {
219 is(undef, undef, $name);
220 }
221
222 $test = "find_next_free_cidr_in_second_subnet ($cidr3)";
223 $name = "$testid $test";
224 $result = undef;
225 $expected = $ipam ? $cidr3 : undef;
226
227 eval {
228 $result =
229 PVE::Network::SDN::Vnets::add_next_free_cidr($vnetid, $hostname, $mac, $description);
230 };
231
232 if ($@) {
233 fail("$name : $@");
234 } else {
235 is($result, $expected, $name);
236 }
237
238 $test = "del_cidr $cidr1";
239 $name = "$testid $test";
240 $result = undef;
241 $expected = undef;
242
243 eval { $result = PVE::Network::SDN::Vnets::del_cidr($vnetid, $cidr1, $hostname); };
244
245 if ($@) {
246 fail("$name : $@");
247 } else {
248 is(undef, undef, $name);
249 }
250
251 $test = "del_cidr $cidr3";
252 $name = "$testid $test";
253 $result = undef;
254 $expected = undef;
255
256 eval { $result = PVE::Network::SDN::Vnets::del_cidr($vnetid, $cidr3, $hostname); };
257
258 if ($@) {
259 fail("$name : $@");
260 } else {
261 is(undef, undef, $name);
262 }
263
264 $test = "del_cidr not exist $cidr1";
265 $name = "$testid $test";
266 $result = undef;
267 $expected = undef;
268
269 eval { $result = PVE::Network::SDN::Vnets::del_cidr($vnetid, $cidr1, $hostname); };
270
271 if ($@) {
272 is(undef, undef, $name);
273 } elsif ($ipam) {
274 fail("$name : $@");
275 } else {
276 is(undef, undef, $name);
277 }
278
279 $test = "del_cidr outofrange $cidr_outofrange";
280 $name = "$testid $test";
281 $result = undef;
282 $expected = undef;
283
284 eval { $result = PVE::Network::SDN::Vnets::del_cidr($vnetid, $cidr_outofrange, $hostname); };
285
286 if ($@) {
287 is(undef, undef, $name);
288 } else {
289 fail("$name : $@");
290 }
291
292 $test = "find_next_free_cidr_in_first_subnet ($cidr1)";
293 $name = "$testid $test";
294 $result = undef;
295 $expected = $ipam ? $cidr1 : undef;
296
297 eval {
298 $result =
299 PVE::Network::SDN::Vnets::add_next_free_cidr($vnetid, $hostname, $mac, $description);
300 };
301
302 if ($@) {
303 fail("$name : $@");
304 } else {
305 is($result, $expected, $name);
306 }
307
308 $test = "update_cidr $cidr1";
309 $name = "$testid $test";
310 $result = undef;
311 $expected = undef;
312
313 eval {
314 $result = PVE::Network::SDN::Vnets::update_cidr($vnetid, $cidr1, $hostname, $hostname, $mac,
315 $description);
316 };
317
318 if ($@) {
319 fail("$name : $@");
320 } else {
321 is(undef, undef, $name);
322 }
323
324 $test = "update_cidr deleted $cidr3";
325 $name = "$testid $test";
326 $result = undef;
327 $expected = undef;
328
329 eval {
330 $result = PVE::Network::SDN::Vnets::update_cidr($vnetid, $cidr1, $hostname, $hostname, $mac,
331 $description);
332 };
333
334 if ($@) {
335 fail("$name : $@");
336 } else {
337 is(undef, undef, $name);
338 }
339
340 }
341
342 done_testing();
343