1
0
mirror of https://github.com/containers/netavark.git synced 2026-02-05 06:45:56 +01:00
Files
netavark/test/400-ipvlan.bats
Jan Hendrik Farr e0ae9bc4e3 add no_default_gateway option
Signed-off-by: Jan Hendrik Farr <github@jfarr.cc>
2023-05-22 15:10:53 +00:00

326 lines
11 KiB
Bash

#!/usr/bin/env bats -*- bats -*-
#
# macvlan driver test
#
load helpers
function setup() {
basic_setup
# create a extra interface which we can use to connect the ipvlan to
run_in_host_netns ip link add dummy0 type dummy
}
@test "simple ipvlan setup" {
run_netavark --file ${TESTSDIR}/testfiles/ipvlan.json setup $(get_container_netns_path)
result="$output"
mac=$(jq -r '.podman.interfaces.eth0.mac_address' <<< "$result" )
# check that interface exists
run_in_container_netns ip -j --details link show eth0
link_info="$output"
assert_json "$link_info" ".[].address" "==" "$mac" "MAC matches container mac"
assert_json "$link_info" '.[].flags[] | select(.=="UP")' "==" "UP" "Container interface is up"
assert_json "$link_info" ".[].linkinfo.info_kind" "==" "ipvlan" "Container interface is a ipvlan device"
ipaddr="10.88.0.2/16"
run_in_container_netns ip addr show eth0
assert "$output" "=~" "$ipaddr" "IP address matches container address"
assert_json "$result" ".podman.interfaces.eth0.subnets[0].ipnet" "==" "$ipaddr" "Result contains correct IP address"
# check gateway assignment
run_in_container_netns ip r
assert "$output" "=~" "default via 10.88.0.1" "gateway must be there in default route"
assert_json "$result" ".podman.interfaces.eth0.subnets[0].gateway" == "10.88.0.1" "Result contains gateway address"
run_in_container_netns cat /proc/sys/net/ipv6/conf/eth0/autoconf
assert "0" "autoconf is disabled"
run_netavark --file ${TESTSDIR}/testfiles/ipvlan.json teardown $(get_container_netns_path)
assert "" "no errors"
}
@test "ipvlan setup with static routes" {
# add second interface and routes through that interface to test proper teardown
run_in_container_netns ip link add type dummy
run_in_container_netns ip a add 10.91.0.10/24 dev dummy0
run_in_container_netns ip link set dummy0 up
run_netavark --file ${TESTSDIR}/testfiles/ipvlan-staticroutes.json setup $(get_container_netns_path)
# check static routes
run_in_container_netns ip r
assert "$output" "=~" "10.89.0.0/24 via 10.88.0.2" "static route not set"
assert "$output" "=~" "10.90.0.0/24 via 10.88.0.3" "static route not set"
assert "$output" "=~" "10.92.0.0/24 via 10.91.0.1" "static route not set"
run_in_container_netns ip -6 r
assert "$output" "=~" "fd:2f2f::/64 via fd:1f1f::20" "static route not set"
run_netavark --file ${TESTSDIR}/testfiles/ipvlan-staticroutes.json teardown $(get_container_netns_path)
assert "" "no errors"
# check static routes get removed
run_in_container_netns ip r
assert "$output" "!~" "10.89.0.0/24 via 10.88.0.2" "static route not removed"
assert "$output" "!~" "10.90.0.0/24 via 10.88.0.3" "static route not removed"
assert "$output" "!~" "10.92.0.0/24 via 10.91.0.1" "static route not removed"
run_in_container_netns ip -6 r
assert "$output" "!~" "fd:2f2f::/64 via fd:1f1f::20" "static route not removed"
run_in_container_netns ip link delete dummy0
}
@test "ipvlan setup no default route" {
run_netavark --file ${TESTSDIR}/testfiles/ipvlan-nodefaultroute.json setup $(get_container_netns_path)
run_in_container_netns ip r
assert "$output" "!~" "default" "default route exists"
run_in_container_netns ip -6 r
assert "$output" "!~" "default" "default route exists"
run_netavark --file ${TESTSDIR}/testfiles/ipvlan-nodefaultroute.json teardown $(get_container_netns_path)
assert "" "no errors"
}
@test "ipvlan setup internal" {
run_netavark --file ${TESTSDIR}/testfiles/ipvlan-internal.json setup $(get_container_netns_path)
result="$output"
mac=$(jq -r '.podman.interfaces.eth0.mac_address' <<< "$result" )
# check that interface exists
run_in_container_netns ip -j --details link show eth0
link_info="$output"
assert_json "$link_info" ".[].address" "==" "$mac" "MAC matches container mac"
assert_json "$link_info" '.[].flags[] | select(.=="UP")' "==" "UP" "Container interface is up"
assert_json "$link_info" ".[].linkinfo.info_kind" "==" "ipvlan" "Container interface is a ipvlan device"
ipaddr="10.88.0.2/16"
run_in_container_netns ip addr show eth0
assert "$output" "=~" "$ipaddr" "IP address matches container address"
assert_json "$result" ".podman.interfaces.eth0.subnets[0].ipnet" "==" "$ipaddr" "Result contains correct IP address"
# internal ipvlan must not contain
run_in_container_netns ip r
assert "$output" !~ 'default' "ipvlan must not contain default gateway in route at all"
}
@test "ipvlan setup with mtu" {
run_netavark --file ${TESTSDIR}/testfiles/ipvlan-mtu.json setup $(get_container_netns_path)
result="$output"
mac=$(jq -r '.podman.interfaces.eth0.mac_address' <<< "$result" )
# check that interface exists
run_in_container_netns ip -j --details link show eth0
link_info="$output"
assert_json "$link_info" ".[].mtu" "==" "1400" "MTU matches configured MTU"
assert_json "$link_info" ".[].address" "==" "$mac" "MAC matches container mac"
assert_json "$link_info" '.[].flags[] | select(.=="UP")' "==" "UP" "Container interface is up"
assert_json "$link_info" ".[].linkinfo.info_kind" "==" "ipvlan" "Container interface is a ipvlan device"
ipaddr="10.88.0.2"
run_in_container_netns ip -j addr show eth0
link_info="$output"
assert_json "$link_info" ".[].addr_info[0].local" "==" "$ipaddr" "IP address matches container address"
assert_json "$link_info" ".[].addr_info[0].prefixlen" "==" "16" "IP prefix matches container subnet"
assert_json "$result" ".podman.interfaces.eth0.subnets[0].ipnet" "==" "$ipaddr/16" "Result contains correct IP address"
}
@test "ipvlan modes" {
for mode in l2 l3 l3s; do
# echo here so we know which test failed
echo "mode $mode"
read -r -d '\0' config <<EOF
{
"container_id": "someID",
"container_name": "someName",
"networks": {
"podman": {
"static_ips": [
"10.88.0.2"
],
"interface_name": "eth0"
}
},
"network_info": {
"podman": {
"name": "podman",
"id": "2f259bab93aaaaa2542ba43ef33eb990d0999ee1b9924b557b7be53c0b7a1bb9",
"driver": "ipvlan",
"network_interface": "dummy0",
"subnets": [
{
"subnet": "10.88.0.0/16",
"gateway": "10.88.0.1"
}
],
"ipv6_enabled": false,
"internal": false,
"dns_enabled": false,
"ipam_options": {
"driver": "host-local"
},
"options": {
"mode": "$mode"
}
}
}
}\0
EOF
run_netavark setup $(get_container_netns_path) <<<"$config"
run_in_container_netns ip -j --details link show eth0
link_info="$output"
assert_json "$link_info" ".[].mtu" "==" "1500" "MTU matches expected MTU"
assert_json "$link_info" '.[].flags[] | select(.=="UP")' "==" "UP" "Container interface is up"
assert_json "$link_info" ".[].linkinfo.info_kind" "==" "ipvlan" "Container interface is a ipvlan device"
assert_json "$link_info" ".[].linkinfo.info_data.mode" "==" "$mode" "Container interface has correct ipvlan mode"
run_netavark teardown $(get_container_netns_path) <<<"$config"
done
}
@test "ipvlan ipam none" {
read -r -d '\0' config <<EOF
{
"container_id": "someID",
"container_name": "someName",
"networks": {
"podman": {
"interface_name": "eth0"
}
},
"network_info": {
"podman": {
"name": "podman",
"id": "2f259bab93aaaaa2542ba43ef33eb990d0999ee1b9924b557b7be53c0b7a1bb9",
"driver": "ipvlan",
"network_interface": "dummy0",
"subnets": [],
"ipv6_enabled": false,
"internal": false,
"dns_enabled": false,
"ipam_options": {
"driver": "none"
}
}
}
}\0
EOF
run_netavark setup $(get_container_netns_path) <<<"$config"
result="$output"
mac=$(jq -r '.podman.interfaces.eth0.mac_address' <<< "$result" )
# check that interface exists
run_in_container_netns ip -j link show eth0
link_info="$output"
assert_json "$link_info" ".[].address" "==" "$mac" "MAC matches container mac"
assert_json "$link_info" '.[].flags[] | select(.=="UP")' "==" "UP" "Container interface is up"
run_in_container_netns ip -j --details addr show eth0
assert_json "$link_info" ".[].addr_info" "==" "null" "No ip addresses configured"
# check gateway assignment
run_in_container_netns ip r
assert "$output" "==" "" "No routes configured"
}
@test "ipvlan same interface name on host" {
read -r -d '\0' config <<EOF
{
"container_id": "someID",
"container_name": "someName",
"networks": {
"podman": {
"static_ips": [
"10.88.0.2"
],
"interface_name": "eth0"
}
},
"network_info": {
"podman": {
"name": "podman",
"id": "2f259bab93aaaaa2542ba43ef33eb990d0999ee1b9924b557b7be53c0b7a1bb9",
"driver": "ipvlan",
"network_interface": "eth0",
"subnets": [
{
"subnet": "10.88.0.0/16",
"gateway": "10.88.0.1"
}
],
"ipv6_enabled": false,
"internal": false,
"dns_enabled": false,
"ipam_options": {
"driver": "host-local"
}
}
}
}\0
EOF
run_in_host_netns ip link add eth0 type dummy
run_netavark setup $(get_container_netns_path) <<<"$config"
run_in_container_netns ip link show eth0
run_netavark teardown $(get_container_netns_path) <<<"$config"
}
@test "ipvlan same interface name on container" {
read -r -d '\0' config <<EOF
{
"container_id": "someID",
"container_name": "someName",
"networks": {
"podman": {
"static_ips": [
"10.88.0.2"
],
"interface_name": "eth0"
}
},
"network_info": {
"podman": {
"name": "podman",
"id": "2f259bab93aaaaa2542ba43ef33eb990d0999ee1b9924b557b7be53c0b7a1bb9",
"driver": "ipvlan",
"network_interface": "dummy0",
"subnets": [
{
"subnet": "10.88.0.0/16",
"gateway": "10.88.0.1"
}
],
"ipv6_enabled": false,
"internal": false,
"dns_enabled": false,
"ipam_options": {
"driver": "host-local"
}
}
}
}\0
EOF
run_in_container_netns ip link add eth0 type dummy
expected_rc=1 run_netavark setup $(get_container_netns_path) <<<"$config"
# make sure the tmp interface is not leaked on the host or netns
run_in_host_netns ip -o link show
assert "${#lines[@]}" == 2 "only two interfaces (lo, dummy0) on the host, the tmp ipvlan interface should be gone"
run_in_container_netns ip -o link show
assert "${#lines[@]}" == 2 "only two interfaces (lo, eth0) in the netns, the tmp ipvlan interface should be gone"
}