-
Notifications
You must be signed in to change notification settings - Fork 19
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #179 from hanhsuan/add_agent_dockerfile
Add Dockerfile to create an OCI image of agent
- Loading branch information
Showing
3 changed files
with
194 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
FROM ubuntu:22.04 | ||
|
||
# normal settings | ||
ENV TZ=Asia/Taipei \ | ||
LANG=C.UTF-8 \ | ||
CONFIG_DIR=/tmp/config \ | ||
INFLUX_HOST=localhost \ | ||
INFLUX_PORT=8086 \ | ||
INFLUX_USER=testflinger-agent \ | ||
INFLUX_PW=testflinger-agent | ||
|
||
# device-connectors default config | ||
ENV DC_CONFIG=device-connectors.yaml \ | ||
DC_DUT_IP=127.0.0.1 \ | ||
DC_DUT_SID=aabbccdd \ | ||
DC_NODE_ID= \ | ||
DC_NODE_NAME=core-taipei-testflinger \ | ||
DC_AGENT_NAME=staging-tfagent-cid-REPLACE_TO_HOSTNAME \ | ||
DC_MASS_USER=bot \ | ||
DC_TIMEOUT=120 | ||
|
||
# testflinger-agent default config | ||
ENV AGENT_CONFIG=agent.yaml \ | ||
AGENT_ID=${DC_AGENT_NAME} \ | ||
TESTFLINGER_SERVER=https://testflinger.canonical.com \ | ||
AGENT_TIMEOUT=43200 \ | ||
AGENT_OUTPUT_TIMEOUT=9000 \ | ||
AGENT_EXEC_DIR=/testflinger/run/ \ | ||
AGENT_LOG_DIR=/testflinger/log/ \ | ||
AGENT_RESULT_DIR=/testflinger/result/ \ | ||
AGENT_LOG_LEVEL=DEBUG \ | ||
AGENT_JOB_QUEUE=staging-job-cid-REPLACE_TO_HOSTNAME \ | ||
AGENT_SET_CMD=/bin/true \ | ||
AGENT_PROV_CMD=/bin/true \ | ||
AGENT_TEST_CMD="PYTHONIOENCODING=utf-8 PYTHONUNBUFFERED=1 testflinger-device-connector maas2 runtest -c ${CONFIG_DIR}/${DC_CONFIG} testflinger.json" \ | ||
AGENT_CLEAN_CMD=/bin/true | ||
|
||
|
||
# python | ||
ARG PYTHON=python3 | ||
|
||
# preinstall packages | ||
RUN apt-get update && \ | ||
DEBIAN_FRONTEND=noninteractive \ | ||
apt-get -y install \ | ||
software-properties-common \ | ||
gpg \ | ||
ca-certificates \ | ||
curl \ | ||
git \ | ||
git-lfs \ | ||
netbase \ | ||
less \ | ||
openssh-client \ | ||
patch \ | ||
tzdata \ | ||
python3-pip \ | ||
python3-dev \ | ||
ssh-import-id \ | ||
jq \ | ||
sshpass \ | ||
build-essential && \ | ||
apt-get clean && \ | ||
rm -rf /tmp/* /var/cache/* /usr/share/doc/* /usr/share/man/* /var/lib/apt/lists/* | ||
|
||
# For security reason, the code below should run with non-root. | ||
# However, we have to install checkbox by apt command | ||
# from testflinger-agent itself to get more flexiblity. | ||
# Please use rootless mode to install Docker, nerdctl or podman. | ||
|
||
# install testflinger-agent testflinger-cli and device-connectors | ||
RUN git clone https://github.com/canonical/testflinger.git && \ | ||
cd testflinger && \ | ||
${PYTHON} -m pip install pip -U && \ | ||
${PYTHON} -m pip install -I agent/ && \ | ||
${PYTHON} -m pip install -I device-connectors/ && \ | ||
${PYTHON} -m pip install -I cli/ && \ | ||
rm -rf * | ||
|
||
# create agent working dir | ||
RUN mkdir -p ${AGENT_EXEC_DIR} ${AGENT_LOG_DIR} ${AGENT_RESULT_DIR} ${CONFIG_DIR} | ||
|
||
COPY --chmod=0111 agent.sh ./ | ||
|
||
CMD ["./agent.sh"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
**This image is for a specific use case and that most device connectors will not function properly this way, so it's not recommended for use in most cases.** | ||
|
||
# Description | ||
This Dockerfile is used to build an OCI image includes testflinger-agent, testflinger-cli, testfliger-device-connector inside. | ||
Testflinger-agent is the only application that running at beginning. | ||
|
||
# How to build | ||
```shell | ||
docker build -t [where is the images registry]/[image name]:[tag] . | ||
``` | ||
|
||
# Variables | ||
There are some environment variables that could be used to change the setting: | ||
|Variable|description|default| | ||
|--|--|--| | ||
|CONFIG\_DIR|where the configuration files are|/tmp/config| | ||
|INFLUX\_HOST|for testflinger-agent|127.0.0.1| | ||
|INFLUX\_PORT|for testflinger-agent|8086| | ||
|INFLUX\_USER|for testflinger-agent|testflinger-agent| | ||
|INFLUX\_PW|for testflinger-agent|testflinger-agent| | ||
|DC\_CONFIG|configuration file of device-connector|device-connectors.yaml| | ||
|DC\_DUT\_IP|DUT IP that device-connector will operate|127.0.0.1| | ||
|DC\_DUT\_SID|secure id of DUT|aabbccdd| | ||
|DC\_NODE\_ID|where the device-connector running is|| | ||
|DC\_NODE\_NAME|where the device-connector running is|staging-tfagent-cid-REPLACE\_TO\_HOSTNAME(This defualt value will replace `REPLACE_TO_HOSTNAME` to hostname. Therefore, you could use CID as the hostname while starting container)| | ||
|DC\_MASS\_USER|mass user|bot| | ||
|DC\_TIMEOUT|timeout of device-connector|120| | ||
|AGENT\_CONFIG|configuration file of testflinger-agent|agent.yaml| | ||
|AGENT\_ID|name of agent|same with `DC_AGENT_NAME`| | ||
|TESTFLINGER\_SERVER|where the testflinger server is|https://testflinger.canonical.com| | ||
|AGENT\_TIMEOUT|timeout of testflinger-agent|43200| | ||
|AGENT\_OUTPUT\_TIMEOUT| output timeout of testflinger-agent|9000| | ||
|AGENT\_EXEC\_DIR|where the testflinger-agent to store running info is|/testflinger/run/| | ||
|AGENT\_LOG\_DIR|where the testflinger-agent to store log info is|/testflinger/log/| | ||
|AGENT\_RESULT\_DIR|where the testflinger-agent to store result info is|/testflinger/result/| | ||
|AGENT\_LOG\_LEVEL|log level of testflinger-agent|DEBUG| | ||
|AGENT\_JOB\_QUEUE|the job queue the testflinger-agent listened|staging-job-cid-REPLACE\_TO\_HOSTNAME(This defualt value will replace `REPLACE_TO_HOSTNAME` to hostname. Therefore, you could use CID as the hostname while starting container)| | ||
|AGENT\_SET\_CMD|set command of testflinger-agent|/bin/true| | ||
|AGENT\_PROV\_CMD|provision command of testflinger-agent|/bin/true| | ||
|AGENT\_CLEAN\_CMD|cleanup command of testflinger-agent|/bin/true| | ||
|AGENT\_TEST\_CMD|test command of testflinger-agent|PYTHONIOENCODING=utf-8 PYTHONUNBUFFERED=1 testflinger-device-connector maas2 runtest -c ${CONFIG\_DIR}/${DC\_CONFIG} testflinger.json| | ||
|
||
# How to start this container | ||
```shell | ||
docker run -d --rm -e INFLUX_HOST=[where it is] --hostname [CID] [images name] | ||
``` | ||
|
||
The user in this conatiner is `root`, you don't have to add `sudo` before the command while root-privilege being needed. For security reason, this container should be ran by `rootless` container runtime. | ||
|
||
# How to put configuration file into this container | ||
The start script will check the configuration files are under `CONFIG_DIR` or not, you could mount volume that contain the configuration files to use your own setting without using too much environment varialbs. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
#!/bin/bash | ||
|
||
# if no testflinger-agent configuration create one | ||
if [ ! -f "${CONFIG_DIR}/${AGENT_CONFIG}" ]; then | ||
cat <<EOF >"${CONFIG_DIR}/${AGENT_CONFIG}" | ||
agent_id: ${AGENT_ID} | ||
server_address: ${TESTFLINGER_SERVER} | ||
global_timeout: ${AGENT_TIMEOUT} | ||
output_timeout: ${AGENT_OUTPUT_TIMEOUT} | ||
execution_basedir: ${AGENT_EXEC_DIR} | ||
logging_basedir: ${AGENT_LOG_DIR} | ||
results_basedir: ${AGENT_RESULT_DIR} | ||
logging_level: ${AGENT_LOG_LEVEL} | ||
job_queues: | ||
- ${AGENT_JOB_QUEUE} | ||
setup_command: ${AGENT_SET_CMD} | ||
provision_command: ${AGENT_PROV_CMD} | ||
test_command: ${AGENT_TEST_CMD} | ||
cleanup_command: ${AGENT_CLEAN_CMD} | ||
EOF | ||
fi | ||
|
||
# if no device-connectors configuration create one | ||
if [ ! -f "${CONFIG_DIR}/${DC_CONFIG}" ]; then | ||
cat <<EOF >"${CONFIG_DIR}/${DC_CONFIG}" | ||
device_ip: ${DC_DUT_IP} | ||
secure_id: ${DC_DUT_SID} | ||
node_id: ${DC_NODE_ID} | ||
node_name: ${DC_NODE_NAME} | ||
agent_name: ${DC_AGENT_NAME} | ||
maas_user: ${DC_MASS_USER} | ||
timeout_min: ${DC_TIMEOUT} | ||
env: | ||
HEXR_DEVICE_SECURE_ID: ${DC_DUT_SID} | ||
DEVICE_IP: ${DC_DUT_IP} | ||
EOF | ||
fi | ||
|
||
# show usage | ||
testflinger-agent -h | ||
testflinger-cli -h | ||
testflinger-device-connector -h | ||
|
||
# replace placeholder "REPLACE_TO_HOSTNAME" to ${HOSTNAME} | ||
sed -i s/REPLACE_TO_HOSTNAME/"${HOSTNAME}"/g "${CONFIG_DIR}/${AGENT_CONFIG}" | ||
sed -i s/REPLACE_TO_HOSTNAME/"${HOSTNAME}"/g "${CONFIG_DIR}/${DC_CONFIG}" | ||
|
||
# show agent information | ||
echo "$(grep agent_id ${CONFIG_DIR}/${AGENT_CONFIG})" | ||
echo "$(grep -A 1 job_queues ${CONFIG_DIR}/${AGENT_CONFIG})" | ||
|
||
# start testflinger-agent | ||
if [ -z "${NO_AGENT_LOG}" ] ;then | ||
testflinger-agent -c "${CONFIG_DIR}/${AGENT_CONFIG}" | ||
else | ||
testflinger-agent -c "${CONFIG_DIR}/${AGENT_CONFIG}" > /dev/null 2>&1 | ||
fi |