bug(#21/#17): make test-netns-ci падает в контейнере — ip netns exec: "mount of /sys failed: Operation not permitted"
#56
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Найдено QA-ревью PR #53 (ветка
feat/21-dev-stand, HEADf5e8272c). Контейнерный путь netns-стенда — единственный артефакт PR, который не работает; хостовый путь (make test-netns) проходит 8/8.Шаги воспроизведения
На Docker-хосте
192.168.1.147(Docker 29.4.1, kernel 6.17.13-2-pve, iproute2 6.11.0 в образеawg-dash:dev), дерево = HEAD ветки:Фактический результат
ip), а не документированные коды стенда 0/1/3/4 —run.shне различает «заблокировано окружением» и «стенд сломан».docker-compose.test.yml(make test-netns-ci) заявлен в PR как «путь для CI (#17)», т.е. именно его вызовет workflow из #52/#17.Ожидаемый результат
8/8 тестов в контейнере, либо явный код 3 «заблокировано окружением» с понятным сообщением.
Диагноз (проверен на хосте)
Отказывает не
ip netns add, а последующийip netns exec: iproute2 6.11 при входе в namespace перемонтирует/sys, а в контейнере этоEPERM:awg-dash:dev)--privileged+ip netns add--privileged+ip netns execmount of /sys failed: Operation not permitted--privileged --security-opt apparmor=unconfined --security-opt seccomp=unconfined+exec--privileged --volume /sys:/sys+exec--cap-add SYS_ADMIN,NET_ADMIN --volume /sys:/sys+exec--privileged+ip netns add+nsenter --net=/var/run/netns/<ns>То есть
privileged: trueвdeploy/docker-compose.test.ymlсам по себе недостаточен: проблема вip netns exec, а не в правах.Варианты исправления
tests/netns/lib.sh,tests/netns/netns_common.py) ходить в namespace черезnsenter --net=/var/run/netns/<ns>вместоip netns exec— проба выше проходит; проверено, чтоnsenterесть в образе.ip netns exec→ exit 3 с сообщением, а CI (#17) вызывает стенд на хосте.test-netns-ciк документированным (0/1/3/4).Критерии закрытия
make test-netns-ciна192.168.1.147даёт 8 ok / 0 fail/err/skip иip netns listпуст после прогона, или код 3 с внятным сообщением и записью вdeploy/VERIFICATION-21.md, что контейнерный путь отключён.deploy/VERIFICATION-21.mdсодержит реальный прогон этого таргета (сейчас в отчёте есть толькоmake test-netnsна хосте).Refs #21, Refs #15, связано с #17 (runner/CI)
Исправлено в PR #53 — нужен повторный прогон qa
Диагноз подтверждён
Воспроизведено на
awg-dash:dev(iproute2 6.11.0, privileged):ip netns add <ns>ip netns exec <ns> truemount of /sys failed: Operation not permitted, rc=255ip -n <ns> link set lo upmount of /sys failed: Operation not permitted, rc=255nsenter --net=/var/run/netns/<ns> trueВажно: падает не только
ip netns exec, но иip -n <ns>— поэтому одной замены наnsenterв раннере мало, пришлось убратьip -nи изtopology.sh/netns_common.py.Что сделано
ns_exec()/ns_prefix()(tests/netns/lib.sh) иns_exec_mode()/ns_exec_direct()(tests/netns/netns_common.py): один раз пробаip netns exec, при отказе —nsenter --net=/var/run/netns/<ns>; режим форсируетсяAWG_NS_EXEC_MODE=auto|ip|nsenter(проброшен вdeploy/docker-compose.test.yml).ip -n "$NS"вtopology.sh→ns_exec "$NS" ip ...;addrs()/links()/link_is_up()→ черезns_sh().ip netns deleteвызывается безусловно и результат проверяется до 5 раз — в контейнере удаление иногда «терялось», из-за чегоrun.shотдавал код 4 на зелёных тестах (флак 1 из 5).0/1/3/4:trap ... ERRвrun.sh/topology.shнормализует непредвиденные коды утилит (255) в 4; ошибки мока/sink — тоже 4; нет прав — 3; упавшие тесты — 1.Проверено (дерево ветки, 22/22 blob-SHA, хост 192.168.1.147)
make test-netns-ciвход в netns: nsenter, backend iptables, 8 ok / 0 fail, топология снесена--privileged[blocked] не удалось создать netns …)AWG_NS_EXEC_MODE=ipв контейнереmount of /sys failed→ 255 нормализован в 4)make test-netns(хост)DoD «тесты ≥70 %» (второй блокер ревью)
tests/deploy/pytest.ini+.coveragerc(свой профиль для стенда), тесты наapi_stub.py(9) и негативные наvalidate_compose.py(39),make test-deploy: 51 passed, coverage 98.86 %, RC=0 без--no-cov. Детали —deploy/VERIFICATION-21.md§6.Оставляю issue открытым до повторного прогона qa-engineer. Merge — за TechLead (ADVISORY).
Refs #21, Refs #56
Критерии закрытия #56 выполнены (раунд 3, PR #53)
Дерево ветки
feat/21-dev-stand@a3396b2b, прогоны на192.168.1.147.0/1/3/4доходит до пайплайна без make — точка входаtests/netns/ci.sh:bash tests/netns/ci.sh→ 0 (8 ok, nsenter);AWG_NS_EXEC_MODE=ip …→ 4;AWG_NS_PRIVILEGED=0 …→ 3;синтетический падающий тест → 1.
2уci.shозначает сломанный вызов/нет docker/образа — не путается с 3.make test-netns-ciпри контейнерных 4 и 1 возвращает 2(
make: *** Error 4/1), правило описано вdeploy/VERIFICATION-21.md§6.1 и в комментарии таргета Makefile.AWG_NS_EXEC_MODEработает как документирован —NETNS_EXEC_MODE ?= $(if $(AWG_NS_EXEC_MODE),$(AWG_NS_EXEC_MODE),auto);AWG_NS_EXEC_MODE=ip make test-netns-ci→[ci] … режим netns=ip, код 4.Гейт покрытия по DoD не отменялся:
make test-deploy→ 51 passed, coverage 98.86 % без--no-cov.Отчёт:
deploy/VERIFICATION-21.md§7, лог прогонов/opt/awg-dash-dev/verify-r3-final-1793213957.log.Если со стороны QA возражений нет — #56 можно закрывать; финальное решение по merge PR #53 за TechLead.
Refs #21
Закрыто — критерии выполнены (QA, раунд 3 ревью PR #53)
Дерево = head
a3396b2b, взято архивом Gitea по точному SHA и прогнано на192.168.1.147в отдельном каталоге (не копия автора).bash tests/netns/ci.shRan 8 tests, 8 ok, 5.52 s,вход в netns: nsenter)AWG_NS_EXEC_MODE=ip bash tests/netns/ci.shmount of /sys failed→[warn] код 255 → 4)AWG_NS_PRIVILEGED=0 bash tests/netns/ci.sh[blocked] нет CAP_NET_ADMIN/SYS_ADMIN)9 tests, 8 ok, 1 fail)AWG_NS_EXEC_MODE=ip make test-netns-cimake: *** Error 4, make=2; описано вVERIFICATION-21.md§6.1python3 -m pytest tests/deploy -c tests/deploy/pytest.ini(без--no-cov)AWG_NS_EXEC_MODEприоритетнее make-алиаса[netns] вход в netns: ipПобочно проверено:
make test-netns— 8 ok / 0 fail (5.46 s);shellcheckиvalidate_compose— rc=0; после прогоновip netns listпуст, probe-контейнеров не осталось.Блокирующих дефектов нет. Закрываю. Детали ревью — PR #53 issuecomment-701. Остаётся внешний пункт DoD «CI green» (#52/#17): на момент проверки CI красный repo-wide — в run 37 падают все шаги, включая
checkout.