#!/usr/bin/env python3
#
# Verify connectivity with a simple web server container that's been
# given a physical interface instead of an end of a VETH pair.
#

import base64
import infamy
from   infamy.util import until

with infamy.Test() as test:
    NAME  = "web-phys"
    IMAGE = "curios-httpd-edge.tar.gz"
    DUTIP = "10.0.0.2"
    OURIP = "10.0.0.1"
    URL   = f"http://{DUTIP}/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")

        target.put_config_dict("ietf-interfaces", {
            "interfaces": {
                "interface": [
                    {
                        "name": f"{ifname}",
                        "ipv4": {
                            "address": [{
                                "ip": f"{DUTIP}",
                                "prefix-length": 24
                            }]
                        },
                        "container-network": {}
                    }
                ]
            }
        })
        target.put_config_dict("infix-containers", {
            "containers": {
                "container": [
                    {
                        "name": f"{NAME}",
                        "image": f"oci-archive:{IMAGE}",
                        "network": {
                            "interface": [
                                { "name": f"{ifname}" }
                            ]
                        }
                    }
                ]
            }
        })

    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, "It works"), attempts=10)

    test.succeed()
