mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-22 01:13:00 +02:00
test/case/infix_container: refactor container-environment
Refactor test to use httpd container instead and return ENV with a CGI. Fixes #1131 Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user