Skip to content

Use good bacnet device object values in the discovery node #13027

Use good bacnet device object values in the discovery node

Use good bacnet device object values in the discovery node #13027

Workflow file for this run

name: UDMI Test Suite
on:
push:
branches:
- '**'
workflow_dispatch:
pull_request:
schedule:
- cron: '13 * * * *'
concurrency:
group: ci-${{ github.repository }}-${{ github.event_name == 'workflow_dispatch' && github.run_id || '' }}
cancel-in-progress: true
jobs:
unit:
name: Unit Tests
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
- uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: Checkout source
uses: actions/checkout@v6
- name: start and test local servers
run: |
bin/setup_base
bin/clone_model
bin/start_pubsub
- name: bin/run_tests all_tests
run: bin/run_tests all_tests
- name: all test output
if: ${{ !cancelled() }}
run: more out/test_*
- name: gencode test output
if: ${{ !cancelled() }}
run: more out/test_bin+gencode+check
- name: validator test output
if: ${{ !cancelled() }}
run: more out/test_validator+bin+build+check
- name: pubber test output
if: ${{ !cancelled() }}
run: more out/test_pubber+bin+build+check
- name: udmis test output
if: ${{ !cancelled() }}
run: more out/test_udmis+bin+build+check
- name: site test output
if: ${{ !cancelled() }}
run: more out/test_bin+test_sites
- name: python generated classes test output
if: ${{ !cancelled() }}
run: more out/test_bin+test_generated_classes_py
spelling:
name: Docs Spelling Checks
runs-on: ubuntu-24.04
timeout-minutes: 2
steps:
- uses: actions/checkout@v6
- name: Check Spelling
uses: rojopolis/spellcheck-github-actions@0.35.0
with:
config_path: .spellcheck.yml
task_name: Markdown
automapping:
name: Automapping capability
runs-on: ubuntu-24.04
timeout-minutes: 10
if: ${{ !cancelled() }}
env:
TARGET_PROJECT: ${{ vars.TARGET_PROJECT || '//mqtt/localhost:9001' }}
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
- name: base setup
run: |
bin/setup_base
bin/clone_model
- name: local setup
run: |
bin/start_local sites/udmi_site_model $TARGET_PROJECT
bin/pull_messages ${TARGET_PROJECT}%ZZ-TRI-FECTA > /tmp/message_capture.log 2>&1 &
- name: bin/test_automapper
run: bin/test_automapper $TARGET_PROJECT
- name: extra devices
run: |
find sites/udmi_site_model/extras/ -type f | xargs sed -i '$a\'
find sites/udmi_site_model/extras/ -type f | xargs more
- name: udmis log
if: ${{ !cancelled() }}
run: cat out/udmis.log
- name: pubber log
if: ${{ !cancelled() }}
run: cat out/pubber.log.GAT-123
- name: captured messages
if: ${{ !cancelled() }}
run: |
cat /tmp/message_capture.log
mkdir -p out/registries && cd out/registries/
find . -type f | sort | xargs more
- name: support bundle
if: ${{ !cancelled() }}
run: bin/support ${{ github.repository_owner }}_${{ github.job }}_
- uses: actions/upload-artifact@v7
if: ${{ !cancelled() }}
with:
if-no-files-found: error
name: udmi-support_${{ github.run_id }}-m
path: '*_udmi-support_*.tgz'
baseline:
name: Baseline Tests
runs-on: ubuntu-24.04
timeout-minutes: 20
needs: automapping
env:
TARGET_PROJECT: ${{ vars.TARGET_PROJECT || '//mqtt/localhost:9001' }}
UDMI_ALT_REGISTRY: ZZ-REDIRECT-NA
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
- name: base setup
run: bin/run_tests install_dependencies
- name: local setup
run: bin/start_local sites/udmi_site_model $TARGET_PROJECT
- name: registrar clean
run: bin/test_regclean solo $TARGET_PROJECT
- name: special sequences
if: ${{ !cancelled() }}
run: bin/test_special $TARGET_PROJECT
- name: telemetry validator
if: ${{ !cancelled() }}
run: bin/test_validator $TARGET_PROJECT
- name: validator result
if: ${{ !cancelled() }}
run: more out/validator.out || true
- name: message captures
if: ${{ !cancelled() }}
run: |
cd sites/udmi_site_model/out
find . -type f | sort | xargs ls -l
find . -type f | sort | xargs more | cat
- name: nostate sequences
if: ${{ !cancelled() }}
run: bin/test_sequencer nostate full $TARGET_PROJECT
- name: support bundle
if: ${{ !cancelled() }}
run: UDMI_REGISTRY_SUFFIX=_b bin/support ${{ github.repository_owner }}_${{ github.job }}_
- uses: actions/upload-artifact@v7
if: ${{ !cancelled() }}
with:
if-no-files-found: error
name: udmi-support_${{ github.run_id }}-b
path: '*_udmi-support_*.tgz'
sequencer:
name: Sequencer Tests
runs-on: ubuntu-24.04
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
shard: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
env:
TARGET_PROJECT: ${{ vars.TARGET_PROJECT || '//mqtt/localhost:9001' }}
UDMI_ALT_REGISTRY: ZZ-REDIRECT-NA
UDMI_REGISTRY_SUFFIX: _${{ matrix.shard }}
MATRIX_SHARD_COUNT: 10
MATRIX_SHARD_INDEX: ${{ matrix.shard }}
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
- name: base setup
run: bin/run_tests install_dependencies
- name: local setup
run: bin/start_local sites/udmi_site_model $TARGET_PROJECT
- name: registrar clean
run: bin/test_regclean $TARGET_PROJECT
- name: sequence tests clean
if: ${{ !cancelled() }}
run: bin/test_sequencer clean nocheck $TARGET_PROJECT
- name: sequence tests alpha
if: ${{ !cancelled() }}
run: bin/test_sequencer alpha nocheck $TARGET_PROJECT
- name: sequence test post-process
if: ${{ !cancelled() }}
run: egrep ' test .* after .*s ' out/sequencer.log | tee out/timing_sequencer.out
- name: itemized sequencer tests
if: ${{ !cancelled() }}
run: bin/test_itemized $TARGET_PROJECT
- name: output files
if: ${{ !cancelled() }}
run: more out/*.out* | cat
- name: pubber logs
if: ${{ !cancelled() }}
run: more out/pubber.log* pubber/out/*.json | cat
- name: udmis log
if: ${{ !cancelled() }}
run: cat out/udmis.log
- name: message capture log
if: ${{ !cancelled() }}
run: cat out/message_capture.log || true
- name: itemized test post-process
if: ${{ !cancelled() }}
run: egrep ' test .* after .*s ' out/sequencer.log-* | tee out/timing_itemized.out
- name: support bundle
if: ${{ !cancelled() }}
run: |
bin/support ${{ github.repository_owner }}_${{ github.job }}_
tar -tzvf *udmi-support*.tgz
- uses: actions/upload-artifact@v7
if: ${{ !cancelled() }}
with:
if-no-files-found: error
name: udmi-support_${{ github.run_id }}-${{ matrix.shard }}
path: '*_udmi-support_*.tgz'
runlocal:
name: UDMIS Local Setup
runs-on: ubuntu-24.04
timeout-minutes: 20
env:
TARGET_PROJECT: ${{ vars.TARGET_PROJECT || '//mqtt/localhost:9001' }}
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
- name: base setup
run: |
bin/setup_base
bin/clone_model
bin/registrar sites/udmi_site_model
- name: local setup
run: |
bin/start_local sites/udmi_site_model $TARGET_PROJECT
bin/pull_messages $TARGET_PROJECT > out/message_capture.log 2>&1 &
- name: bin/test_etcd_prerun
run: bin/test_etcd_prerun
- name: bin/test_mosquitto
run: bin/test_mosquitto
- name: bin/test_regclean
run: bin/test_regclean $TARGET_PROJECT
- name: bin/test_runlocal
run: bin/test_runlocal
- name: bin/test_sequencer
run: bin/test_sequencer local full $TARGET_PROJECT $(< etc/local_tests.txt)
- name: bin/test_uufi
run: bin/test_uufi
- name: bin/test_udmis
run: bin/test_udmis
- name: bin/test_etcd_postrun
run: bin/test_etcd_postrun
- name: mosquitto debug
if: ${{ !cancelled() }}
run: |
mosquitto -h || true
sudo more /etc/mosquitto/* /etc/mosquitto/conf.d/* || true
- name: udmis log
if: ${{ !cancelled() }}
run: cat out/udmis*.log
- name: message capture log
if: ${{ !cancelled() }}
run: cat out/message_capture.log || true
- name: registrar log
if: ${{ !cancelled() }}
run: cat out/registrar.log || true
- name: mosquitto state
if: ${{ !cancelled() }}
run: |
source etc/mosquitto_ctrl.sh
$MOSQUITTO_CTRL listClients || true
$MOSQUITTO_CTRL listRoles || true
- name: mosquitto logs
if: ${{ !cancelled() }}
run: cat /var/log/mosquitto/mosquitto.log || true
- name: support bundle
if: ${{ !cancelled() }}
run: bin/support ${{ github.repository_owner }}_${{ github.job }}_
- uses: actions/upload-artifact@v7
if: ${{ !cancelled() }}
with:
if-no-files-found: error
name: udmi-support_${{ github.run_id }}-l
path: '*_udmi-support_*.tgz'
endpoint:
name: Endpoint Redirection
runs-on: ubuntu-24.04
timeout-minutes: 15
env:
UDMI_ALT_REGISTRY: ZZ-REDIRECT-NA
TARGET_PROJECT: //mqtt/localhost:9001
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
- name: base setup
run: bin/run_tests install_dependencies
- name: local setup
run: bin/start_local sites/udmi_site_model $TARGET_PROJECT
- name: regclean
run: bin/test_regclean $TARGET_PROJECT
- name: bin/test_proxy
if: ${{ env.MQTT_PROXY_HOST != '' }}
run: bin/test_proxy $TARGET_PROJECT $MQTT_PROXY_HOST
- name: bin/test_redirect
run: bin/test_redirect $TARGET_PROJECT
- name: pubber.log
if: ${{ !cancelled() }}
run: more out/pubber.log* | cat
- name: support bundle
if: ${{ !cancelled() }}
run: UDMI_REGISTRY_SUFFIX=_r bin/support ${{ github.repository_owner }}_${{ github.job }}_
- uses: actions/upload-artifact@v7
if: ${{ !cancelled() }}
with:
if-no-files-found: error
name: udmi-support_${{ github.run_id }}-r
path: '*_udmi-support_*.tgz'
blobupdates:
name: Blob Updates
runs-on: ubuntu-24.04
timeout-minutes: 15
env:
TARGET_PROJECT: ${{ vars.TARGET_PROJECT || '//mqtt/localhost:9001' }}
UDMI_REGISTRY_SUFFIX: _BU
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
- name: base setup
run: bin/run_tests install_dependencies
- name: local setup
run: bin/start_local sites/udmi_site_model $TARGET_PROJECT
- name: regclean
run: bin/test_regclean $TARGET_PROJECT
- name: bin/test_blob_updates
run: bin/test_blob_updates $TARGET_PROJECT
- name: pubber.log
if: ${{ !cancelled() }}
run: more out/pubber.log* | cat
- name: support bundle
if: ${{ !cancelled() }}
run: UDMI_REGISTRY_SUFFIX=_blobupdates bin/support ${{ github.repository_owner }}_${{ github.job }}_
- uses: actions/upload-artifact@v7
if: ${{ !cancelled() }}
with:
if-no-files-found: error
name: udmi-support_${{ github.run_id }}-blobupdates
path: '*_udmi-support_*.tgz'
posttest:
name: Post-test Summarization
runs-on: ubuntu-24.04
timeout-minutes: 5
needs: [ baseline, sequencer, endpoint, runlocal, blobupdates ]
if: ${{ !cancelled() }}
env:
TARGET_PROJECT: ${{ vars.TARGET_PROJECT || '//mqtt/localhost:9001' }}
UDMI_ALT_REGISTRY: ZZ-REDIRECT-NA
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: Base setup
run: bin/setup_base
- name: Download all sharded support packages
uses: actions/download-artifact@v8
with:
path: udmi-support_${{ github.run_id }}
pattern: udmi-support_${{ github.run_id }}-*
merge-multiple: true
- name: Upload merged support package
uses: actions/upload-artifact@v7
with:
if-no-files-found: error
name: udmi-support_${{ github.run_id }}
path: 'udmi-support_${{ github.run_id }}/*_udmi-support_*.tgz'
- name: Processing support package
run: bin/support_process udmi-support_*
- name: Test run index
run: |
ls -d sites/udmi_site_model*/out*/devices/AHU-1/tests/*
find out* -name 'schema*.out*' -size +0 | xargs more | cat
- name: Sequencer validation
if: ${{ !cancelled() }}
run: bin/test_sequcheck
- name: Itemized validation
if: ${{ !cancelled() }}
run: bin/test_itemcheck
discovery:
name: Discovery Tests
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
fetch-tags: true
- uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
- name: Setup prerequisites
run: |
bin/setup_base
bin/clone_model
ln -s sites/udmi_site_model/ site_model
(cd site_model; git log -n 1)
docker network create udminet --subnet 192.168.99.0/24
- name: Unit Tests
run: |
misc/discoverynode/testing/unit/unit_tests.sh
- name: Integration Tests
run: |
misc/discoverynode/testing/integration/integration_test.sh
- name: Build UDMIS container
run: |
udmis/bin/build check
bin/container udmis build --no-check latest
echo Built local UDMIS
- name: Start UDMIS container
run: |
mkdir -p out
docker rm -f udmis || true
docker run -d --net udminet --name udmis -p 8883:8883 \
-v $PWD/site_model:/root/site_model \
-v $PWD/var/tmp:/tmp \
-v $PWD/var/etcd:/root/udmi/var/etcd \
-v $PWD/var/mosquitto:/etc/mosquitto \
-v $PWD/out:/root/udmi/out \
udmis udmi/bin/start_local block site_model/cloud_iot_config.json
for count in `seq 0 60`; do
echo Waiting for UDMIS startup $((30 - count))
[[ ! -f var/tmp/pod_ready.txt ]] || break
(docker ps | fgrep -q udmis) || break
sleep 1
done
if [[ ! -f var/tmp/pod_ready.txt ]]; then
echo "=== DIAGNOSTIC LOGS FOR UDMIS STARTUP FAILURE ==="
echo "Host working directory: $PWD"
echo "Host var/tmp/ contents:"
ls -la var/tmp || true
echo "Docker container status:"
docker ps -a || true
echo "Docker logs for udmis:"
docker logs udmis || true
echo "Empirically searching container for log files and ready signals..."
temp_img=$(docker commit udmis 2>/dev/null)
if [[ -n "$temp_img" ]]; then
docker run --rm "$temp_img" sh -c '
echo "=== Listing all log files and status files found inside the container ==="
find / -name "*.log" -o -name "*ready.txt" 2>/dev/null | grep -v "/proc" | grep -v "/sys" | while read -r filepath; do
echo ""
echo "--- CONTENT OF $filepath ---"
cat "$filepath" 2>/dev/null || echo "[could not read file]"
done
' || true
docker rmi "$temp_img" >/dev/null 2>&1 || true
else
echo "Could not commit container to inspect filesystem."
fi
echo "=== END DIAGNOSTIC LOGS ==="
fi
ls -l var/tmp/pod_ready.txt 2>&1
- name: E2E Tests
# This runs as sudo because docker containers in Github CI run as root.
# So, when the UDMIS container runs `keygen`, the CSR and SRL files are
# owned by root, and cannot be ovewritten by system calls to keygen,
# unless it too is root, or the behaviour is changed, or the permisions
# are fixed. This also requires playing some fancy games with the sudo
# eng and PATH, so that the right version of java is picked up!
run: |
export SAVE_PATH=$PATH
sudo -E bash -c 'PATH=$SAVE_PATH misc/discoverynode/testing/e2e/test_local site_model'
- name: udmis log
if: ${{ !cancelled() }}
run: |
echo "=== out/udmis.log ==="
cat out/udmis.log || true
echo "=== out/etcd.log ==="
cat out/etcd.log || true
echo "=== docker logs ==="
docker logs udmis || true
udmilp:
name: Python Library Tests
runs-on: ubuntu-24.04
timeout-minutes: 15
strategy:
matrix:
python-version: [ "3.9", "3.10", "3.11", "3.12", "3.13" ]
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install Poetry
run: |
pip install poetry
poetry config virtualenvs.in-project true
- name: Cache poetry venv
id: cache-deps
uses: actions/cache@v5
with:
path: clientlib/python/.venv
key: ${{ runner.os }}-${{ matrix.python-version }}-venv-${{ hashFiles('clientlib/python/poetry.lock') }}
restore-keys: |
${{ runner.os }}-${{ matrix.python-version }}-venv-
- name: Install dependencies
run: |
cd clientlib/python
poetry install --with dev
- name: Run tests with pytest
run: |
cd clientlib/python
poetry run pytest -v tests/
- name: Run pylint
if: matrix.python-version == '3.13'
run: |
cd clientlib/python
poetry run pylint src
bridgehead:
name: Bridgehead Test
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
- name: Setup Base
run: bin/setup_base
- name: Run Bridgehead Test
run: |
bridgehead/tests/test_bridgehead
- name: Upload logs
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v7
with:
name: bridgehead-logs
path: |
bridgehead/var/mosquitto/log/
bridgehead/var/tmp/udmis.log