mirror of
https://git.proxmox.com/git/pve-common
synced 2025-05-29 21:03:53 +00:00
tests: list/create/update network interfaces
This commit is contained in:
parent
562fad0bab
commit
c7c4208a33
26
test/etc_network_interfaces/brbase
Normal file
26
test/etc_network_interfaces/brbase
Normal file
@ -0,0 +1,26 @@
|
||||
# network interface settings; autogenerated
|
||||
# Please do NOT modify this file directly, unless you know what
|
||||
# you're doing.
|
||||
#
|
||||
# If you want to manage part of the network configuration manually,
|
||||
# please utilize the 'source' or 'source-directory' directives to do
|
||||
# so.
|
||||
# PVE will preserve these directives, but will NOT its network
|
||||
# configuration from sourced files, so do not attempt to move any of
|
||||
# the PVE managed interfaces into external files!
|
||||
|
||||
auto lo
|
||||
iface lo inet loopback
|
||||
|
||||
source-directory interfaces.d
|
||||
|
||||
iface eth0 inet manual
|
||||
|
||||
auto vmbr0
|
||||
iface vmbr0 inet static
|
||||
address 10.0.0.2
|
||||
netmask 255.255.255.0
|
||||
gateway 10.0.0.1
|
||||
bridge_ports eth0
|
||||
bridge_stp off
|
||||
bridge_fd 0
|
91
test/etc_network_interfaces/t.create_network.pl
Normal file
91
test/etc_network_interfaces/t.create_network.pl
Normal file
@ -0,0 +1,91 @@
|
||||
save('proc_net_dev', <<'/proc/net/dev');
|
||||
eth0:
|
||||
eth1:
|
||||
/proc/net/dev
|
||||
|
||||
r(load('brbase'));
|
||||
|
||||
my $ip = '192.168.0.2';
|
||||
my $nm = '255.255.255.0';
|
||||
my $gw = '192.168.0.1';
|
||||
|
||||
$config->{ifaces}->{eth1} = {
|
||||
type => 'eth',
|
||||
method => 'static',
|
||||
address => $ip,
|
||||
netmask => $nm,
|
||||
gateway => $gw,
|
||||
families => ['inet'],
|
||||
autostart => 1
|
||||
};
|
||||
|
||||
expect load('loopback') . <<"CHECK";
|
||||
source-directory interfaces.d
|
||||
|
||||
iface eth0 inet manual
|
||||
|
||||
auto eth1
|
||||
iface eth1 inet static
|
||||
address $ip
|
||||
netmask $nm
|
||||
gateway $gw
|
||||
|
||||
auto vmbr0
|
||||
iface vmbr0 inet static
|
||||
address 10.0.0.2
|
||||
netmask 255.255.255.0
|
||||
gateway 10.0.0.1
|
||||
bridge_ports eth0
|
||||
bridge_stp off
|
||||
bridge_fd 0
|
||||
|
||||
CHECK
|
||||
|
||||
save('if', w());
|
||||
r(load('if'));
|
||||
expect load('if');
|
||||
|
||||
r(load('brbase'));
|
||||
|
||||
my $ip = 'fc05::2';
|
||||
my $nm = '112';
|
||||
my $gw = 'fc05::1';
|
||||
|
||||
$config->{ifaces}->{eth1} = {
|
||||
type => 'eth',
|
||||
method6 => 'static',
|
||||
address6 => $ip,
|
||||
netmask6 => $nm,
|
||||
gateway6 => $gw,
|
||||
families => ['inet6'],
|
||||
autostart => 1
|
||||
};
|
||||
|
||||
|
||||
expect load('loopback') . <<"CHECK";
|
||||
source-directory interfaces.d
|
||||
|
||||
iface eth0 inet manual
|
||||
|
||||
auto eth1
|
||||
iface eth1 inet6 static
|
||||
address $ip
|
||||
netmask $nm
|
||||
gateway $gw
|
||||
|
||||
auto vmbr0
|
||||
iface vmbr0 inet static
|
||||
address 10.0.0.2
|
||||
netmask 255.255.255.0
|
||||
gateway 10.0.0.1
|
||||
bridge_ports eth0
|
||||
bridge_stp off
|
||||
bridge_fd 0
|
||||
|
||||
CHECK
|
||||
|
||||
save('if', w());
|
||||
r(load('if'));
|
||||
expect load('if');
|
||||
|
||||
1;
|
109
test/etc_network_interfaces/t.list-interfaces.pl
Normal file
109
test/etc_network_interfaces/t.list-interfaces.pl
Normal file
@ -0,0 +1,109 @@
|
||||
no warnings 'experimental::smartmatch';
|
||||
|
||||
# Assuming eth0..3 and eth100
|
||||
# eth0 is part of vmbr0, eth100 is part of the OVS bridge vmbr1
|
||||
# vmbr0 has ipv4 and ipv6, OVS only ipv4
|
||||
#
|
||||
# eth1..3 are completely un-configured as if the cards had just been physically
|
||||
# plugged in.
|
||||
# The expected behavior is to notice their existance and treat them as manually
|
||||
# configured interfaces.
|
||||
# Saving the file after reading would add the corresponding 'manual' lines.
|
||||
save('proc_net_dev', <<'/proc/net/dev');
|
||||
eth0:
|
||||
eth1:
|
||||
eth2:
|
||||
eth3:
|
||||
eth100:
|
||||
/proc/net/dev
|
||||
|
||||
my %wanted = (
|
||||
vmbr0 => { address => '192.168.1.2',
|
||||
netmask => '255.255.255.0',
|
||||
gateway => '192.168.1.1',
|
||||
address6 => 'fc05::1:1',
|
||||
netmask6 => '112' },
|
||||
vmbr1 => { address => '10.0.0.5',
|
||||
netmask => '255.255.255.0' }
|
||||
);
|
||||
|
||||
save('interfaces', <<"/etc/network/interfaces");
|
||||
auto lo
|
||||
iface lo inet loopback
|
||||
|
||||
source-directory interfaces.d
|
||||
|
||||
iface eth0 inet manual
|
||||
|
||||
allow-vmbr1 eth100
|
||||
iface eth100 inet manual
|
||||
ovs_type OVSPort
|
||||
ovs_bridge vmbr1
|
||||
|
||||
auto vmbr0
|
||||
iface vmbr0 inet static
|
||||
address $wanted{vmbr0}->{address}
|
||||
netmask $wanted{vmbr0}->{netmask}
|
||||
gateway $wanted{vmbr0}->{gateway}
|
||||
bridge_ports eth0
|
||||
bridge_stp off
|
||||
bridge_fd 0
|
||||
|
||||
iface vmbr0 inet6 static
|
||||
address $wanted{vmbr0}->{address6}
|
||||
netmask $wanted{vmbr0}->{netmask6}
|
||||
|
||||
source-directory before-ovs.d
|
||||
|
||||
auto vmbr1
|
||||
iface vmbr1 inet static
|
||||
address $wanted{vmbr1}->{address}
|
||||
netmask $wanted{vmbr1}->{netmask}
|
||||
ovs_type OVSBridge
|
||||
ovs_ports eth100
|
||||
|
||||
source after-ovs
|
||||
|
||||
/etc/network/interfaces
|
||||
|
||||
r(load('interfaces'));
|
||||
save('2', w());
|
||||
|
||||
my $ifaces = $config->{ifaces};
|
||||
|
||||
# check defined interfaces
|
||||
defined($ifaces->{"eth$_"})
|
||||
or die "missing interface: eth$_\n" foreach (0, 1, 2, 3, 100);
|
||||
|
||||
# check configuration
|
||||
foreach my $ifname (keys %wanted) {
|
||||
my $if = $wanted{$ifname};
|
||||
$ifaces->{$ifname}->{$_} eq $if->{$_}
|
||||
or die "unexpected $_ for interface $ifname: \""
|
||||
. $ifaces->{$ifname}->{$_}
|
||||
. "\", expected: \"$if->{$_}\"\n"
|
||||
foreach (keys %$if);
|
||||
}
|
||||
|
||||
my $ck = sub {
|
||||
my ($i, $v, $e) = @_;
|
||||
$ifaces->{$i}->{$v} eq $e
|
||||
or die "$i variable $v: got \"$ifaces->{$i}->{$v}\", expected: $e\n";
|
||||
};
|
||||
$ck->('vmbr0', type => 'bridge');
|
||||
$ck->('vmbr1', type => 'OVSBridge');
|
||||
$ck->('vmbr1', ovs_type => 'OVSBridge');
|
||||
$ck->('vmbr1', ovs_ports => 'eth100');
|
||||
$ck->("eth$_", type => 'eth') foreach (0, 1, 2, 3);
|
||||
$ck->('eth100', type => 'OVSPort');
|
||||
$ck->('eth100', ovs_type => 'OVSPort');
|
||||
$ck->('eth100', ovs_bridge => 'vmbr1');
|
||||
|
||||
my $f100 = $ifaces->{vmbr0}->{families};
|
||||
die "invalid families defined for vmbr0: @$f100\n" unless [sort(@$f100)] ~~ ['inet', 'inet6'];
|
||||
|
||||
# idempotency
|
||||
r(w());
|
||||
expect load('2');
|
||||
|
||||
1;
|
116
test/etc_network_interfaces/t.update_network.pl
Normal file
116
test/etc_network_interfaces/t.update_network.pl
Normal file
@ -0,0 +1,116 @@
|
||||
save('proc_net_dev', <<'/proc/net/dev');
|
||||
eth0:
|
||||
eth1:
|
||||
/proc/net/dev
|
||||
|
||||
my $ip = '192.168.0.2';
|
||||
my $nm = '255.255.255.0';
|
||||
my $gw = '192.168.0.1';
|
||||
my $ip6 = 'fc05::2';
|
||||
my $nm6 = '112';
|
||||
my $gw6 = 'fc05::1';
|
||||
|
||||
# Load
|
||||
r(load('brbase'));
|
||||
|
||||
# Create eth1
|
||||
$config->{ifaces}->{eth1} = {
|
||||
type => 'eth',
|
||||
method => 'static',
|
||||
address => $ip,
|
||||
netmask => $nm,
|
||||
gateway => $gw,
|
||||
families => ['inet'],
|
||||
autostart => 1
|
||||
};
|
||||
|
||||
# Check
|
||||
expect load('loopback') . <<"CHECK";
|
||||
source-directory interfaces.d
|
||||
|
||||
iface eth0 inet manual
|
||||
|
||||
auto eth1
|
||||
iface eth1 inet static
|
||||
address $ip
|
||||
netmask $nm
|
||||
gateway $gw
|
||||
|
||||
auto vmbr0
|
||||
iface vmbr0 inet static
|
||||
address 10.0.0.2
|
||||
netmask 255.255.255.0
|
||||
gateway 10.0.0.1
|
||||
bridge_ports eth0
|
||||
bridge_stp off
|
||||
bridge_fd 0
|
||||
|
||||
CHECK
|
||||
|
||||
# Reload then modify
|
||||
save('ipv4', w());
|
||||
r(load('ipv4'));
|
||||
expect load('ipv4');
|
||||
|
||||
$config->{ifaces}->{eth1}->{$_->[0]} = $_->[1] foreach (
|
||||
[ method6 => 'static' ],
|
||||
[ address6 => $ip6 ],
|
||||
[ netmask6 => $nm6 ],
|
||||
[ gateway6 => $gw6 ],
|
||||
[ families => ['inet', 'inet6'] ]
|
||||
);
|
||||
|
||||
# Check
|
||||
my $final = load('loopback') . <<"CHECK";
|
||||
source-directory interfaces.d
|
||||
|
||||
iface eth0 inet manual
|
||||
|
||||
auto eth1
|
||||
iface eth1 inet static
|
||||
address $ip
|
||||
netmask $nm
|
||||
gateway $gw
|
||||
|
||||
iface eth1 inet6 static
|
||||
address $ip6
|
||||
netmask $nm6
|
||||
gateway $gw6
|
||||
|
||||
auto vmbr0
|
||||
iface vmbr0 inet static
|
||||
address 10.0.0.2
|
||||
netmask 255.255.255.0
|
||||
gateway 10.0.0.1
|
||||
bridge_ports eth0
|
||||
bridge_stp off
|
||||
bridge_fd 0
|
||||
|
||||
CHECK
|
||||
expect $final;
|
||||
|
||||
save('both', w());
|
||||
r(load('both'));
|
||||
expect load('both');
|
||||
|
||||
# Reload ipv4 and replace instead of modifying
|
||||
r(load('ipv4'));
|
||||
|
||||
$config->{ifaces}->{eth1} = {
|
||||
type => 'eth',
|
||||
method => 'static',
|
||||
address => $ip,
|
||||
netmask => $nm,
|
||||
gateway => $gw,
|
||||
method6 => 'static',
|
||||
address6 => $ip6,
|
||||
netmask6 => $nm6,
|
||||
gateway6 => $gw6,
|
||||
families => ['inet', 'inet6'],
|
||||
autostart => 1
|
||||
};
|
||||
expect $final;
|
||||
r(w());
|
||||
expect $final;
|
||||
|
||||
1;
|
Loading…
Reference in New Issue
Block a user