]> git.proxmox.com Git - pve-network.git/blob - src/test/run_test_subnets.pl
sdn: fix tests
[pve-network.git] / src / test / run_test_subnets.pl
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 print "test: $testid\n";
43 my $sdn_config = read_sdn_config ("$path/sdn_config");
44
45
46 my $pve_sdn_subnets;
47 $pve_sdn_subnets = Test::MockModule->new('PVE::Network::SDN::Subnets');
48 $pve_sdn_subnets->mock(
49 config => sub {
50 return $sdn_config->{subnets};
51 },
52 verify_dns_zone => sub {
53 return;
54 },
55 add_dns_record => sub {
56 return;
57 }
58 );
59
60
61 my $js = JSON->new;
62 $js->canonical(1);
63
64
65 #test params;
66 my $subnets = $sdn_config->{subnets}->{ids};
67 my $subnetid = (keys %{$subnets})[0];
68 my $subnet = PVE::Network::SDN::Subnets::sdn_subnets_config($sdn_config->{subnets}, $subnetid, 1);
69
70 my $subnet_cidr = $subnet->{cidr};
71 my $iplist = NetAddr::IP->new($subnet_cidr);
72 $iplist++ if Net::IP::ip_is_ipv4($iplist->canon()); #skip network address for ipv4
73 my $ip = $iplist->canon();
74 $iplist++;
75 my $ipnextfree = $iplist->canon();
76 $iplist++;
77 my $ip2 = $iplist->canon();
78
79 my $ip3 = undef;
80 my $hostname = "myhostname";
81 my $mac = "da:65:8f:18:9b:6f";
82 my $description = "mydescription";
83 my $is_gateway = 1;
84 my $ipamdb = {};
85
86 my $zone = $sdn_config->{zones}->{ids}->{"myzone"};
87 my $ipam = $zone->{ipam};
88
89 my $plugin;
90 my $sdn_ipam_plugin;
91 if($ipam) {
92 $plugin = PVE::Network::SDN::Ipams::Plugin->lookup($ipam);
93 $sdn_ipam_plugin = Test::MockModule->new($plugin);
94 $sdn_ipam_plugin->mock(
95 read_db => sub {
96 return $ipamdb;
97 },
98 write_db => sub {
99 my ($cfg) = @_;
100 $ipamdb = $cfg;
101 }
102 );
103 }
104
105 my $pve_sdn_ipams;
106 $pve_sdn_ipams = Test::MockModule->new('PVE::Network::SDN::Ipams');
107 $pve_sdn_ipams->mock(
108 config => sub {
109 my $ipam_config = read_sdn_config ("$path/ipam_config");
110 return $ipam_config;
111 },
112 add_cache_mac_ip => sub {
113 return;
114 },
115 del_cache_mac_ip => sub {
116 return;
117 }
118 );
119
120 ## add_subnet
121 my $test = "add_subnet $subnetid";
122 my $name = "$testid $test";
123 my $result = undef;
124 my $expected = '{"zones":{"myzone":{"subnets":{"'.$subnet_cidr.'":{"ips":{}}}}}}';
125
126 eval {
127 PVE::Network::SDN::Subnets::add_subnet($zone, $subnetid, $subnet);
128
129 };
130
131 if ($@) {
132 fail("$name : $@");
133 } elsif($ipam) {
134 $result = $js->encode($plugin->read_db());
135 is ($result, $expected, $name);
136 } else {
137 is (undef, undef, $name);
138 }
139
140 ## add_ip
141 $test = "add_ip $ip";
142 $name = "$testid $test";
143 $result = undef;
144 $expected = '{"zones":{"myzone":{"subnets":{"'.$subnet_cidr.'":{"ips":{"'.$ip.'":{"gateway":1}}}}}}}';
145
146 eval {
147 PVE::Network::SDN::Subnets::add_ip($zone, $subnetid, $subnet, $ip, $hostname, $mac, $description, $is_gateway);
148 };
149
150 if ($@) {
151 fail("$name : $@");
152 } elsif($ipam) {
153 $result = $js->encode($plugin->read_db());
154 is ($result, $expected, $name);
155 } else {
156 is (undef, undef, $name);
157 }
158
159 if($ipam) {
160 ## add_already_exist_ip
161 $test = "add_already_exist_ip $ip";
162 $name = "$testid $test";
163
164 eval {
165 PVE::Network::SDN::Subnets::add_ip($zone, $subnetid, $subnet, $ip, $hostname, $mac, $description);
166 };
167
168 if ($@) {
169 is (undef, undef, $name);
170 } else {
171 fail("$name : $@");
172 }
173 }
174
175 ## add_second_ip
176 $test = "add_second_ip $ip2";
177 $name = "$testid $test";
178 $result = undef;
179 $expected = '{"zones":{"myzone":{"subnets":{"'.$subnet_cidr.'":{"ips":{"'.$ip.'":{"gateway":1},"'.$ip2.'":{}}}}}}}';
180
181 eval {
182 PVE::Network::SDN::Subnets::add_ip($zone, $subnetid, $subnet, $ip2, $hostname, $mac, $description);
183 };
184
185 if ($@) {
186 fail("$name : $@");
187 } elsif($ipam) {
188 $result = $js->encode($plugin->read_db());
189 is ($result, $expected, $name);
190 } else {
191 is (undef, undef, $name);
192 }
193
194 ## add_next_free
195 $test = "find_next_freeip ($ipnextfree)";
196 $name = "$testid $test";
197 $result = undef;
198 $expected = '{"zones":{"myzone":{"subnets":{"'.$subnet_cidr.'":{"ips":{"'.$ip.'":{"gateway":1},"'.$ipnextfree.'":{},"'.$ip2.'":{}}}}}}}';
199
200 eval {
201 $ip3 = PVE::Network::SDN::Subnets::add_next_free_ip($zone, $subnetid, $subnet, $hostname, $mac, $description);
202 };
203
204 if ($@) {
205 fail("$name : $@");
206 } elsif($ipam) {
207 $result = $js->encode($plugin->read_db());
208 is ($result, $expected, $name);
209 }
210
211 ## del_ip
212 $test = "del_ip $ip";
213 $name = "$testid $test";
214 $result = undef;
215 $expected = '{"zones":{"myzone":{"subnets":{"'.$subnet_cidr.'":{"ips":{"'.$ipnextfree.'":{},"'.$ip2.'":{}}}}}}}';
216
217 eval {
218 PVE::Network::SDN::Subnets::del_ip($zone, $subnetid, $subnet, $ip, $hostname);
219 };
220
221 if ($@) {
222 fail("$name : $@");
223 } elsif($ipam) {
224 $result = $js->encode($plugin->read_db());
225 is ($result, $expected, $name);
226 } else {
227 is (undef, undef, $name);
228 }
229
230 if($ipam){
231 ## del_subnet_not_empty
232 $test = "del_subnet_not_empty $subnetid";
233 $name = "$testid $test";
234 $result = undef;
235 $expected = undef;
236
237 eval {
238 PVE::Network::SDN::Subnets::del_subnet($zone, $subnetid, $subnet);
239 };
240
241 if ($@) {
242 is ($result, $expected, $name);
243 } else {
244 fail("$name : $@");
245 }
246 }
247
248
249 ## add_ip_rollback_failing_dns
250 $test = "add_ip_rollback_failing_dns";
251
252 $pve_sdn_subnets->mock(
253 config => sub {
254 return $sdn_config->{subnets};
255 },
256 verify_dns_zone => sub {
257 return;
258 },
259 add_dns_record => sub {
260 die "error add dns record";
261 return;
262 }
263 );
264
265 $name = "$testid $test";
266 $result = undef;
267 $expected = '{"zones":{"myzone":{"subnets":{"'.$subnet_cidr.'":{"ips":{"'.$ipnextfree.'":{},"'.$ip2.'":{}}}}}}}';
268
269 eval {
270 PVE::Network::SDN::Subnets::add_ip($zone, $subnetid, $subnet, $ip, $hostname, $mac, $description);
271 };
272
273 if ($@) {
274 if($ipam) {
275 $result = $js->encode($plugin->read_db());
276 is ($result, $expected, $name);
277 } else {
278 is (undef, undef, $name);
279 }
280 } else {
281 fail("$name : $@");
282 }
283
284
285 ## del_empty_subnet
286 $test = "del_empty_subnet";
287 $name = "$testid $test";
288 $result = undef;
289 $expected = '{"zones":{"myzone":{"subnets":{}}}}';
290
291 PVE::Network::SDN::Subnets::del_ip($zone, $subnetid, $subnet, $ip2, $hostname);
292 PVE::Network::SDN::Subnets::del_ip($zone, $subnetid, $subnet, $ip3, $hostname);
293
294 eval {
295 PVE::Network::SDN::Subnets::del_subnet($zone, $subnetid, $subnet);
296 };
297
298 if ($@) {
299 fail("$name : $@");
300 } elsif($ipam) {
301 $result = $js->encode($plugin->read_db());
302 is ($result, $expected, $name);
303 } else {
304 is (undef, undef, $name);
305 }
306
307 }
308
309 done_testing();
310
311