# Run OpenBMC Test Automation In Docker Container
## Language
[English](#English) | [中文](#中文)
## English
### Created Date
2025/03/27
### Update History
2025/06/11:Some users reported installation errors when building the Docker image, so it’s more suitable to build the QEMU tool manually instead.
### Environment
- **ISO**: `ubuntu-22.04.4-desktop-amd64.iso`
> Console output:
```shell
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
$ uname -a
Linux wilkes-evt 6.8.0-52-generic #53~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jan 15 19:18:46 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
```
### Symptom
None
### Cause
Provide an example that builds:
* [a Docker image with the openbmc-test-automation environment](#A-Docker-image-with-the-openbmc-test-automation-environment)
* [QEMU Tool](#QEMU-Tool)
And demonstrates how to perform testing on the emulator.
---
### Solution
#### Build
##### A Docker image with the openbmc-test-automation environment
1. Create a working directory.
```shell
mkdir -p ${HOME}/OpenBMC_Automation
```
2. Enter the working directory.
```shell
cd ${HOME}/OpenBMC_Automation
```
3. Clone the [openbmc-build-scripts](<https://github.com/openbmc/openbmc-build-scripts>) repository.
```shell
git clone https://github.com/openbmc/openbmc-build-scripts
```
4. Enter the repository directory.
```shell
cd openbmc-build-scripts
```
5. Start building the Docker image.
```shell
./scripts/build-qemu-robot-docker.sh
```
6. Once the build is complete, check if the Docker image has been successfully created.
```shell
docker images
```
> Console output:
```shell
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
openbmc/ubuntu-robot-qemu latest 5d73d6c8e6bb About a minute ago 2.54GB
```
##### QEMU Tool
1. Enter the working directory.
```shell
cd ${HOME}/OpenBMC_Automation
```
2. Install the required packages for building the project.
```shell
sudo apt install -y build-essential libglib2.0-dev libpixman-1-dev zlib1g-dev git python3-pip ninja-build
pip install tomli
```
3. Clone the [qemu](<https://gitlab.com/qemu-project/qemu.git>) repository.
```shell
git clone https://gitlab.com/qemu-project/qemu.git
```
4. Enter the repository directory.
```shell
cd qemu
```
5. Set up the build target to support both ARM and AARCH64 architectures.
```shell
./configure --target-list=arm-softmmu,arm-linux-user,aarch64-softmmu,aarch64-linux-user --enable-slirp
```
6. Start building the QEMU tool.
```shell
make -j$(nproc)
```
---
### Test
We use two terminals to access the **same Docker container** — one for running the emulator (QEMU), and the other for executing automated tests (openbmc-test-automation).
The reasons for this design are as follows:
- QEMU uses localhost port forwarding to provide virtual BMC services. The test tools must run in the same container environment to successfully connect via `localhost`.
- All files and tools reside within the same directory structure. Running everything inside a single container avoids issues related to incorrect paths or file synchronization.
Running all steps in the same container helps avoid the following issues:
- The complexity of configuring cross-container networking and communication
- The need to expose additional ports or configure a Docker bridge network
#### Terminal 1:the emulator (QEMU)
1. Enter the working directory.
```shell
cd ${HOME}/OpenBMC_Automation
```
2. Download a prebuilt OpenBMC image—using the [romulus image](<https://jenkins.openbmc.org/job/latest-master/label=docker-builder,target=romulus/>) as an example.
```shell
wget https://jenkins.openbmc.org/job/latest-master/label=docker-builder,target=romulus/lastSuccessfulBuild/artifact/openbmc/build/tmp/deploy/images/romulus/obmc-phosphor-image-romulus.static.mtd
```
3. Launch the Docker container.
```shell
docker run --name openbmcTest --workdir ${HOME} --volume ${HOME}/OpenBMC_Automation:${HOME} -it openbmc/ubuntu-robot-qemu /bin/bash
```
> - `--name`:Assign a name to the Docker container when starting it.
> - `--workdir`:Configure the working directory within the Docker container.
> - `--volume`:Mount the local directory `${HOME}/OpenBMC_Automation` to the working directory inside the container.
> - `-it <images> /bin/bash`:Start the container from the image and enter the Bash shell in interactive mode.
4. Run the emulator.
```shell
qemu/build/qemu-system-arm -m 256 -M romulus-bmc -nographic -drive file=./obmc-phosphor-image-romulus.static.mtd,format=raw,if=mtd -net nic -net user,hostfwd=:127.0.0.1:2222-:22,hostfwd=:127.0.0.1:2443-:443,hostfwd=udp:127.0.0.1:2623-:623,hostname=qemu
```
> - `127.0.0.1:2222` Port Forwarding for the Emulator `22` (Used for SSH)
> - `127.0.0.1:2443` Port Forwarding for the Emulator `443` (Used for HTTPS/REDFISH)
> - `127.0.0.1:2623` Port Forwarding for the Emulator `623` (Used for IPMI)
#### Terminal 2:automated tests (openbmc-test-automation)
1. Enter the working directory.
```shell
cd ${HOME}/OpenBMC_Automation
```
2. Clone the [openbmc-test-automation](<https://github.com/openbmc/openbmc-test-automation>) repository.
```shell
git clone https://github.com/openbmc/openbmc-test-automation.git
```
3. Access the previously started Docker container.
```shell
docker exec -it openbmcTest /bin/bash
```
4. Use ipmitool to verify whether the emulator is running.
```shell
ipmitool -I lanplus -C 17 -U root -P 0penBmc -H 127.0.0.1 -p 2623 mc info
```
> Console output:
```shell
$ ipmitool -I lanplus -C 17 -U root -P 0penBmc -H 127.0.0.1 -p 2623 mc info
Device ID : 0
Device Revision : 0
Firmware Revision : 2.18
IPMI Version : 2.0
Manufacturer ID : 0
Manufacturer Name : Unknown
Product ID : 0 (0x0000)
Product Name : Unknown (0x0)
Device Available : yes
Provides Device SDRs : yes
Additional Device Support :
Sensor Device
SEL Device
FRU Inventory Device
Chassis Device
Aux Firmware Rev Info :
0x00
0x00
0x00
0x00
```
> Sample commands for testing Redfish
```shell
curl -k https://root:0penBmc@localhost:2443/redfish/v1
```
> Sample commands for testing SSH
```shell
ssh -p 2222 root@127.0.0.1
```
5. Use Robot Framework to test the emulator.
```shell
robot -v OPENBMC_HOST:127.0.0.1 -v OPENBMC_PASSWORD:0penBmc -v SSH_PORT:2222 -v HTTPS_PORT:2443 -v IPMI_PORT:2623 openbmc-test-automation/templates/test_openbmc_setup.robot
```
> Console output:
```shell
$ robot -v OPENBMC_HOST:127.0.0.1 -v OPENBMC_PASSWORD:0penBmc -v SSH_PORT:2222 -v HTTPS_PORT:2443 -v IPMI_PORT:2623 openbmc-test-automation/templates/test_openbmc_setup.robot
#(UTC) 2025/03/27 02:16:55.781560 - 0.186868 - Executing: get('/redfish/v1/')
#(UTC) 2025/03/27 02:16:55.997564 - 0.216004 - Executing: get('/redfish/v1/')
#(UTC) 2025/03/27 02:16:56.068714 - 0.071150 - Executing: get('/redfish/v1/')
#(UTC) 2025/03/27 02:16:57.990623 - 1.921909 - Issuing: ipmitool -I lanplus -C 17 -N 3 -p 2623 -U root -P ********** -H 127.0.0.1 power status
rc: 0x0000000000000000
==============================================================================
Test Openbmc Setup :: Test suite to verify if the Robot setup is ready for ...
==============================================================================
Test Redfish Setup :: Verify Redfish works. .#(UTC) 2025/03/27 02:16:58.782809 - 0.792186 - Executing: get('/redfish/v1/')
.#(UTC) 2025/03/27 02:16:58.802680 - 0.019871 - Executing: delete('/redfish/v1/SessionService/Sessions/YvNO1WpNkz')
Test Redfish Setup :: Verify Redfish works. | PASS |
------------------------------------------------------------------------------
Test SSH Setup :: Verify SSH works. #(UTC) 2025/03/27 02:16:58.861828 - 0.059148 - Issuing: uname -a
root@romulus:~#
Linux romulus 6.6.84-36db6e8-00385-g36db6e8484ed #1 Mon Mar 24 02:47:12 UTC 2025 armv6l GNU/Linux
Linux romulus 6.6.84-36db6e8-00385-g36db6e8484ed #1 Mon Mar 24 02:47:12 UTC 2025 armv6l GNU/Linux
Test SSH Setup :: Verify SSH works. | PASS |
------------------------------------------------------------------------------
Test IPMI Setup :: Verify Out-of-band works. #(UTC) 2025/03/27 02:17:00.404984 - 0.014049 - Issuing: ipmitool -I lanplus -C 17 -N 3 -p 2623 -U root -P ********** -H 127.0.0.1 chassis status
.
System Power : off
Power Overload : false
Power Interlock : inactive
Main Power Fault : false
Power Control Fault : false
Power Restore Policy : always-off
Last Power Event :
Chassis Intrusion : inactive
Front-Panel Lockout : inactive
Drive Fault : false
Cooling/Fan Fault : false
Sleep Button Disable : not allowed
Diag Button Disable : not allowed
Reset Button Disable : allowed
Power Button Disable : not allowed
Sleep Button Disabled: false
Diag Button Disabled : false
Reset Button Disabled: false
Power Button Disabled: false
Test IPMI Setup :: Verify Out-of-band works. | PASS |
------------------------------------------------------------------------------
Test Openbmc Setup :: Test suite to verify if the Robot setup is r... | PASS |
3 tests, 3 passed, 0 failed
==============================================================================
Output: /home/chrisdeng/output.xml
Log: /home/chrisdeng/log.html
Report: /home/chrisdeng/report.html
```
### Extension
1. To exit the QEMU emulator: press Ctrl + a, then press the x key.
2. After running the Robot tests, the generated files output.xml, log.html, and report.html will be saved in the current directory where the command was executed.
### Reference
- [Run OpenBMC Test Automation Using Docker](<https://github.com/openbmc/docs/blob/master/testing/run-test-docker.md>)
- [在 QEMU 中运行 OpenBMC](<https://jia.je/system/2023/08/11/openbmc-qemu/#romulus>)
## 中文
### 建立日期
2025/03/27
### 更新歷史
2025/06/11:有人反應目前編譯 Docker Image 會出現安裝錯誤,所以改成自己編譯 QEMU 工具比較適合。
### 環境
- **ISO**: `ubuntu-22.04.4-desktop-amd64.iso`
> 控制台輸出:
```shell
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
$ uname -a
Linux wilkes-evt 6.8.0-52-generic #53~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jan 15 19:18:46 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
```
### 症狀
無
### 原因
提供一種範例,編譯:
* [具備 openbmc-test-automation 環境的 Docker Image](#具備-openbmc-test-automation-環境的-Docker-Image)
* [QEMU 工具](#QEMU-工具)
並且演示如何對模擬器進行測試。
---
### 解決方案
#### 建造
##### 具備 openbmc-test-automation 環境的 Docker Image
1. 建立工作目錄。
```shell
mkdir -p ${HOME}/OpenBMC_Automation
```
2. 進入工作目錄。
```shell
cd ${HOME}/OpenBMC_Automation
```
3. 下載 [openbmc-build-scripts](<https://github.com/openbmc/openbmc-build-scripts>) 儲存庫。
```shell
git clone https://github.com/openbmc/openbmc-build-scripts
```
4. 進入儲存庫目錄。
```shell
cd openbmc-build-scripts
```
5. 開始編譯 Docker Image 。
```shell
./scripts/build-qemu-robot-docker.sh
```
6. 完成後確認 Docker Image 是否存在。
```shell
docker images
```
> 控制台輸出:
```shell
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
openbmc/ubuntu-robot-qemu latest 5d73d6c8e6bb About a minute ago 2.54GB
```
##### QEMU 工具
1. 進入工作目錄。
```shell
cd ${HOME}/OpenBMC_Automation
```
2. 安裝編譯所需套件。
```shell
sudo apt install -y build-essential libglib2.0-dev libpixman-1-dev zlib1g-dev git python3-pip ninja-build
pip install tomli
```
3. 下載 [qemu](<https://gitlab.com/qemu-project/qemu.git>) 儲存庫。
```shell
git clone https://gitlab.com/qemu-project/qemu.git
```
4. 進入儲存庫目錄。
```shell
cd qemu
```
5. 配置建置目標。(支援 ARM 與 AARCH64 平台)
```shell
./configure --target-list=arm-softmmu,arm-linux-user,aarch64-softmmu,aarch64-linux-user --enable-slirp
```
6. 開始編譯 QEMU 工具。
```shell
make -j$(nproc)
```
---
### 測試
我們使用兩個終端機開啟**同一個 Docker container**,一個用來執行模擬器(QEMU),另一個用來執行自動化測試(openbmc-test-automation)。
這樣設計的原因如下:
- QEMU 使用 localhost 的 port forwarding 來提供虛擬 BMC 的服務,測試工具必須在相同的容器環境中,才能透過 `localhost` 成功連線。
- 所有檔案與工具都位於相同的目錄結構中,在同一個容器中執行可以避免路徑錯誤與檔案同步問題。
透過在同一個 container 中執行所有步驟,可以避免以下問題:
- 跨容器的網路配置與通訊複雜度
- 額外設定 port 映射或 Docker bridge network 的需求
#### 終端機 1:模擬器(QEMU)
1. 進入工作目錄。
```shell
cd ${HOME}/OpenBMC_Automation
```
2. 下載現成 OpenBMC Image ,這裡以 [romulus image](<https://jenkins.openbmc.org/job/latest-master/label=docker-builder,target=romulus/>) 為例。
```shell
wget https://jenkins.openbmc.org/job/latest-master/label=docker-builder,target=romulus/lastSuccessfulBuild/artifact/openbmc/build/tmp/deploy/images/romulus/obmc-phosphor-image-romulus.static.mtd
```
3. 啟動 Docker Container 。
```shell
docker run --name openbmcTest --workdir ${HOME} --volume ${HOME}/OpenBMC_Automation:${HOME} -it openbmc/ubuntu-robot-qemu /bin/bash
```
> - `--name`:啟動 Docker 容器時為該容器命名
> - `--workdir`:設置容器內的工作目錄(工作資料夾)
> - `--volume`:將本機目錄 `${HOME}/OpenBMC_Automation` 掛載到容器內的工作目錄
> - `-it <images> /bin/bash`:啟動映像的容器,並以交互模式進入 bash shell
4. 執行模擬器。
```shell
qemu/build/qemu-system-arm -m 256 -M romulus-bmc -nographic -drive file=./obmc-phosphor-image-romulus.static.mtd,format=raw,if=mtd -net nic -net user,hostfwd=:127.0.0.1:2222-:22,hostfwd=:127.0.0.1:2443-:443,hostfwd=udp:127.0.0.1:2623-:623,hostname=qemu
```
> - `127.0.0.1:2222` 轉發模擬器連接埠 `22` (用於SSH)
> - `127.0.0.1:2443` 轉發模擬器連接埠 `443` (用於HTTPS/REDFISH)
> - `127.0.0.1:2623` 轉發模擬器連接埠 `623` (用於IPMI)
#### 終端機 2:自動化測試(openbmc-test-automation)
1. 進入工作目錄。
```shell
cd ${HOME}/OpenBMC_Automation
```
2. 下載 [openbmc-test-automation](<https://github.com/openbmc/openbmc-test-automation>) 儲存庫。
```shell
git clone https://github.com/openbmc/openbmc-test-automation.git
```
3. 登入剛剛已啟動的 Docker Container 。
```shell
docker exec -it openbmcTest /bin/bash
```
4. 使用 ipmitool 確認模擬器是否存在。
```shell
ipmitool -I lanplus -C 17 -U root -P 0penBmc -H 127.0.0.1 -p 2623 mc info
```
> 控制台輸出:
```shell
$ ipmitool -I lanplus -C 17 -U root -P 0penBmc -H 127.0.0.1 -p 2623 mc info
Device ID : 0
Device Revision : 0
Firmware Revision : 2.18
IPMI Version : 2.0
Manufacturer ID : 0
Manufacturer Name : Unknown
Product ID : 0 (0x0000)
Product Name : Unknown (0x0)
Device Available : yes
Provides Device SDRs : yes
Additional Device Support :
Sensor Device
SEL Device
FRU Inventory Device
Chassis Device
Aux Firmware Rev Info :
0x00
0x00
0x00
0x00
```
> 測試 Redfish 的參考指令
```shell
curl -k https://root:0penBmc@localhost:2443/redfish/v1
```
> 測試 SSH 的參考指令
```shell
ssh -p 2222 root@127.0.0.1
```
5. 使用 robot 測試模擬器。
```shell
robot -v OPENBMC_HOST:127.0.0.1 -v OPENBMC_PASSWORD:0penBmc -v SSH_PORT:2222 -v HTTPS_PORT:2443 -v IPMI_PORT:2623 openbmc-test-automation/templates/test_openbmc_setup.robot
```
> 控制台輸出:
```shell
$ robot -v OPENBMC_HOST:127.0.0.1 -v OPENBMC_PASSWORD:0penBmc -v SSH_PORT:2222 -v HTTPS_PORT:2443 -v IPMI_PORT:2623 openbmc-test-automation/templates/test_openbmc_setup.robot
#(UTC) 2025/03/27 02:16:55.781560 - 0.186868 - Executing: get('/redfish/v1/')
#(UTC) 2025/03/27 02:16:55.997564 - 0.216004 - Executing: get('/redfish/v1/')
#(UTC) 2025/03/27 02:16:56.068714 - 0.071150 - Executing: get('/redfish/v1/')
#(UTC) 2025/03/27 02:16:57.990623 - 1.921909 - Issuing: ipmitool -I lanplus -C 17 -N 3 -p 2623 -U root -P ********** -H 127.0.0.1 power status
rc: 0x0000000000000000
==============================================================================
Test Openbmc Setup :: Test suite to verify if the Robot setup is ready for ...
==============================================================================
Test Redfish Setup :: Verify Redfish works. .#(UTC) 2025/03/27 02:16:58.782809 - 0.792186 - Executing: get('/redfish/v1/')
.#(UTC) 2025/03/27 02:16:58.802680 - 0.019871 - Executing: delete('/redfish/v1/SessionService/Sessions/YvNO1WpNkz')
Test Redfish Setup :: Verify Redfish works. | PASS |
------------------------------------------------------------------------------
Test SSH Setup :: Verify SSH works. #(UTC) 2025/03/27 02:16:58.861828 - 0.059148 - Issuing: uname -a
root@romulus:~#
Linux romulus 6.6.84-36db6e8-00385-g36db6e8484ed #1 Mon Mar 24 02:47:12 UTC 2025 armv6l GNU/Linux
Linux romulus 6.6.84-36db6e8-00385-g36db6e8484ed #1 Mon Mar 24 02:47:12 UTC 2025 armv6l GNU/Linux
Test SSH Setup :: Verify SSH works. | PASS |
------------------------------------------------------------------------------
Test IPMI Setup :: Verify Out-of-band works. #(UTC) 2025/03/27 02:17:00.404984 - 0.014049 - Issuing: ipmitool -I lanplus -C 17 -N 3 -p 2623 -U root -P ********** -H 127.0.0.1 chassis status
.
System Power : off
Power Overload : false
Power Interlock : inactive
Main Power Fault : false
Power Control Fault : false
Power Restore Policy : always-off
Last Power Event :
Chassis Intrusion : inactive
Front-Panel Lockout : inactive
Drive Fault : false
Cooling/Fan Fault : false
Sleep Button Disable : not allowed
Diag Button Disable : not allowed
Reset Button Disable : allowed
Power Button Disable : not allowed
Sleep Button Disabled: false
Diag Button Disabled : false
Reset Button Disabled: false
Power Button Disabled: false
Test IPMI Setup :: Verify Out-of-band works. | PASS |
------------------------------------------------------------------------------
Test Openbmc Setup :: Test suite to verify if the Robot setup is r... | PASS |
3 tests, 3 passed, 0 failed
==============================================================================
Output: /home/chrisdeng/output.xml
Log: /home/chrisdeng/log.html
Report: /home/chrisdeng/report.html
```
### Extension
1. 離開 QEMU 模擬器:快捷鍵 Ctrl + a,然後按 x 鍵。
2. robot 測試後生成的 `output.xml` `log.html` `report.html` 會儲存執行指令的當前目錄位置下。
### Reference
- [Run OpenBMC Test Automation Using Docker](<https://github.com/openbmc/docs/blob/master/testing/run-test-docker.md>)
- [在 QEMU 中运行 OpenBMC](<https://jia.je/system/2023/08/11/openbmc-qemu/#romulus>)