Files
infix/test/case/ietf_system/upgrade/test.py
T
Joachim Wiberg 44d37808f1 test/case: use 9pm 'name:' for all test names
To reduce the duplication of effort between 9pm and the Infamy framework
this change consolidates the move from local 'infamy: title:' extension
to 9pm 'name:'.

For the parameterized tunnel tests we leverage the 9pm dynamic test-spec
variable, which looks for a correspodning <case>.adoc instead of static
Readme.adoc, when generating the test report.

Each test documentation should cover all aspects of the test, much like
the usage text of a UNIX program.  To this end, the tunnel test docs are
now more spelled out, including all invariants.

Some refactoring of these tests were also necessary, e.g., replacing any
reserved Python keywords like 'type', and other PEP-8 fixes.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-09-15 14:26:06 +02:00

144 lines
4.4 KiB
Python
Executable File

#!/usr/bin/env python3
"""
System upgrade
Verify system upgrade functionality.
"""
# NOTE: THIS TEST IS HARDCODED TO NETCONF
# There is a bug somewhere in the restconf-code (infamy or rousette)
import os
import time
import netifaces
import infamy
import infamy.file_server as srv
from infamy.util import wait_boot, until
SRVPORT = 8008
BUNDLEDIR = os.path.join(
os.path.dirname(__file__),
"bundles"
)
bootloader=None
PKGPATH = os.path.join(
BUNDLEDIR,
"package"
)
def get_boot_order(target):
oper = target.get_dict("/system-state/software")
return " ".join(oper["system-state"]["software"]["boot-order"])
def set_boot_order(target, order):
target.call_dict("infix-system", {
"set-boot-order": {
"boot-order": order.split(" ")
}
})
def cleanup(env, old_bootorder):
print(f"Restore boot order to {old_bootorder}")
target = env.attach("target", "mgmt", "netconf")
set_boot_order(target, old_bootorder)
target.reboot()
if not wait_boot(target, env):
test.fail()
target = env.attach("target", "mgmt", "netconf")
print("Verify the boot order is the orignal configured")
order = get_boot_order(target)
assert order == old_bootorder, f"Unexpected bootorder: {repr(order)}"
with infamy.Test() as test:
with test.step("Set up topology and attach to target DUT"):
env = infamy.Env()
if not env.args.package:
print("No package supplied")
test.skip()
try:
os.unlink(PKGPATH)
except FileNotFoundError:
pass
#os.unlink(PKGPATH)
os.symlink(os.path.abspath(env.args.package), PKGPATH)
target = env.attach("target", "mgmt", "netconf")
old_bootorder=get_boot_order(target)
print(f"Initial bootorder: {repr(old_bootorder)}")
_, hport = env.ltop.xlate("host", "data")
_, tport = env.ltop.xlate("target", "data")
test.push_test_cleanup(lambda: cleanup(env, old_bootorder))
netns = infamy.IsolatedMacVlan(hport).start()
netns.addip("192.168.0.1")
target.put_config_dicts({
"ietf-interfaces": {
"interfaces": {
"interface": [
{
"name": tport,
"ipv4": {
"address": [
{
"ip": "192.168.0.2",
"prefix-length": 24
}
]
}
}
]
}
}
})
netns.must_reach("192.168.0.2")
with srv.FileServer(netns, "192.168.0.1", SRVPORT, BUNDLEDIR):
with test.step("Start installation of selected package"):
print(f"Installing {os.path.basename(env.args.package)}")
target.call_dict("infix-system", {
"install-bundle": {
"url": f"http://192.168.0.1:{SRVPORT}/package",
}
})
with test.step("Wait for upgrade to finish"):
for _ in range(600):
oper = target.get_dict("/system-state/software")
installer = oper["system-state"]["software"]["installer"]
if installer["operation"] == "idle":
print(installer)
if "last-error" in installer:
print("Install failed:", installer["last-error"])
test.fail()
break
time.sleep(1)
else:
print("Timeout, last state:", oper)
test.fail()
with test.step("Verify boot order has changed and reboot"):
print(get_boot_order(target))
print(old_bootorder)
assert(old_bootorder != get_boot_order(target))
target.reboot()
if not wait_boot(target, env):
test.fail()
target = env.attach("target", "mgmt", "netconf")
with test.step("Verify that the partition is the booted"):
should_boot=get_boot_order(target).split()[0]
oper = target.get_dict("/system-state/software")
booted = oper["system-state"]["software"]["booted"]
print(f"Should boot: {should_boot}, booted: {booted}")
assert(booted == should_boot)
test.succeed()