#!/bin/sh

set -e

. ./helpers

ME=$(basename $0)

setup_sandbox

run_net start
assert_eq "ikvswitch-host-networking start rc" "${NET_RC}" "0"
segment "${SANDBOX}/created.log"

run_net stop
assert_eq "ikvswitch-host-networking stop rc" "${NET_RC}" "0"
segment "${SANDBOX}/deleted.log"

# Teardown symmetry: whatever start created must be destroyed by stop,
# operation per operation. This catches a new object being created
# without a matching teardown line, which the "|| true" of stop would
# otherwise silently paper over.

awk '$1 == "addbr" { print $2 }' "${SANDBOX}/created.log" | sort >"${SANDBOX}/created-bridges"
awk '$1 == "delbr" { print $2 }' "${SANDBOX}/deleted.log" | sort >"${SANDBOX}/deleted-bridges"
if ! cmp -s "${SANDBOX}/created-bridges" "${SANDBOX}/deleted-bridges" ; then
	echo "${ME}: bridge teardown is not symmetric with creation"
	diff "${SANDBOX}/created-bridges" "${SANDBOX}/deleted-bridges"
	exit 1
fi

awk '$1 == "addif" { print $2, $3 }' "${SANDBOX}/created.log" | sort >"${SANDBOX}/created-ports"
awk '$1 == "delif" { print $2, $3 }' "${SANDBOX}/deleted.log" | sort >"${SANDBOX}/deleted-ports"
if ! cmp -s "${SANDBOX}/created-ports" "${SANDBOX}/deleted-ports" ; then
	echo "${ME}: port removal is not symmetric with enslavement"
	diff "${SANDBOX}/created-ports" "${SANDBOX}/deleted-ports"
	exit 1
fi

awk '$1 == "tuntap" && $2 == "add" { print $4 }' "${SANDBOX}/created.log" | sort >"${SANDBOX}/created-taps"
awk '$1 == "tuntap" && $2 == "delete" { print $5 }' "${SANDBOX}/deleted.log" | sort >"${SANDBOX}/deleted-taps"
if ! cmp -s "${SANDBOX}/created-taps" "${SANDBOX}/deleted-taps" ; then
	echo "${ME}: TAP teardown is not symmetric with creation"
	diff "${SANDBOX}/created-taps" "${SANDBOX}/deleted-taps"
	exit 1
fi

awk '$1 == "link" && $2 == "add" { print $3 }' "${SANDBOX}/created.log" | sort >"${SANDBOX}/created-links"
awk '$1 == "link" && $2 == "delete" { print $3 }' "${SANDBOX}/deleted.log" | sort >"${SANDBOX}/deleted-links"
if ! cmp -s "${SANDBOX}/created-links" "${SANDBOX}/deleted-links" ; then
	echo "${ME}: link teardown is not symmetric with creation"
	diff "${SANDBOX}/created-links" "${SANDBOX}/deleted-links"
	exit 1
fi

# The host bridge and IPMI addresses are also removed.
grep -Fq 'addr replace 192.168.200.1/24 dev bripmi' "${SANDBOX}/created.log" || {
	echo "${ME}: IPMI bridge address not set on start"
	exit 1
}
grep -Fq 'addr del 192.168.96.1/24 dev ikhb' "${SANDBOX}/deleted.log" || {
	echo "${ME}: host bridge address not removed on stop"
	exit 1
}
grep -Fq 'addr delete 192.168.200.1/24 dev bripmi' "${SANDBOX}/deleted.log" || {
	echo "${ME}: IPMI bridge address not removed on stop"
	exit 1
}

exit 0
