内容


在 IBM Power Systems 上的 Docker 容器中运行 STAF 和 LTP 的开源解决方案

Comments

Docker 现在是 Linux® 发行版的一个基本组件。因此,所有系统供应商在集成测试期间都需要验证内核稳定性,这很重要。通过在相同主机上的不同 Linux 发行版中运行,Docker 可以帮助验证标准回归测试。这样就可以通过在一个全自动的测试框架中运行测试,帮助显著简化 VM 基础架构和缩短测试周期。理解在容器内运行的标准测试框架和测试套件的行为也很重要。

本文将介绍如何让软件测试自动化框架 (Software Testing Automation Framework, STAF) 和 Linux 测试项目 (Linux Test Project, LTP) 测试框架在 Docker 容器内运行。这些 Docker 容器在 IBM® Power Systems™ 上的受支持 Linux 发行版上运行。STAF 和 LTP 框架是一个被广泛使用的回归测试组合,用于验证 Linux 发行版上的 Linux 内核和 glibc 组件的行为。

软件测试自动化框架 (STAF)

软件测试自动化框架 (STAF) 是一个开源框架,它包含一组特别适合构造自动化解决方案的内置服务。服务是可重用的组件,它们提供了 STAF 中的所有功能。每个 STAF 服务都提供了一组特定功能,比如日志记录和监视、文件系统操作、进程调用,以及资源管理。

STAF 执行引擎 (STAX) 是另一个基本组件,它基于 STAF、XML 和 Python 而构建,用于自动化测试案例的工作负载分布、执行、结果分析和并行处理。

Linux 测试项目 (LTP)

Linux 测试项目 (LTP) 是一个开源自动化内核测试套件,被设计用于验证 Linux 的可靠性、稳健性和稳定性。它主要关注 Linux 内核和相关特性的功能、回归和压力测试。

Docker

Docker 是一个基于 Linux 容器的开源项目。它使用命名空间和控制组等 Linux 内核特性在操作系统上创建容器。

前提条件

本节列出了在 Docker 中运行 STAF 和 LTP 需要满足的前提条件。

操作系统级别要求

要安装 Docker,需要 64 位版的 Linux 内核。受支持的 Linux 发行版如下:

  • Ubuntu - Trusty 14.04、Xenial 16.04、Yakkety 16.10 及更高版本
  • SLES - SLES 12.x 及更高版本
  • RHEL - RHEL 7 及更高版本

开源镜像

要创建 LTP 镜像和 STAF 镜像,需要以下资源:

  • LTP 测试套件
  • 最新的 STAF/STAX 源代码
  • 开源 Java
  • 示例 ltp.xml 文件

如何构建 STAF 和 LTP Docker 镜像

本节将介绍构建 Docker 镜像的两种方法。第一种方法将介绍如何在容器内手动安装、配置和启动所需的 STAF 和 LTP 服务,并使用 docker commit 命令提交它们。这是第一次配置任何在 Docker 中运行的新软件的首选方法。

第二种方法使用了 Docker 文件来自动配置第一部分中介绍的步骤。这是大多数 Docker 部署项目都在使用的推荐方法。但是,第一种方法的目的是在第一次执行配置时解决依赖关系和其他挑战。

使用 Docker commit 创建 Docker 镜像

安装前面提到的所有 Linux 发行版后,执行以下步骤来创建一个 Docker 镜像:

  1. 通过运行以下命令来创建该容器:
    docker run -i -t --privileged --name=ltptest --hostname=ltptest ppc64le/ubuntu /bin/bash
  2. 下载 LTP 测试案例并复制到该容器。
    在主机上完成以下步骤,以便下载并构建 LTP 测试桶,然后将 LTP 测试案例复制到 Docker 容器:
    1. http://linux-test-project.github.io/ 将最新的稳定 LTP 测试套件下载到主机。本例中下载了 ltp-full-20160920。
    2. 运行以下命令来解压 tar.gz 或 .bz2 ltp 包。运行该命令后,可以在 ltp-full-20160920 中的 INSTALL 文件中看到安装过程的更多信息。
      tar jxvf ltp-full-20120104.tar.bz2 or tar zxvf ltp-full-20120104.tar.gz
    3. 运行以下命令,以便更改到 LTP 目录:
      cd ltp-full-20160920
    4. 运行以下命令来检查配置选项:
      ./configure --help
    5. 运行以下命令,以便在 IBM Power Systems 服务器上构建 64 位 LTP:
      [ltp-full-20160920]# ./configure --prefix=`pwd` --with-open-posix-testsuite CC="gcc -   m64" 
       	[ltp-full-20160920]# make all
      	[ltp-full-20160920]# make install
    6. 将 LTP 测试案例复制到该容器。
      测试案例在主机中的位置:/root/ltp-full-20160920
      cd /root/ltp-full-20160920
      docker cp . ltptest:/usr/local/ltp
  3. 要下载、配置并在容器内启动 STAF,请完成以下步骤:
    1. 访问 https://sourceforge.net/projects/staf/files/ 链接,分别从 staf stax 目录下载 STAF 和 STAX 文件。
      例如,所需的文件是 STAF3425-setup-linux-ppc64le.bin 和 STAXV3517。
    2. 运行以下命令来解压 STAX:
       tar -xvf STAXV3517.tar
    3. 运行以下命令,将 STAF3425-setup-linux-ppc64le.bin 和 STAX 从主机复制到容器:
      docker cp STAF3425-setup-linux-ppc64le.bin <container-id>:/root/
      docker cp stax <container-id>:/root/

      从步骤 d 开始,需要在 Docker 容器内继续操作。
      docker exec -it container_id /bin/bash
    4. 运行以下命令来安装 STAF:
      apt-get install -y unzip (pre-req to help STAF install) ./root/STAF3425-setup-linux-ppc64le.bin -i silent -DACCEPT_LICENSE=1
    5. 运行以下命令,以便在 /usr/local/staf/services 下创建一个目录:
      mkdir -p /usr/local/staf/ services
    6. 运行以下命令,以便将解压的 stax 复制到上面的 services 目录:
      cp -r ./stax /usr/local/staf/services/
    7. 将以下行添加到 /usr/local/staf/bin/STAF.cfg 文件中。
      SERVICE STAX LIBRARY JSTAF EXECUTE /usr/local/staf/services/stax/STAX.jar \
        PARMS "EVENTGENERATION Disabled LOGTCNUMSTARTS Disabled LOGTCELAPSEDTIME Disabled LOGTCSTARTSTOP Disabled NUMTHREADS 10" OPTION JVMName=STAFJVM1 OPTION J2=-Xmx1024m
      SERVICE EVENT LIBRARY JSTAF EXECUTE /usr/local/staf/services/stax/STAFEvent.jar
    8. 删除所有旧 Java 版本(如果有)。
    9. 运行以下命令来安装开源 Java:
      apt-get install -y default-jre
      
      apt-get install -y openjdk-8-jre
    10. 将以下行添加到 /etc/profile.d/staf.sh 文件中。此外,还要将它添加到 /root/.bashrc 中。
      base_java_path='/usr/lib/jvm/java-8-openjdk-ppc64el/jre/bin'
      java_path=''  
      in_string=`export | grep PATH`
      in_string1=`echo "$in_string" | grep "declare -x PATH="`
      string=`echo "$in_string1" | grep "/usr/local/staf/bin"`
      if [ ! $? = 0 ]; then
         PATH=/usr/local/staf/bin:$PATH
      fi
      string=`echo "$in_string1" | grep "/usr/local/staf/tools"`
      if [ ! $? = 0 ]; then
         PATH=/usr/local/staf/tools:$PATH
      fi
      string=`echo "$in_string1" | grep $java_path`
      if [ ! $? = 0 ]; then
         PATH=$java_path:$PATH
      fi
      in_string1=`echo "$in_string" | grep "declare -x CLASSPATH="`
      string=`echo "$in_string1" | grep "/usr/local/staf/lib/JSTAF.jar"`
      if [ ! $? = 0 ]; then
         CLASSPATH=/usr/local/staf/lib/JSTAF.jar:$CLASSPATH
      fi
      string=`echo "$in_string1" | grep "/usr/local/staf/services/STAX.jar"`
      if [ ! $? = 0 ]; then
         CLASSPATH=/usr/local/staf/services/STAX.jar:$CLASSPATH
      fi
      string=`echo "$in_string1" | grep "/usr/local/staf/services/STAFEvent.jar"`
      if [ ! $? = 0 ]; then
         CLASSPATH=/usr/local/staf/services/STAFEvent.jar:$CLASSPATH
      fi
      string=`echo "$in_string1" | grep "/usr/local/staf/services/STAXMon.jar"`
      if [ ! $? = 0 ]; then
         CLASSPATH=/usr/local/staf/services/STAXMon.jar:$CLASSPATH
      fi
      string=`echo "$in_string" | grep "declare -x LD_LIBRARY_PATH=" | grep "/usr/local/staf/lib"`
      if [ ! $? = 0 ]; then
         LD_LIBRARY_PATH=/usr/local/staf/lib:$LD_LIBRARY_PATH
      fi
      STAFCONVDIR=/usr/local/staf/codepage
      export PATH CLASSPATH LD_LIBRARY_PATH STAFCONVDIR
      setsid /usr/local/staf/bin/STAFProc >/tmp/STAFProc.out 2>&1 &
      set -o vi
    11. 退出容器并再次登录。
  4. 下载示例 XML 文件并将其复制到容器所在位置:/usr/local/staf/xml/ltp.xml。

    可以从 sourceforge.net 网站或 github 存储库下载 ltp.xml 文件。

  5. 使用 STAF 在容器内启动 LTP 测试:
    STAF local STAX execute file /usr/local/staf/xml/ltp.xml JOBNAME ltpstaf
  6. 运行以下命令,以便从主机提交 Docker 镜像:
    docker commit <container ID> <repo name>

使用 Dockerfile 创建 Docker 镜像

Dockerfile 完成设置 STAF 框架所需的配置。Dockerfile 还会完成从 STAF 框架内运行 LTP 测试桶所需的配置。

使用从 Dockerfile 构建的镜像启动容器时,会使用 STAF 框架启动 LTP 测试。

可以在 github 存储库中找到 Dockerfile、其他配置文件,以及有关如何创建 ltp_staf Docker 容器的细节:https://github.com/ibmsoe/Dockerfiles/tree/master/ltp_staf

执行以下步骤来构建镜像:

  1. 运行以下命令,以便克隆 https://github.com/ibmsoe/Dockerfiles/tree/master/ltp_staf 网站中的 ltp_staf 目录:
    gitclone https://github.com/ibmsoe/Dockerfiles/tree/master/ltp_staf
  2. 运行 cd /STAF_LTP 命令来更改目录。
  3. 运行 docker build -t <image_name> 命令来构建 Docker 镜像。

监视 LTP 测试

要监视在容器内运行的测试,可以使用以下原生 STAF 命令。

docker exec -it <container_id> /bin/bash
STAF LOCAL STAX LIST JOBS
STAF LOCAL STAX LIST JOB <job ID> testcases

备注:测试案例结果位于 Docker 容器内的 /var/log/staf/ltp 位置。

免责声明

完整的 LTP 测试套件未经过测试,也未包含在本项目中。本项目仅展示了在 IBM Power Systems 服务器上启用 Docker、LTP 和 STAF 的部分。

以下是本项目包含的 LTP 测试案例。

表 1. LTP 测试案例
Admin_tools Stress.part2 Io_floppy Nw_under_ns
Can Stress.part3 ipc Pipes
Cap_bounds Syscalls tracing Power_management_tests
Commands Syscalls-ipc Kernel_misc Tom_tools
Connectors Timers Ltp-aiodio.part1 makefile
Containers Fs_ext4 Ltp-aiodio.part2 Pty
Controllers Fs_perms_simple Ltp-aiodio.part3 quickhit
Cpuhotplug Fs_readonly Ltp-aiodio.part4 Rpc_tests
Dio fsx Ltp-aio-stress.part1 Sched
Dma_thread_diotest hugetlb Ltp-aio-stress.part2 Scsi_debug.part1
fcntl-locktests hyperthreading mm sercurebits
fliecapts ima modules smack
fs io nptl Lvm.part2
Fs_bind Io_cd numa
Stress.part1 math Tirpc_tests
ltplite Lvm.part1

示例 XML (ltp.xml) 文件中包含 syscalls、fs、fsx、dio、mm、commands、ipc、sched、pty 和 math 测试案例。我们还修改了该 XML 文件,以包含上述测试案例。编辑 ltp.xml 文件中的 RUNTEST 变量。

例如:

"RUNTEST" default="['lvm.part2','power_management_tests','power_management_tests_exclusive','quickhit','scsi_debug.part1','securebits','smack','stress.part2','stress.part3']"

备注:在 LTP、STAF、STAX 和 Java 构建版本发生变化时,这些目录也会发生相应变化。如果系统位于私有网络中,您需要添加相关的代理或存储库。

致谢

感谢 Linux 技术中心的 STSM、Power 云和 Docker 架构师 Pradipta K Banerjee,他为本文的发表提供了许多指导和帮助。

相关参考资料


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux, Open source
ArticleID=1049217
ArticleTitle=在 IBM Power Systems 上的 Docker 容器中运行 STAF 和 LTP 的开源解决方案
publish-date=08312017