diff --git a/test/case/infix_containers/all.yaml b/test/case/infix_containers/all.yaml index c4fb342d..30a7cc54 100644 --- a/test/case/infix_containers/all.yaml +++ b/test/case/infix_containers/all.yaml @@ -1,3 +1,5 @@ --- - case: container_basic.py +- case: container_bridge.py + diff --git a/test/case/infix_containers/container_bridge.py b/test/case/infix_containers/container_bridge.py new file mode 100755 index 00000000..f975c872 --- /dev/null +++ b/test/case/infix_containers/container_bridge.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +# +# Verify connectivity with a simple web server container from behind a +# docker0 bridge. As an added twist, this test also verifies content +# mounts, i.e., custom index.html from running-config. +# + +import base64 +import infamy +from infamy.util import until + +with infamy.Test() as test: + NAME = "web-docker0" + IMAGE = "curios-httpd-edge.tar.gz" + DUTIP = "10.0.0.2" + OURIP = "10.0.0.1" + BODY = "

Kilroy was here

" + URL = f"http://{DUTIP}:8080/index.html" + + with test.step("Initialize"): + env = infamy.Env(infamy.std_topology("1x2")) + target = env.attach("target", "mgmt") + + with test.step(f"Create {NAME} container from bundled OCI image"): + _, ifname = env.ltop.xlate("target", "data") + enc = base64.b64encode(BODY.encode('utf-8')) + + target.put_config_dict("ietf-interfaces", { + "interfaces": { + "interface": [ + { + "name": f"{ifname}", + "ipv4": { + "address": [{ + "ip": f"{DUTIP}", + "prefix-length": 24 + }] + } + }, + { + "name": "docker0", + "type": "infix-if-type:bridge", + "container-network": { + "type": "bridge", + "subnet": [ + { "subnet": "172.17.0.0/16" }, + { "subnet": "2a02:2789:724:eb8:1::/80" } + ] + } + } + ] + } + }) + target.put_config_dict("infix-containers", { + "containers": { + "container": [ + { + "name": f"{NAME}", + "image": f"oci-archive:{IMAGE}", + "mount": [ + { + "name": "index.html", + "content": f"{enc.decode('utf-8')}", + "target": "/var/www/index.html" + } + ], + "network": { + "interface": [ + { "name": "docker0" } + ], + "publish": [ "8080:80" ] + } + } + ] + } + }) + + with test.step(f"Verify {NAME} continer has started"): + c = infamy.Container(target) + until(lambda: c.running(NAME), attempts=10) + + with test.step(f"Verify {NAME} container responds"): + _, hport = env.ltop.xlate("host", "data") + url = infamy.Furl(URL) + + with infamy.IsolatedMacVlan(hport) as ns: + connectivity = ns.runsh(f""" + ip link set iface up + ip addr add {OURIP}/24 dev iface + + ping -c1 -w5 {DUTIP} || exit 1 + """) + if connectivity.returncode: + print(connectivity.stdout) + test.fail() + + until(lambda: url.nscheck(ns, "Kilroy was here"), attempts=10) + + test.succeed()