diff --git a/test/case/infix_containers/container_environment/test.py b/test/case/infix_containers/container_environment/test.py index f571fcfb..eb2d5189 100755 --- a/test/case/infix_containers/container_environment/test.py +++ b/test/case/infix_containers/container_environment/test.py @@ -3,27 +3,32 @@ Container environment variables Verify that environment variables can be set in container configuration -and are available inside the running container. Tests the 'env' list -functionality by: +and are available inside the running container. -1. Creating a container with multiple environment variables -2. Using a custom script to extract env vars and serve them via HTTP -3. Fetching the served content to verify environment variables are set correctly - -Uses the nftables container image with custom rc.local script. +1 Set up a container config with multiple environment variables +2. Serve variables back to host using a CGI script in container +3. Verify served content against environment variables """ import infamy from infamy.util import until, to_binary with infamy.Test() as test: + ENV_VARS = [ + {"key": "TEST_VAR", "value": "hello-world"}, + {"key": "APP_PORT", "value": "8080"}, + {"key": "DEBUG_MODE", "value": "true"}, + {"key": "PATH_WITH_SPACES", "value": "/path with spaces/test"} + ] NAME = "web-env" DUTIP = "10.0.0.2" OURIP = "10.0.0.1" + url = infamy.Furl(f"http://{DUTIP}:8080/cgi-bin/env.cgi") with test.step("Set up topology and attach to target DUT"): env = infamy.Env() target = env.attach("target", "mgmt") + _, hport = env.ltop.xlate("host", "data") if not target.has_model("infix-containers"): test.skip() @@ -44,44 +49,33 @@ with infamy.Test() as test: } }) - with test.step("Create container with environment variables"): - script = to_binary("""#!/bin/sh -# Create HTTP response with environment variables -printf "HTTP/1.1 200 OK\\r\\n" > /var/www/response.txt -printf "Content-Type: text/plain\\r\\n" >> /var/www/response.txt -printf "Connection: close\\r\\n\\r\\n" >> /var/www/response.txt + with test.step("Set up container with environment variables"): + cgi = [ + '#!/bin/sh', + '# CGI script to output environment variables', + 'echo "Content-Type: text/plain"', + 'echo ""' + ] -# Add environment variables using printf to control encoding -printf "TEST_VAR=\\"%s\\"\\n" "$TEST_VAR" >> /var/www/response.txt -printf "APP_PORT=%s\\n" "$APP_PORT" >> /var/www/response.txt -printf "DEBUG_MODE=\\"%s\\"\\n" "$DEBUG_MODE" >> /var/www/response.txt -printf "PATH_WITH_SPACES=\\"%s\\"\\n" "$PATH_WITH_SPACES" >> /var/www/response.txt - -while true; do - nc -l -p 8080 < /var/www/response.txt 2>>/var/www/debug.log || sleep 1 -done -""") + for var in ENV_VARS: + cgi.append(f'echo "{var["key"]}=${var["key"]}"') target.put_config_dict("infix-containers", { "containers": { "container": [ { "name": f"{NAME}", - "image": f"oci-archive:{infamy.Container.NFTABLES_IMAGE}", - "env": [ - {"key": "TEST_VAR", "value": "hello-world"}, - {"key": "APP_PORT", "value": "8080"}, - {"key": "DEBUG_MODE", "value": "true"}, - {"key": "PATH_WITH_SPACES", "value": "/path with spaces/test"} - ], + "image": f"oci-archive:{infamy.Container.HTTPD_IMAGE}", + "command": "/usr/sbin/httpd -f -v -p 8080", + "env": ENV_VARS, "network": { "host": True }, "mount": [ { - "name": "rc.local", - "content": script, - "target": "/etc/rc.local", + "name": "env.cgi", + "content": to_binary('\n'.join(cgi) + '\n'), + "target": "/var/www/cgi-bin/env.cgi", "mode": "0755" } ], @@ -98,20 +92,17 @@ done c = infamy.Container(target) until(lambda: c.running(NAME), attempts=60) - with test.step("Verify environment variables are available via HTTP"): - _, hport = env.ltop.xlate("host", "data") - url = infamy.Furl(f"http://{DUTIP}:8080/env.html") + with infamy.IsolatedMacVlan(hport) as ns: + ns.addip(OURIP) - with infamy.IsolatedMacVlan(hport) as ns: - ns.addip(OURIP) + with test.step("Verify basic connectivity to data interface"): + ns.must_reach(DUTIP) - with test.step("Verify basic connectivity to data interface"): - ns.must_reach(DUTIP) + with test.step("Verify environment variables in CGI response"): + expected_strings = [] + for var in ENV_VARS: + expected_strings.append(f'{var["key"]}={var["value"]}') - with test.step("Verify environment variables in HTTP response"): - until(lambda: url.nscheck(ns, "TEST_VAR=\"hello-world\""), attempts=10) - until(lambda: url.nscheck(ns, "APP_PORT=8080"), attempts=10) - until(lambda: url.nscheck(ns, "DEBUG_MODE=\"true\""), attempts=10) - until(lambda: url.nscheck(ns, "PATH_WITH_SPACES=\"/path with spaces/test\""), attempts=10) + until(lambda: url.nscheck(ns, expected_strings)) test.succeed() diff --git a/test/case/infix_containers/infix_containers.yaml b/test/case/infix_containers/infix_containers.yaml index 83d07fd7..b3f65e95 100644 --- a/test/case/infix_containers/infix_containers.yaml +++ b/test/case/infix_containers/infix_containers.yaml @@ -6,9 +6,8 @@ - name: container_enabled case: container_enabled/test.py -# Disabled for v25.08, new/unstable -# - name: container_environment -# case: container_environment/test.py +- name: container_environment + case: container_environment/test.py - name: container_bridge case: container_bridge/test.py