save('proc_net_dev', <<'/proc/net/dev'); eth0: eth1: eth2: eth3: /proc/net/dev r(load('brbase')); # # Variables used for the various interfaces: # my $ip = '192.168.0.2'; my $nm = '255.255.255.0'; my $gw = '192.168.0.1'; my $svcnodeip = '239.192.105.237'; my $physdev = 'eth0'; my $remoteip1 = '192.168.0.3'; my $remoteip2 = '192.168.0.4'; # # Hunk for the default bridge of the 'brbase' configuration # my $vmbr0_part = <<"PART"; 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 PART chomp $vmbr0_part; # # Configure eth1 statically, store its expected interfaces hunk in $eth1_part # and test! # $config->{ifaces}->{eth1} = { type => 'eth', method => 'static', address => $ip, netmask => $nm, gateway => $gw, families => ['inet'], autostart => 1 }; my $eth1_part = <<"PART"; auto eth1 iface eth1 inet static address $ip netmask $nm gateway $gw PART chomp $eth1_part; expect load('loopback') . <<"CHECK"; source-directory interfaces.d iface eth0 inet manual $eth1_part iface eth2 inet manual iface eth3 inet manual $vmbr0_part CHECK # # Add a bond for eth2 & 3 and check the new output # $config->{ifaces}->{bond0} = { type => 'bond', mtu => 1400, slaves => 'eth2 eth3', bond_mode => '802.3ad', bond_xmit_hash_policy => 'layer3+4', bond_miimon => 100, method => 'manual', families => ['inet'], autostart => 1 }; my $bond0_part = <<"PART"; auto bond0 iface bond0 inet manual bond-slaves eth2 eth3 bond-miimon 100 bond-mode 802.3ad bond-xmit-hash-policy layer3+4 mtu 1400 PART chomp $bond0_part; expect load('loopback') . <<"CHECK"; source-directory interfaces.d iface eth0 inet manual $eth1_part iface eth2 inet manual iface eth3 inet manual $bond0_part $vmbr0_part CHECK # # Add vxlan1 and 2 # $config->{ifaces}->{vxlan1} = { type => 'vxlan', method => 'manual', families => ['inet'], 'vxlan-id' => 1, 'vxlan-svcnodeip' => $svcnodeip, 'vxlan-physdev' => $physdev, autostart => 1 }; $config->{ifaces}->{vxlan2} = { type => 'vxlan', method => 'manual', families => ['inet'], 'vxlan-id' => 2, 'vxlan-local-tunnelip' => $ip, autostart => 1 }; my $vxlan12_part = <<"PART"; auto vxlan1 iface vxlan1 inet manual vxlan-id 1 vxlan-svcnodeip $svcnodeip vxlan-physdev $physdev auto vxlan2 iface vxlan2 inet manual vxlan-id 2 vxlan-local-tunnelip $ip PART chomp $vxlan12_part; expect load('loopback') . <<"CHECK"; source-directory interfaces.d iface eth0 inet manual $eth1_part iface eth2 inet manual iface eth3 inet manual $bond0_part $vmbr0_part $vxlan12_part CHECK # # Add vxlan3 and 3 bridges using vxlan1..3 # $config->{ifaces}->{vmbr1} = { mtu => 1400, type => 'bridge', method => 'manual', families => ['inet'], bridge_stp => 'off', bridge_fd => 0, bridge_ports => 'vxlan1', bridge_vlan_aware => 'yes', autostart => 1 }; $config->{ifaces}->{vmbr2} = { type => 'bridge', method => 'manual', families => ['inet'], bridge_stp => 'off', bridge_fd => 0, bridge_ports => 'vxlan2', autostart => 1 }; $config->{ifaces}->{vmbr3} = { type => 'bridge', method => 'manual', families => ['inet'], bridge_stp => 'off', bridge_fd => 0, bridge_ports => 'vxlan3.50', bridge_vlan_aware => 'yes', bridge_vids => '2-10', autostart => 1 }; my $vmbr123_part = <<"PART"; auto vmbr1 iface vmbr1 inet manual bridge-ports vxlan1 bridge-stp off bridge-fd 0 bridge-vlan-aware yes bridge-vids 2-4094 mtu 1400 auto vmbr2 iface vmbr2 inet manual bridge-ports vxlan2 bridge-stp off bridge-fd 0 auto vmbr3 iface vmbr3 inet manual bridge-ports vxlan3.50 bridge-stp off bridge-fd 0 bridge-vlan-aware yes bridge-vids 2-10 PART chomp $vmbr123_part; $config->{ifaces}->{vxlan3} = { type => 'vxlan', method => 'manual', families => ['inet'], 'vxlan-id' => 3, 'vxlan-remoteip' => [$remoteip1, $remoteip2], 'bridge-access' => 3, autostart => 1 }; my $vx = $config->{ifaces}->{vxlan2}; $vx->{'bridge-learning'} = 'off'; $vx->{'bridge-arp-nd-suppress'} = 'on'; $vx->{'bridge-unicast-flood'} = 'off'; $vx->{'bridge-multicast-flood'} = 'off'; my $vxlan123_part = $vxlan12_part ."\n" . <<"PART"; bridge-arp-nd-suppress on bridge-learning off bridge-multicast-flood off bridge-unicast-flood off auto vxlan3 iface vxlan3 inet manual vxlan-id 3 vxlan-remoteip $remoteip1 vxlan-remoteip $remoteip2 bridge-access 3 PART chomp $vxlan123_part; expect load('loopback') . <<"CHECK"; source-directory interfaces.d iface eth0 inet manual $eth1_part iface eth2 inet manual iface eth3 inet manual $bond0_part $vmbr0_part $vmbr123_part $vxlan123_part CHECK # # Now add vlans on all types of interfaces: vmbr1, bond0 and eth1 # $config->{ifaces}->{'vmbr1.100'} = { type => 'vlan', mtu => 1300, method => 'manual', families => ['inet'], autostart => 1 }; $config->{ifaces}->{'bond0.100'} = { type => 'vlan', mtu => 1300, method => 'manual', families => ['inet'], 'vlan-protocol' => '802.1ad', autostart => 1 }; $config->{ifaces}->{'bond0.100.10'} = { type => 'vlan', mtu => 1300, method => 'manual', families => ['inet'], autostart => 1 }; $config->{ifaces}->{'eth1.100'} = { type => 'vlan', mtu => 1400, method => 'manual', families => ['inet'], autostart => 1 }; expect load('loopback') . <<"CHECK"; source-directory interfaces.d iface eth0 inet manual $eth1_part iface eth2 inet manual iface eth3 inet manual auto eth1.100 iface eth1.100 inet manual mtu 1400 $bond0_part auto bond0.100 iface bond0.100 inet manual mtu 1300 vlan-protocol 802.1ad auto bond0.100.10 iface bond0.100.10 inet manual mtu 1300 $vmbr0_part $vmbr123_part auto vmbr1.100 iface vmbr1.100 inet manual mtu 1300 $vxlan123_part CHECK # # Now check the new config for idempotency: # save('if', w()); r(load('if')); expect load('if'); # # Check a brbase with an ipv6 address on eth1 # 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 iface eth2 inet manual iface eth3 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 CHECK save('if', w()); r(load('if')); expect load('if'); 1;