openeuler-riscv / oerv-team

OERV 实习生工作中心
11 stars 43 forks source link

[mugen_2403 round1]处理mugen测试套 openvpn 失败的测试用例 #518

Open jiewu9823 opened 7 months ago

jiewu9823 commented 7 months ago

需求:

  1. 2403_mugen失败测试用例清单 中找到测试套 openvpn 失败的测试用例
  2. openEuler RISC-V 24.03 版本最新的镜像上 double check mugen 中 openvpn 测试套里的测试用例,并在openEuler x86 24.03 LTS 版本镜像上做对比验证
  3. 定位失败的原因,并做出相应的处理: 如果确认是 riscv 架构的问题,向 src-openeuler 里对应的软件包仓库里提交 issue 如果是 mugen 测试用例的问题,修复测试用例后,向 mugen 上游提交 PR,提交 PR 时要贴上在 riscv 和 x86 两个架构的上测试结果

要求:

  1. 该项任务要求产出:

    • 分别在openEuler RISC-V 24.03 版本镜像和 openEuler x86 24.03 LTS 版本镜像上 double check 的结果,即完成需求2(必选,限制1天内完成)
    • 定位失败的原因,并做出相应的处理,即完成需求3(可选,对应薪资折半,限制2天内完成),如果无法完成,请在本 issue 的评论里说明情况,未完成的任务将重新设置为issue挂出。如果完成了该项任务,请在本 issue 评论里说明完成的情况
  2. 完成该项任务后,请在 2403_mugen失败测试用例清单 里找到相应测试套和测试用例栏位,并填写riscv复测结果,Failure Reason,Owner(填写中文名),Gitee ID,Issue/PR(填写提交issue或者PR的url),x86 测试情况。Issue/PR这个栏位可能已经填有内容,是之前在23.09版本上其他实习生同学分析的结果,供参考

说明:

  1. mugen 源码以及使用方法:https://gitee.com/openeuler/mugen
yangfan-ruan commented 4 months ago

2403_mugen失败测试用例清单 中找到测试套 openvpn 失败的测试用例

openvpn oe_test_openvpn
bash mugen.sh -c --ip 10.0.2.15 --password openEuler12#$ --user root --port 22
bash mugen.sh -c --ip 192.168.31.28 --password openEuler12#$ --user root --port 22

bash mugen.sh -f openvpn -r oe_test_openvpn -x

x86下测试失败

image-20240625194511430

riscv64下测试失败

image-20240625193323715

riscv64下检查log信息

image-20240630223642902

报错显示没有额外未使用的网卡,查看脚本信息

image-20240630223955608

其中eth_use=$(TEST_NIC 1 | grep -v -E 'lo|bond|virbr|vnet|br\\[0-9\\]|docker|br-|veth' | awk '{print $NF}')

用于获取一个可用的网络接口(网卡),并确保它不是一些特定类型的虚拟或管理接口

不需要的接口包括:

lo:本地环回接口

bond:绑定接口

virbr:虚拟桥接接口

vnet:虚拟网络接口

br[0-9]:匹配名称中包含 br 和一个数字的接口

docker:Docker 容器网络接口

br-:桥接接口

veth:虚拟以太网接口

可以看出,这些被过滤掉的接口通常是用于虚拟化、容器化或网络管理的接口,脚本中不希望使用这些接口,换句话说,满足要求的接口是物理网络接口

查找TEST_NIC的定义

function TEST_NIC() {
    id=${1-1}
    python3 "${OET_PATH}"/libs/locallibs/get_test_device.py \
        --device nic --node "$id"
}

get_test_device.py中对应的获取网卡的函数为

 def get_test_nic(node=1):
     """获取可测试使用的网卡

     Args:
         node (int, optional): 节点号. Defaults to 1.

     Returns:
         [str]: 网卡名
     """
     exitcode, tmpfile = rpm_manage.rpm_install(pkgs="lshw", node=node)
     if exitcode != 0:
         mugen_log.logging(
             "error",
             "Failed to install the dependent software package required to obtain the network card.",
         )
         sys.exit(exitcode)

     if os.environ.get("NODE" + str(node) + "_LOCALTION") == "local":
         output = subprocess.getoutput(
             "lshw -class network | grep -A 5 'description: Ethernet interface' | grep 'logical name:' | awk '{print $NF}' | grep -v '"
             + os.environ.get("NODE" + str(node) + "_NIC")
             + "'"
         ).replace("\n", " ")
     else:
         conn = ssh_cmd.pssh_conn(
             os.environ.get("NODE" + str(node) + "_IPV4"),
             os.environ.get("NODE" + str(node) + "_PASSWORD"),
             os.environ.get("NODE" + str(node) + "_SSH_PORT"),
             os.environ.get("NODE" + str(node) + "_USER"),
         )

         output = ssh_cmd.pssh_cmd(
             conn,
             "lshw -class network | grep -A 5 'description: Ethernet interface' | grep 'logical name:' | awk '{print $NF}' | grep -v '"
             + os.environ.get("NODE" + str(node) + "_NIC")
             + "'",
         )[1].replace("\n", " ")

         ssh_cmd.pssh_close(conn)

     if tmpfile is not None:
         rpm_manage.rpm_remove(node=node, tmpfile=tmpfile)

     return output

手动检查是否有满足要求的物理接口:

eth_use=$(ip link show | grep -v -E 'lo|bond|virbr|vnet|br[0-9]|docker|br-|veth' | awk -F: '/^[0-9]+: / { print $2 }' | awk '{print $1}')
echo "Filtered network interfaces: ${eth_use}"

输出结果为:

Filtered network interfaces: eth0

可见本地其实是有满足要求的物理接口的,正则表达式也正确,但是使用eth_use=$(TEST_NIC 1 | grep -v -E 'lo|bond|virbr|vnet|br\\[0-9\\]|docker|br-|veth' | awk '{print $NF}')却没有获得输出

目前不知道应该如何修改,TEST_NIC函数不能轻易修改,不理解为何没有输出

Thomas134 commented 1 month ago

这个看你个人配置的。你可以注意到上面的那一片很长的代码里面有这个

os.environ.get("NODE" + str(node) + "_NIC")

然后前面还有grep -v,默认情况node是1,如果你的env.json的第一个节点是eth0,那么这里刚好就排除了,所以你看不见任何输出。 补充一点:os.environ.get除了获取系统的环境变量,还会获取你程序运行时设置的环境变量,mugen的源码有关conf的那些函数里面就有设置了一些环境变量(在程序刚运行的时候),这些都是运行时的,程序结束就失效了。

因为我想做的issue也有这个问题,恰好发现你也遇到了。或许你可以试试环境配置的时候,第一个节点放其它设备?虚拟设备也好,然后第二个节点才是eth0,如果你只有eth0这一个物理网络接口的话。 @yangfan-ruan