mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-27 11:13:02 +02:00
100 lines
3.5 KiB
Python
Executable File
100 lines
3.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Container Basic
|
|
|
|
Verify that a simple web server container can be configured to run
|
|
with host networking, on port 80. Operation is verified using a
|
|
simple GET request for index.html and checking for a key phrase.
|
|
|
|
The RPC actions: stop + start, and restart are also verified.
|
|
"""
|
|
import infamy
|
|
from infamy.util import until, curl
|
|
|
|
|
|
def _verify(server, silent=False):
|
|
# TODO: Should really use mDNS here....
|
|
url = f"http://[{server}]:91/index.html"
|
|
response = curl(url, silent=silent)
|
|
return response is not None and "It works" in response
|
|
|
|
|
|
with infamy.Test() as test:
|
|
NAME = "web"
|
|
|
|
with test.step("Set up topology and attach to target DUT"):
|
|
env = infamy.Env()
|
|
target = env.attach("target", "mgmt")
|
|
addr = target.get_mgmt_ip()
|
|
|
|
if not target.has_model("infix-containers"):
|
|
test.skip()
|
|
|
|
with test.step("Set hostname to 'container-host'"):
|
|
target.put_config_dicts({
|
|
"ietf-system": {
|
|
"system": {
|
|
"hostname": "container-host"
|
|
}
|
|
}
|
|
})
|
|
|
|
with test.step("Create container 'web' from bundled OCI image"):
|
|
target.put_config_dicts({
|
|
"infix-containers": {
|
|
"containers": {
|
|
"container": [
|
|
{
|
|
"name": f"{NAME}",
|
|
"image": f"oci-archive:{infamy.Container.HTTPD_IMAGE}",
|
|
"command": "/usr/sbin/httpd -f -v -p 91",
|
|
"network": {
|
|
"host": True
|
|
},
|
|
"resource-limit": {
|
|
"memory": 512, # 512 KiB
|
|
"cpu": 500 # 50% of one CPU (0.5 cores)
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
})
|
|
|
|
with test.step("Verify container 'web' has started"):
|
|
c = infamy.Container(target)
|
|
until(lambda: c.running(NAME), attempts=60)
|
|
|
|
with test.step("Verify container 'web' is reachable on http://container-host.local:91"):
|
|
until(lambda: _verify(addr, silent=True), attempts=10)
|
|
|
|
with test.step("Verify resource constraints and usage are available"):
|
|
data = target.get_data("/infix-containers:containers")
|
|
containers = data.get("containers", {}).get("container", [])
|
|
web = next((c for c in containers if c["name"] == NAME), None)
|
|
|
|
limits = web.get("resource-limit", {})
|
|
assert limits.get("memory") == 512, "Memory limit not set correctly"
|
|
assert limits.get("cpu") == 500, "CPU limit not set correctly"
|
|
|
|
rusage = web.get("resource-usage", {})
|
|
assert rusage is not None, "Resource usage data not available"
|
|
|
|
mem_used = rusage.get("memory")
|
|
assert mem_used is not None, "Memory usage not reported"
|
|
print(f"Container using {mem_used} KiB memory")
|
|
|
|
with test.step("Stop container 'web'"):
|
|
c = infamy.Container(target)
|
|
c.action(NAME, "stop")
|
|
|
|
with test.step("Verify container 'web' is stopped"):
|
|
until(lambda: not c.running(NAME), attempts=30)
|
|
|
|
with test.step("Restart container 'web'"):
|
|
c.action(NAME, "restart")
|
|
|
|
with test.step("Verify container 'web' is reachable on http://container-host.local:91"):
|
|
# Wait for it to restart and respond, or fail
|
|
until(lambda: _verify(addr, silent=True), attempts=60)
|
|
test.succeed()
|