]> git.proxmox.com Git - pve-network.git/blame - test/run_test_subnets.pl
qinq: code cleanup and whitespace/indendation fixes
[pve-network.git] / test / run_test_subnets.pl
CommitLineData
5221635a
AD
1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use lib qw(..);
7use File::Slurp;
8
9use Test::More;
10use Test::MockModule;
11
12use PVE::Network::SDN;
13use PVE::Network::SDN::Zones;
14use PVE::Network::SDN::Controllers;
15use PVE::INotify;
16use JSON;
17
18use Data::Dumper qw(Dumper);
19$Data::Dumper::Sortkeys = 1;
20
21sub 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
36my @plugins = read_dir( './subnets/', prefix => 1 ) ;
37
38foreach 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
271done_testing();
272
273