00:19:21 Triggered by Gerrit: https://gerrit.o-ran-sc.org/r/c/ric-plt/xapp-frame-py/+/12317 00:19:21 Running as SYSTEM 00:19:21 [EnvInject] - Loading node environment variables. 00:19:21 Building remotely on prd-ubuntu1804-builder-2c-2g-2145 (ubuntu1804-builder-2c-2g ubuntu2004-builder-2c-2g) in workspace /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master 00:19:21 [ssh-agent] Looking for ssh-agent implementation... 00:19:22 [ssh-agent] Exec ssh-agent (binary ssh-agent on a remote machine) 00:19:22 $ ssh-agent 00:19:22 SSH_AUTH_SOCK=/tmp/ssh-8ZlfFR44nwKL/agent.5544 00:19:22 SSH_AGENT_PID=5546 00:19:22 [ssh-agent] Started. 00:19:22 Running ssh-add (command line suppressed) 00:19:22 Identity added: /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master@tmp/private_key_1938231828357748957.key (jenkins-ssh) 00:19:22 [ssh-agent] Using credentials jenkins (jenkins) 00:19:22 The recommended git tool is: NONE 00:19:24 using credential jenkins 00:19:24 Wiping out workspace first. 00:19:24 Cloning the remote Git repository 00:19:24 Cloning repository ssh://oran-jobbuilder@gerrit.o-ran-sc.org:29418/ric-plt/xapp-frame-py 00:19:24 > git init /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master # timeout=10 00:19:24 Fetching upstream changes from ssh://oran-jobbuilder@gerrit.o-ran-sc.org:29418/ric-plt/xapp-frame-py 00:19:24 > git --version # timeout=10 00:19:24 > git --version # 'git version 2.25.1' 00:19:24 using GIT_SSH to set credentials jenkins 00:19:24 > git fetch --tags --force --progress -- ssh://oran-jobbuilder@gerrit.o-ran-sc.org:29418/ric-plt/xapp-frame-py +refs/heads/*:refs/remotes/origin/* # timeout=10 00:19:25 > git config remote.origin.url ssh://oran-jobbuilder@gerrit.o-ran-sc.org:29418/ric-plt/xapp-frame-py # timeout=10 00:19:25 > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10 00:19:25 > git config remote.origin.url ssh://oran-jobbuilder@gerrit.o-ran-sc.org:29418/ric-plt/xapp-frame-py # timeout=10 00:19:25 Fetching upstream changes from ssh://oran-jobbuilder@gerrit.o-ran-sc.org:29418/ric-plt/xapp-frame-py 00:19:25 using GIT_SSH to set credentials jenkins 00:19:25 > git fetch --tags --force --progress -- ssh://oran-jobbuilder@gerrit.o-ran-sc.org:29418/ric-plt/xapp-frame-py refs/changes/17/12317/10 # timeout=10 00:19:26 > git rev-parse 3632ac80c27149357302d45a7844d76728dea5c0^{commit} # timeout=10 00:19:26 JENKINS-19022: warning: possible memory leak due to Git plugin usage; see: https://plugins.jenkins.io/git/#remove-git-plugin-buildsbybranch-builddata-script 00:19:26 Checking out Revision 3632ac80c27149357302d45a7844d76728dea5c0 (refs/changes/17/12317/10) 00:19:26 > git config core.sparsecheckout # timeout=10 00:19:26 > git checkout -f 3632ac80c27149357302d45a7844d76728dea5c0 # timeout=10 00:19:29 Commit message: "RIC-1032: xapp-frame-py block xApp to register when communicating with Rtmgr" 00:19:29 > git rev-parse FETCH_HEAD^{commit} # timeout=10 00:19:29 > git rev-list --no-walk e0de19a1c51e607b7e7a4a71a326a09486583539 # timeout=10 00:19:29 > git remote # timeout=10 00:19:29 > git submodule init # timeout=10 00:19:29 > git submodule sync # timeout=10 00:19:29 > git config --get remote.origin.url # timeout=10 00:19:29 > git submodule init # timeout=10 00:19:29 > git config -f .gitmodules --get-regexp ^submodule\.(.+)\.url # timeout=10 00:19:29 > git config --get submodule.nodeb-rnib.url # timeout=10 00:19:29 > git config -f .gitmodules --get submodule.nodeb-rnib.path # timeout=10 00:19:29 > git submodule update --init --recursive nodeb-rnib # timeout=10 00:19:30 provisioning config files... 00:19:30 copy managed file [npmrc] to file:/home/jenkins/.npmrc 00:19:30 copy managed file [pipconf] to file:/home/jenkins/.config/pip/pip.conf 00:19:30 [ric-plt-xapp-frame-py-pypi-verify-master] $ /bin/bash /tmp/jenkins8218938750761905252.sh 00:19:30 ---> python-tools-install.sh 00:19:30 Setup pyenv: 00:19:30 * system (set by /opt/pyenv/version) 00:19:30 * 3.8.13 (set by /opt/pyenv/version) 00:19:30 * 3.9.13 (set by /opt/pyenv/version) 00:19:30 * 3.10.6 (set by /opt/pyenv/version) 00:19:35 lf-activate-venv(): INFO: Creating python3 venv at /tmp/venv-M6V1 00:19:35 lf-activate-venv(): INFO: Save venv in file: /tmp/.os_lf_venv 00:19:38 lf-activate-venv(): INFO: Installing: lftools 00:20:19 lf-activate-venv(): INFO: Adding /tmp/venv-M6V1/bin to PATH 00:20:19 Generating Requirements File 00:20:55 Python 3.10.6 00:20:56 pip 23.3.2 from /tmp/venv-M6V1/lib/python3.10/site-packages/pip (python 3.10) 00:20:56 appdirs==1.4.4 00:20:56 argcomplete==3.2.1 00:20:56 aspy.yaml==1.3.0 00:20:56 attrs==23.1.0 00:20:56 autopage==0.5.2 00:20:56 Babel==2.14.0 00:20:56 beautifulsoup4==4.12.2 00:20:56 boto3==1.34.8 00:20:56 botocore==1.34.8 00:20:56 bs4==0.0.1 00:20:56 cachetools==5.3.2 00:20:56 certifi==2023.11.17 00:20:56 cffi==1.16.0 00:20:56 cfgv==3.4.0 00:20:56 chardet==5.2.0 00:20:56 charset-normalizer==3.3.2 00:20:56 click==8.1.7 00:20:56 cliff==4.4.0 00:20:56 cmd2==2.4.3 00:20:56 cryptography==3.3.2 00:20:56 debtcollector==2.5.0 00:20:56 decorator==5.1.1 00:20:56 defusedxml==0.7.1 00:20:56 Deprecated==1.2.14 00:20:56 distlib==0.3.8 00:20:56 dnspython==2.4.2 00:20:56 docker==4.2.2 00:20:56 dogpile.cache==1.3.0 00:20:56 email-validator==2.1.0.post1 00:20:56 filelock==3.13.1 00:20:56 future==0.18.3 00:20:56 gitdb==4.0.11 00:20:56 GitPython==3.1.40 00:20:56 google-auth==2.25.2 00:20:56 httplib2==0.22.0 00:20:56 identify==2.5.33 00:20:56 idna==3.6 00:20:56 importlib-metadata==7.0.1 00:20:56 importlib-resources==1.5.0 00:20:56 iso8601==2.1.0 00:20:56 Jinja2==3.1.2 00:20:56 jmespath==1.0.1 00:20:56 jsonpatch==1.33 00:20:56 jsonpointer==2.4 00:20:56 jsonschema==4.20.0 00:20:56 jsonschema-specifications==2023.12.1 00:20:56 keystoneauth1==5.4.0 00:20:56 kubernetes==28.1.0 00:20:56 lftools==0.37.8 00:20:56 lxml==4.9.4 00:20:56 MarkupSafe==2.1.3 00:20:56 msgpack==1.0.7 00:20:56 multi_key_dict==2.0.3 00:20:56 munch==4.0.0 00:20:56 netaddr==0.9.0 00:20:56 netifaces==0.11.0 00:20:56 niet==1.4.2 00:20:56 nodeenv==1.8.0 00:20:56 oauth2client==4.1.3 00:20:56 oauthlib==3.2.2 00:20:56 openstacksdk==0.62.0 00:20:56 os-client-config==2.1.0 00:20:56 os-service-types==1.7.0 00:20:56 osc-lib==2.9.0 00:20:56 oslo.config==9.2.0 00:20:56 oslo.context==5.3.0 00:20:56 oslo.i18n==6.2.0 00:20:56 oslo.log==5.4.0 00:20:56 oslo.serialization==5.2.0 00:20:56 oslo.utils==6.3.0 00:20:56 packaging==23.2 00:20:56 pbr==6.0.0 00:20:56 platformdirs==4.1.0 00:20:56 prettytable==3.9.0 00:20:56 pyasn1==0.5.1 00:20:56 pyasn1-modules==0.3.0 00:20:56 pycparser==2.21 00:20:56 pygerrit2==2.0.15 00:20:56 PyGithub==2.1.1 00:20:56 pyinotify==0.9.6 00:20:56 PyJWT==2.8.0 00:20:56 PyNaCl==1.5.0 00:20:56 pyparsing==2.4.7 00:20:56 pyperclip==1.8.2 00:20:56 pyrsistent==0.20.0 00:20:56 python-cinderclient==9.4.0 00:20:56 python-dateutil==2.8.2 00:20:56 python-heatclient==3.3.0 00:20:56 python-jenkins==1.8.2 00:20:56 python-keystoneclient==5.2.0 00:20:56 python-magnumclient==4.3.0 00:20:56 python-novaclient==18.4.0 00:20:56 python-openstackclient==6.0.0 00:20:56 python-swiftclient==4.4.0 00:20:56 pytz==2023.3.post1 00:20:56 PyYAML==6.0.1 00:20:56 referencing==0.32.0 00:20:56 requests==2.31.0 00:20:56 requests-oauthlib==1.3.1 00:20:56 requestsexceptions==1.4.0 00:20:56 rfc3986==2.0.0 00:20:56 rpds-py==0.15.2 00:20:56 rsa==4.9 00:20:56 ruamel.yaml==0.18.5 00:20:56 ruamel.yaml.clib==0.2.8 00:20:56 s3transfer==0.10.0 00:20:56 simplejson==3.19.2 00:20:56 six==1.16.0 00:20:56 smmap==5.0.1 00:20:56 soupsieve==2.5 00:20:56 stevedore==5.1.0 00:20:56 tabulate==0.9.0 00:20:56 toml==0.10.2 00:20:56 tomlkit==0.12.3 00:20:56 tqdm==4.66.1 00:20:56 typing_extensions==4.9.0 00:20:56 tzdata==2023.3 00:20:56 urllib3==1.26.18 00:20:56 virtualenv==20.25.0 00:20:56 wcwidth==0.2.12 00:20:56 websocket-client==1.7.0 00:20:56 wrapt==1.16.0 00:20:56 xdg==6.0.0 00:20:56 xmltodict==0.13.0 00:20:56 yq==3.2.3 00:20:56 zipp==3.17.0 00:20:56 [EnvInject] - Injecting environment variables from a build step. 00:20:56 [EnvInject] - Injecting as environment variables the properties content 00:20:56 PYTHON=python3 00:20:56 00:20:56 [EnvInject] - Variables injected successfully. 00:20:56 [ric-plt-xapp-frame-py-pypi-verify-master] $ /bin/bash -l /tmp/jenkins13269695607796646043.sh 00:20:56 ---> tox-install.sh 00:20:56 + source /home/jenkins/lf-env.sh 00:20:56 + lf-activate-venv --venv-file /tmp/.toxenv tox virtualenv urllib3~=1.26.15 00:20:56 ++ mktemp -d /tmp/venv-XXXX 00:20:56 + lf_venv=/tmp/venv-HMen 00:20:56 + local venv_file=/tmp/.os_lf_venv 00:20:56 + local python=python3 00:20:56 + local options 00:20:56 + local set_path=true 00:20:56 + local install_args= 00:20:56 ++ getopt -o np:v: -l no-path,system-site-packages,python:,venv-file: -n lf-activate-venv -- --venv-file /tmp/.toxenv tox virtualenv urllib3~=1.26.15 00:20:56 + options=' --venv-file '\''/tmp/.toxenv'\'' -- '\''tox'\'' '\''virtualenv'\'' '\''urllib3~=1.26.15'\''' 00:20:56 + eval set -- ' --venv-file '\''/tmp/.toxenv'\'' -- '\''tox'\'' '\''virtualenv'\'' '\''urllib3~=1.26.15'\''' 00:20:56 ++ set -- --venv-file /tmp/.toxenv -- tox virtualenv urllib3~=1.26.15 00:20:56 + true 00:20:56 + case $1 in 00:20:56 + venv_file=/tmp/.toxenv 00:20:56 + shift 2 00:20:56 + true 00:20:56 + case $1 in 00:20:56 + shift 00:20:56 + break 00:20:56 + case $python in 00:20:56 + local pkg_list= 00:20:56 + [[ -d /opt/pyenv ]] 00:20:56 + echo 'Setup pyenv:' 00:20:56 Setup pyenv: 00:20:56 + export PYENV_ROOT=/opt/pyenv 00:20:56 + PYENV_ROOT=/opt/pyenv 00:20:56 + export PATH=/opt/pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:20:56 + PATH=/opt/pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:20:56 + pyenv versions 00:20:56 system 00:20:56 3.8.13 00:20:56 3.9.13 00:20:56 * 3.10.6 (set by /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/.python-version) 00:20:56 + command -v pyenv 00:20:56 ++ pyenv init - --no-rehash 00:20:56 + eval 'PATH="$(bash --norc -ec '\''IFS=:; paths=($PATH); for i in ${!paths[@]}; do if [[ ${paths[i]} == "'\''/opt/pyenv/shims'\''" ]]; then unset '\''\'\'''\''paths[i]'\''\'\'''\''; fi; done; echo "${paths[*]}"'\'')" 00:20:56 export PATH="/opt/pyenv/shims:${PATH}" 00:20:56 export PYENV_SHELL=bash 00:20:56 source '\''/opt/pyenv/libexec/../completions/pyenv.bash'\'' 00:20:56 pyenv() { 00:20:56 local command 00:20:56 command="${1:-}" 00:20:56 if [ "$#" -gt 0 ]; then 00:20:56 shift 00:20:56 fi 00:20:56 00:20:56 case "$command" in 00:20:56 rehash|shell) 00:20:56 eval "$(pyenv "sh-$command" "$@")" 00:20:56 ;; 00:20:56 *) 00:20:56 command pyenv "$command" "$@" 00:20:56 ;; 00:20:56 esac 00:20:56 }' 00:20:56 +++ bash --norc -ec 'IFS=:; paths=($PATH); for i in ${!paths[@]}; do if [[ ${paths[i]} == "/opt/pyenv/shims" ]]; then unset '\''paths[i]'\''; fi; done; echo "${paths[*]}"' 00:20:56 ++ PATH=/opt/pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:20:56 ++ export PATH=/opt/pyenv/shims:/opt/pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:20:56 ++ PATH=/opt/pyenv/shims:/opt/pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:20:56 ++ export PYENV_SHELL=bash 00:20:56 ++ PYENV_SHELL=bash 00:20:56 ++ source /opt/pyenv/libexec/../completions/pyenv.bash 00:20:56 +++ complete -F _pyenv pyenv 00:20:56 ++ lf-pyver python3 00:20:56 ++ local py_version_xy=python3 00:20:56 ++ local py_version_xyz= 00:20:56 ++ grep -E '^[0-9.]*[0-9]$' 00:20:56 ++ pyenv versions 00:20:56 ++ local command 00:20:56 ++ command=versions 00:20:56 ++ '[' 1 -gt 0 ']' 00:20:56 ++ shift 00:20:56 ++ case "$command" in 00:20:56 ++ command pyenv versions 00:20:56 ++ pyenv versions 00:20:56 ++ awk '{ print $1 }' 00:20:56 ++ sed 's/^[ *]* //' 00:20:56 ++ [[ ! -s /tmp/.pyenv_versions ]] 00:20:56 +++ grep '^3' /tmp/.pyenv_versions 00:20:56 +++ tail -n 1 00:20:56 +++ sort -V 00:20:56 ++ py_version_xyz=3.10.6 00:20:56 ++ [[ -z 3.10.6 ]] 00:20:56 ++ echo 3.10.6 00:20:56 ++ return 0 00:20:56 + pyenv local 3.10.6 00:20:56 + local command 00:20:56 + command=local 00:20:56 + '[' 2 -gt 0 ']' 00:20:56 + shift 00:20:56 + case "$command" in 00:20:56 + command pyenv local 3.10.6 00:20:56 + pyenv local 3.10.6 00:20:56 + for arg in "$@" 00:20:56 + case $arg in 00:20:56 + pkg_list+='tox ' 00:20:56 + for arg in "$@" 00:20:56 + case $arg in 00:20:56 + pkg_list+='virtualenv ' 00:20:56 + for arg in "$@" 00:20:56 + case $arg in 00:20:56 + pkg_list+='urllib3~=1.26.15 ' 00:20:56 + [[ -f /tmp/.toxenv ]] 00:20:56 + [[ ! -f /tmp/.toxenv ]] 00:20:56 + [[ -n '' ]] 00:20:56 + python3 -m venv /tmp/venv-HMen 00:21:00 + echo 'lf-activate-venv(): INFO: Creating python3 venv at /tmp/venv-HMen' 00:21:00 lf-activate-venv(): INFO: Creating python3 venv at /tmp/venv-HMen 00:21:00 + echo /tmp/venv-HMen 00:21:00 + echo 'lf-activate-venv(): INFO: Save venv in file: /tmp/.toxenv' 00:21:00 lf-activate-venv(): INFO: Save venv in file: /tmp/.toxenv 00:21:00 + /tmp/venv-HMen/bin/python3 -m pip install --upgrade --quiet pip virtualenv 00:21:03 + [[ -z tox virtualenv urllib3~=1.26.15 ]] 00:21:03 + echo 'lf-activate-venv(): INFO: Installing: tox virtualenv urllib3~=1.26.15 ' 00:21:03 lf-activate-venv(): INFO: Installing: tox virtualenv urllib3~=1.26.15 00:21:03 + /tmp/venv-HMen/bin/python3 -m pip install --upgrade --quiet --upgrade-strategy eager tox virtualenv urllib3~=1.26.15 00:21:06 + type python3 00:21:06 + true 00:21:06 + echo 'lf-activate-venv(): INFO: Adding /tmp/venv-HMen/bin to PATH' 00:21:06 lf-activate-venv(): INFO: Adding /tmp/venv-HMen/bin to PATH 00:21:06 + PATH=/tmp/venv-HMen/bin:/opt/pyenv/shims:/opt/pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:21:06 + return 0 00:21:06 + python3 --version 00:21:06 Python 3.10.6 00:21:06 + python3 -m pip --version 00:21:06 pip 23.3.2 from /tmp/venv-HMen/lib/python3.10/site-packages/pip (python 3.10) 00:21:06 + python3 -m pip freeze 00:21:07 cachetools==5.3.2 00:21:07 chardet==5.2.0 00:21:07 colorama==0.4.6 00:21:07 distlib==0.3.8 00:21:07 filelock==3.13.1 00:21:07 packaging==23.2 00:21:07 platformdirs==4.1.0 00:21:07 pluggy==1.3.0 00:21:07 pyproject-api==1.6.1 00:21:07 tomli==2.0.1 00:21:07 tox==4.11.4 00:21:07 urllib3==1.26.18 00:21:07 virtualenv==20.25.0 00:21:07 [ric-plt-xapp-frame-py-pypi-verify-master] $ /bin/bash /tmp/jenkins13858126883032271885.sh 00:21:07 ---> install-deb-rmr.sh 00:21:07 + version_file=rmr-version.yaml 00:21:07 + [[ -f rmr-version.yaml ]] 00:21:07 ++ grep '^repo:' rmr-version.yaml 00:21:07 ++ cut -d: -f2 00:21:07 ++ xargs 00:21:07 + repo= 00:21:07 ++ xargs 00:21:07 ++ cut -d: -f2 00:21:07 ++ grep '^version:' rmr-version.yaml 00:21:07 + ver=4.9.1 00:21:07 + [[ -z 4.9.1 ]] 00:21:07 + repo=release 00:21:07 + for deb in "rmr_${ver}_amd64.deb" "rmr-dev_${ver}_amd64.deb" 00:21:07 + wget -nv --content-disposition https://packagecloud.io/o-ran-sc/release/packages/debian/stretch/rmr_4.9.1_amd64.deb/download.deb 00:21:07 2023-12-28 00:21:07 URL:https://d3fo0g5hm7lbuv.cloudfront.net/20756/10598/debian/package_files/4252893.deb?Expires=1703723167&Signature=f9RZDfyoECvU86s50K1xrzU6ZTIQoRvCqYGENJDeLp5rk6ytiRP29AUl7CPS5iR9ROJU9y~IXgC0T5F2U3Rl7z4bo9ZpedDKkkd1RyI8TThAphpmlZDsk7Bo0C8p74CrSe80s0AeIlIB0JMRaTxe-kdKUX0t~ZzAmt00gwGB9PpzQ-xR5xhtQYSdGgyc~zXiCbvqpBnHf4OanDncusavvtz20AX32kZQ8muAyS0rjz-~ymCe50O9Ep-2mjIpfkIsSlqCaGh4a8LUMXkYJtS9Oo1NZc7uBmtbbdCTaiLf2hld1abP3M1BhTyJrCUqvX82YdmSAnVGiLEpZDQncWe8NA__&Key-Pair-Id=K1ZMSF1EKC3AZL [243050/243050] -> "rmr_4.9.1_amd64.deb" [1] 00:21:07 + sudo dpkg -i rmr_4.9.1_amd64.deb 00:21:07 Selecting previously unselected package rmr. 00:21:09 (Reading database ... 198606 files and directories currently installed.) 00:21:09 Preparing to unpack rmr_4.9.1_amd64.deb ... 00:21:09 Unpacking rmr (4.9.1) ... 00:21:09 Setting up rmr (4.9.1) ... 00:21:09 + rm -f rmr_4.9.1_amd64.deb 00:21:09 + for deb in "rmr_${ver}_amd64.deb" "rmr-dev_${ver}_amd64.deb" 00:21:09 + wget -nv --content-disposition https://packagecloud.io/o-ran-sc/release/packages/debian/stretch/rmr-dev_4.9.1_amd64.deb/download.deb 00:21:09 2023-12-28 00:21:09 URL:https://d3fo0g5hm7lbuv.cloudfront.net/20756/10598/debian/package_files/4252891.deb?Expires=1703723169&Signature=fCA~CSX1oFV1xY33KazbSGEqb9wOW4dzbu2GKOK1md2kQEd4-PyBclxvDTiLPmrfcF8qjASyfT4Bx5WQPlxWqgHh53At7UL9gXL54h-FT1dkFAJ1rTlxf3Y7OmkT9O6wKxtpAIh04DGM3kdp18N57yDYZwcSpM4KcwTPOLMLa7JbMI2P8d4sG2vuFWwNkwa6ynq0Y~4vqDzTYG-iJXkz-fpbHdokhqhLNI5G7fnGFzF3Ttv3-9uwG2CZJxddcWOSd7u4Diw~tyX7HJdhgxQT70Zqo584RYCcb5bo5~he7ymIn8lzDXIZAlaCb9l9RG-FpKHX12rTS3IV7XrdI8ailA__&Key-Pair-Id=K1ZMSF1EKC3AZL [126164/126164] -> "rmr-dev_4.9.1_amd64.deb" [1] 00:21:09 + sudo dpkg -i rmr-dev_4.9.1_amd64.deb 00:21:09 Selecting previously unselected package rmr-dev. 00:21:09 (Reading database ... 198614 files and directories currently installed.) 00:21:09 Preparing to unpack rmr-dev_4.9.1_amd64.deb ... 00:21:09 Unpacking rmr-dev (4.9.1) ... 00:21:09 Setting up rmr-dev (4.9.1) ... 00:21:09 + rm -f rmr-dev_4.9.1_amd64.deb 00:21:09 + echo '---> install-deb-rmr.sh ends' 00:21:09 ---> install-deb-rmr.sh ends 00:21:09 + echo '---> install-deb-e2ap.sh' 00:21:09 ---> install-deb-e2ap.sh 00:21:09 + set -eux 00:21:09 + version_file=e2ap-version.yaml 00:21:09 + [[ -f e2ap-version.yaml ]] 00:21:09 ++ grep '^repo:' e2ap-version.yaml 00:21:09 ++ xargs 00:21:09 ++ cut -d: -f2 00:21:09 + repo= 00:21:09 ++ grep '^version:' e2ap-version.yaml 00:21:09 ++ cut -d: -f2 00:21:09 ++ xargs 00:21:09 + ver=1.1.0 00:21:09 + [[ -z 1.1.0 ]] 00:21:09 + repo=release 00:21:09 + for deb in "riclibe2ap_${ver}_amd64.deb" "riclibe2ap-dev_${ver}_amd64.deb" 00:21:09 + wget -nv --content-disposition https://packagecloud.io/o-ran-sc/release/packages/debian/stretch/riclibe2ap_1.1.0_amd64.deb/download.deb 00:21:10 2023-12-28 00:21:10 URL:https://d3fo0g5hm7lbuv.cloudfront.net/20756/10598/debian/package_files/2517358.deb?Expires=1703723170&Signature=XQOTIsvDjq8PAyglxpG50KuBMQ3wpMek8rhy-d-mIFNX8Uk9NCTNLO2T6XjM3z8hiGkNJN5oiCrzUi4CUxuudEFxRJfK43llyixqDG3QqJdobXS2fM5iTiksgnrOuInInTt3pGWRtstBqQTR7E47i9E~ZeqLA0iB0NLcwCnaKxfYFk8JFjBWIx~qixpAK2~tPi9tuFxW41ar9PSg-3AVieBz4P19krjb8tEiwqDYJGa4yrdlJTzM~znZwFsEA9V9d2J-3PdLxTikZrRq1tRI73~K0DnYttolr46rw516fa5T~8W6NklQ0ZzSF-QCKyb7c2wHCqJuYH2b0PtBJCkNAA__&Key-Pair-Id=K1ZMSF1EKC3AZL [341294/341294] -> "riclibe2ap_1.1.0_amd64.deb" [1] 00:21:10 + sudo dpkg -i riclibe2ap_1.1.0_amd64.deb 00:21:10 Selecting previously unselected package riclibe2ap. 00:21:10 (Reading database ... 198621 files and directories currently installed.) 00:21:10 Preparing to unpack riclibe2ap_1.1.0_amd64.deb ... 00:21:10 Unpacking riclibe2ap (1.1.0) ... 00:21:10 Setting up riclibe2ap (1.1.0) ... 00:21:10 + rm -f riclibe2ap_1.1.0_amd64.deb 00:21:10 + for deb in "riclibe2ap_${ver}_amd64.deb" "riclibe2ap-dev_${ver}_amd64.deb" 00:21:10 + wget -nv --content-disposition https://packagecloud.io/o-ran-sc/release/packages/debian/stretch/riclibe2ap-dev_1.1.0_amd64.deb/download.deb 00:21:10 2023-12-28 00:21:10 URL:https://d3fo0g5hm7lbuv.cloudfront.net/20756/10598/debian/package_files/2517359.deb?Expires=1703723170&Signature=Ei3KsWUf8-3Vpi5t~z~fP0V~WRUhVFf4Epi6Yf4CPd2aqmkCUX-3APDL80P7dASX6y9T2aTqXvpw~29h4EiTQ1vqDWkWrsNxC~N8hnnTnjrb3T2cA3pp-ZGtrvsBu86bmvKxgzcbzj-qq20fW9Uc9n77KrwQ1bWwjk9FnSGTie8nl26lfT~jXSae8qGQ8Slq8T3GFZqutKH68TRobaQbG6DzJSuH8-QrAuxKBkpNe9bsuwmqfWMUG6onPnht0sUTGHb6zQMqRbf-7cul52~DZFypHm0R0OcqmmS0Cts8GlVzGyisWBwpRviMRqqBfa5ymmanOVIRT6Gq-j88UMZefg__&Key-Pair-Id=K1ZMSF1EKC3AZL [823070/823070] -> "riclibe2ap-dev_1.1.0_amd64.deb" [1] 00:21:10 + sudo dpkg -i riclibe2ap-dev_1.1.0_amd64.deb 00:21:10 Selecting previously unselected package riclibe2ap-dev. 00:21:10 (Reading database ... 198624 files and directories currently installed.) 00:21:10 Preparing to unpack riclibe2ap-dev_1.1.0_amd64.deb ... 00:21:10 Unpacking riclibe2ap-dev (1.1.0) ... 00:21:10 Setting up riclibe2ap-dev (1.1.0) ... 00:21:10 + rm -f riclibe2ap-dev_1.1.0_amd64.deb 00:21:10 + echo '---> install-deb-e2ap.sh ends' 00:21:10 ---> install-deb-e2ap.sh ends 00:21:10 [EnvInject] - Injecting environment variables from a build step. 00:21:10 [EnvInject] - Injecting as environment variables the properties content 00:21:10 PARALLEL=False 00:21:10 00:21:10 [EnvInject] - Variables injected successfully. 00:21:10 [ric-plt-xapp-frame-py-pypi-verify-master] $ /bin/bash -l /tmp/jenkins6002329460266996131.sh 00:21:10 ---> tox-run.sh 00:21:10 + PATH=/home/jenkins/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:21:10 + ARCHIVE_TOX_DIR=/w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/archives/tox 00:21:10 + ARCHIVE_DOC_DIR=/w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/archives/docs 00:21:10 + mkdir -p /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/archives/tox 00:21:10 + cd /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/. 00:21:10 + source /home/jenkins/lf-env.sh 00:21:10 + lf-activate-venv --venv-file /tmp/.toxenv tox virtualenv urllib3~=1.26.15 00:21:10 ++ mktemp -d /tmp/venv-XXXX 00:21:10 + lf_venv=/tmp/venv-Ebzt 00:21:10 + local venv_file=/tmp/.os_lf_venv 00:21:10 + local python=python3 00:21:10 + local options 00:21:10 + local set_path=true 00:21:10 + local install_args= 00:21:10 ++ getopt -o np:v: -l no-path,system-site-packages,python:,venv-file: -n lf-activate-venv -- --venv-file /tmp/.toxenv tox virtualenv urllib3~=1.26.15 00:21:10 + options=' --venv-file '\''/tmp/.toxenv'\'' -- '\''tox'\'' '\''virtualenv'\'' '\''urllib3~=1.26.15'\''' 00:21:10 + eval set -- ' --venv-file '\''/tmp/.toxenv'\'' -- '\''tox'\'' '\''virtualenv'\'' '\''urllib3~=1.26.15'\''' 00:21:10 ++ set -- --venv-file /tmp/.toxenv -- tox virtualenv urllib3~=1.26.15 00:21:10 + true 00:21:10 + case $1 in 00:21:10 + venv_file=/tmp/.toxenv 00:21:10 + shift 2 00:21:10 + true 00:21:10 + case $1 in 00:21:10 + shift 00:21:10 + break 00:21:10 + case $python in 00:21:10 + local pkg_list= 00:21:10 + [[ -d /opt/pyenv ]] 00:21:10 + echo 'Setup pyenv:' 00:21:10 Setup pyenv: 00:21:10 + export PYENV_ROOT=/opt/pyenv 00:21:10 + PYENV_ROOT=/opt/pyenv 00:21:10 + export PATH=/opt/pyenv/bin:/home/jenkins/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:21:10 + PATH=/opt/pyenv/bin:/home/jenkins/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:21:10 + pyenv versions 00:21:10 system 00:21:10 3.8.13 00:21:10 3.9.13 00:21:10 * 3.10.6 (set by /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/.python-version) 00:21:10 + command -v pyenv 00:21:10 ++ pyenv init - --no-rehash 00:21:10 + eval 'PATH="$(bash --norc -ec '\''IFS=:; paths=($PATH); for i in ${!paths[@]}; do if [[ ${paths[i]} == "'\''/opt/pyenv/shims'\''" ]]; then unset '\''\'\'''\''paths[i]'\''\'\'''\''; fi; done; echo "${paths[*]}"'\'')" 00:21:10 export PATH="/opt/pyenv/shims:${PATH}" 00:21:10 export PYENV_SHELL=bash 00:21:10 source '\''/opt/pyenv/libexec/../completions/pyenv.bash'\'' 00:21:10 pyenv() { 00:21:10 local command 00:21:10 command="${1:-}" 00:21:10 if [ "$#" -gt 0 ]; then 00:21:10 shift 00:21:10 fi 00:21:10 00:21:10 case "$command" in 00:21:10 rehash|shell) 00:21:10 eval "$(pyenv "sh-$command" "$@")" 00:21:10 ;; 00:21:10 *) 00:21:10 command pyenv "$command" "$@" 00:21:10 ;; 00:21:10 esac 00:21:10 }' 00:21:10 +++ bash --norc -ec 'IFS=:; paths=($PATH); for i in ${!paths[@]}; do if [[ ${paths[i]} == "/opt/pyenv/shims" ]]; then unset '\''paths[i]'\''; fi; done; echo "${paths[*]}"' 00:21:10 ++ PATH=/opt/pyenv/bin:/home/jenkins/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:21:10 ++ export PATH=/opt/pyenv/shims:/opt/pyenv/bin:/home/jenkins/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:21:10 ++ PATH=/opt/pyenv/shims:/opt/pyenv/bin:/home/jenkins/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:21:10 ++ export PYENV_SHELL=bash 00:21:10 ++ PYENV_SHELL=bash 00:21:10 ++ source /opt/pyenv/libexec/../completions/pyenv.bash 00:21:10 +++ complete -F _pyenv pyenv 00:21:10 ++ lf-pyver python3 00:21:10 ++ local py_version_xy=python3 00:21:10 ++ local py_version_xyz= 00:21:10 ++ pyenv versions 00:21:10 ++ local command 00:21:10 ++ grep -E '^[0-9.]*[0-9]$' 00:21:10 ++ command=versions 00:21:10 ++ '[' 1 -gt 0 ']' 00:21:10 ++ shift 00:21:10 ++ case "$command" in 00:21:10 ++ command pyenv versions 00:21:10 ++ pyenv versions 00:21:10 ++ sed 's/^[ *]* //' 00:21:10 ++ awk '{ print $1 }' 00:21:10 ++ [[ ! -s /tmp/.pyenv_versions ]] 00:21:10 +++ grep '^3' /tmp/.pyenv_versions 00:21:10 +++ sort -V 00:21:10 +++ tail -n 1 00:21:10 ++ py_version_xyz=3.10.6 00:21:10 ++ [[ -z 3.10.6 ]] 00:21:10 ++ echo 3.10.6 00:21:10 ++ return 0 00:21:10 + pyenv local 3.10.6 00:21:10 + local command 00:21:10 + command=local 00:21:10 + '[' 2 -gt 0 ']' 00:21:10 + shift 00:21:10 + case "$command" in 00:21:10 + command pyenv local 3.10.6 00:21:10 + pyenv local 3.10.6 00:21:10 + for arg in "$@" 00:21:10 + case $arg in 00:21:10 + pkg_list+='tox ' 00:21:10 + for arg in "$@" 00:21:10 + case $arg in 00:21:10 + pkg_list+='virtualenv ' 00:21:10 + for arg in "$@" 00:21:10 + case $arg in 00:21:10 + pkg_list+='urllib3~=1.26.15 ' 00:21:10 + [[ -f /tmp/.toxenv ]] 00:21:10 ++ cat /tmp/.toxenv 00:21:10 + lf_venv=/tmp/venv-HMen 00:21:10 + echo 'lf-activate-venv(): INFO: Reuse venv:/tmp/venv-HMen from' file:/tmp/.toxenv 00:21:10 lf-activate-venv(): INFO: Reuse venv:/tmp/venv-HMen from file:/tmp/.toxenv 00:21:10 + /tmp/venv-HMen/bin/python3 -m pip install --upgrade --quiet pip virtualenv 00:21:11 + [[ -z tox virtualenv urllib3~=1.26.15 ]] 00:21:11 + echo 'lf-activate-venv(): INFO: Installing: tox virtualenv urllib3~=1.26.15 ' 00:21:11 lf-activate-venv(): INFO: Installing: tox virtualenv urllib3~=1.26.15 00:21:11 + /tmp/venv-HMen/bin/python3 -m pip install --upgrade --quiet --upgrade-strategy eager tox virtualenv urllib3~=1.26.15 00:21:13 + type python3 00:21:13 + true 00:21:13 + echo 'lf-activate-venv(): INFO: Adding /tmp/venv-HMen/bin to PATH' 00:21:13 lf-activate-venv(): INFO: Adding /tmp/venv-HMen/bin to PATH 00:21:13 + PATH=/tmp/venv-HMen/bin:/opt/pyenv/shims:/opt/pyenv/bin:/home/jenkins/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:21:13 + return 0 00:21:13 + [[ -d /opt/pyenv ]] 00:21:13 + echo '---> Setting up pyenv' 00:21:13 ---> Setting up pyenv 00:21:13 + export PYENV_ROOT=/opt/pyenv 00:21:13 + PYENV_ROOT=/opt/pyenv 00:21:13 + export PATH=/opt/pyenv/bin:/tmp/venv-HMen/bin:/opt/pyenv/shims:/opt/pyenv/bin:/home/jenkins/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:21:13 + PATH=/opt/pyenv/bin:/tmp/venv-HMen/bin:/opt/pyenv/shims:/opt/pyenv/bin:/home/jenkins/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin 00:21:13 ++ pwd 00:21:13 + PYTHONPATH=/w/workspace/ric-plt-xapp-frame-py-pypi-verify-master 00:21:13 + export PYTHONPATH 00:21:13 + export TOX_TESTENV_PASSENV=PYTHONPATH 00:21:13 + TOX_TESTENV_PASSENV=PYTHONPATH 00:21:13 + tox --version 00:21:13 4.11.4 from /tmp/venv-HMen/lib/python3.10/site-packages/tox/__init__.py 00:21:13 + PARALLEL=False 00:21:13 + TOX_OPTIONS_LIST= 00:21:13 + [[ -n code,flake8 ]] 00:21:13 + TOX_OPTIONS_LIST=' -e code,flake8' 00:21:13 + case ${PARALLEL,,} in 00:21:13 + tee -a /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/archives/tox/tox.log 00:21:13 + tox -e code,flake8 00:21:15 code: install_deps> python -I -m pip install coverage pytest pytest-cov six 00:21:19 .pkg: install_requires> python -I -m pip install 'setuptools>=40.8.0' wheel 00:21:20 .pkg: _optional_hooks> python /tmp/venv-HMen/lib/python3.10/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__ 00:21:21 .pkg: get_requires_for_build_sdist> python /tmp/venv-HMen/lib/python3.10/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__ 00:21:21 .pkg: get_requires_for_build_wheel> python /tmp/venv-HMen/lib/python3.10/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__ 00:21:21 .pkg: install_requires_for_build_wheel> python -I -m pip install wheel 00:21:21 .pkg: freeze> python -m pip freeze --all 00:21:22 .pkg: pip==23.3.1,setuptools==69.0.2,wheel==0.42.0 00:21:22 .pkg: prepare_metadata_for_build_wheel> python /tmp/venv-HMen/lib/python3.10/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__ 00:21:22 .pkg: build_sdist> python /tmp/venv-HMen/lib/python3.10/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__ 00:21:22 code: install_package_deps> python -I -m pip install inotify inotify-simple mdclogpy msgpack 'protobuf<3.21.0' requests 'ricsdl<4.0.0,>=3.0.0' 00:21:28 code: install_package> python -I -m pip install --force-reinstall --no-deps /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/.tox/.tmp/package/1/ricxappframe-3.2.2.tar.gz 00:21:30 code: freeze> python -m pip freeze --all 00:21:30 code: async-timeout==4.0.3,certifi==2023.11.17,charset-normalizer==3.3.2,coverage==7.3.4,exceptiongroup==1.2.0,hiredis==2.0.0,idna==3.6,iniconfig==2.0.0,inotify==0.2.10,inotify-simple==1.3.5,mdclogpy==1.1.4,msgpack==1.0.7,nose==1.3.7,packaging==23.2,pip==23.3.1,pluggy==1.3.0,protobuf==3.20.3,pytest==7.4.3,pytest-cov==4.1.0,redis==4.3.6,requests==2.31.0,ricsdl==3.1.3,ricxappframe @ file:///w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/.tox/.tmp/package/1/ricxappframe-3.2.2.tar.gz#sha256=08ae96fe41ad8ff490a167bd33abe06baae1d28d33f0e9062c32034694303b13,setuptools==69.0.2,six==1.16.0,tomli==2.0.1,urllib3==2.1.0,wheel==0.42.0 00:21:30 code: commands[0]> pytest --cov ricxappframe --cov-report xml --cov-report term-missing --cov-report html --cov-fail-under=70 --junitxml=/tmp/tests.xml 00:21:31 ============================= test session starts ============================== 00:21:31 platform linux -- Python 3.10.6, pytest-7.4.3, pluggy-1.3.0 00:21:31 cachedir: .tox/code/.pytest_cache 00:21:31 rootdir: /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master 00:21:31 plugins: cov-4.1.0 00:21:31 collected 75 items 00:21:31 00:21:31 tests/test_Logger.py .............. [ 18%] 00:21:31 tests/test_alarm.py .. [ 21%] 00:21:36 tests/test_config.py FFF [ 25%] 00:23:13 tests/test_e2ap.py ........ [ 36%] 00:23:13 tests/test_init.py .FF [ 40%] 00:23:13 tests/test_metric.py .. [ 42%] 00:23:18 tests/test_rest.py . [ 44%] 00:23:18 tests/test_rmr.py ............. [ 61%] 00:23:28 tests/test_rmr_mocks.py ... [ 65%] 00:23:28 tests/test_rmrclib.py .. [ 68%] 00:23:28 tests/test_sdl.py ..... [ 74%] 00:23:29 tests/test_subscribe.py .... [ 80%] 00:23:29 tests/test_symptomdata.py .... [ 85%] 00:23:29 tests/test_xapps.py FFFFFFFFFFF [100%] 00:23:30 00:23:30 =================================== FAILURES =================================== 00:23:30 ______________________________ test_config_no_env ______________________________ 00:23:30 00:23:30 monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f3a2b115900> 00:23:30 00:23:30 def test_config_no_env(monkeypatch): 00:23:30 init_config_file() 00:23:30 monkeypatch.delenv(Constants.CONFIG_FILE_ENV, raising=False) 00:23:30 00:23:30 def default_rmr_handler(self, summary, sbuf): 00:23:30 pass 00:23:30 00:23:30 config_event_seen = False 00:23:30 00:23:30 def config_handler(self, json): 00:23:30 nonlocal config_event_seen 00:23:30 config_event_seen = True 00:23:30 00:23:30 global rmr_xapp_noconfig 00:23:30 > rmr_xapp_noconfig = RMRXapp(default_rmr_handler, config_handler=config_handler, rmr_port=4652, use_fake_sdl=True) 00:23:30 00:23:30 tests/test_config.py:58: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 ricxappframe/xapp_frame.py:811: in __init__ 00:23:30 super().__init__( 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 rmr_port = 4652, rmr_wait_for_ready = True, use_fake_sdl = True 00:23:30 post_init = None 00:23:30 00:23:30 def __init__(self, rmr_port=4562, rmr_wait_for_ready=True, use_fake_sdl=False, post_init=None): 00:23:30 """ 00:23:30 Documented in the class comment. 00:23:30 """ 00:23:30 # PUBLIC, can be used by xapps using self.(name): 00:23:30 self.logger = Logger(name=__name__) 00:23:30 self._appthread = None 00:23:30 00:23:30 # Start rmr rcv thread 00:23:30 self._rmr_loop = xapp_rmr.RmrLoop(port=rmr_port, wait_for_ready=rmr_wait_for_ready) 00:23:30 self._mrc = self._rmr_loop.mrc # for convenience 00:23:30 00:23:30 # SDL 00:23:30 self.sdl = SDLWrapper(use_fake_sdl) 00:23:30 00:23:30 # Config 00:23:30 # The environment variable specifies the path to the Xapp config file 00:23:30 self._config_path = os.environ.get(Constants.CONFIG_FILE_ENV, None) 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 self._inotify = inotify_simple.INotify() 00:23:30 self._inotify.add_watch(self._config_path, inotify_simple.flags.MODIFY) 00:23:30 self.logger.debug("__init__: watching config file {}".format(self._config_path)) 00:23:30 else: 00:23:30 self._inotify = None 00:23:30 self.logger.warning("__init__: NOT watching any config file") 00:23:30 00:23:30 self.session = requests.Session() 00:23:30 # set Retry mechanism for any failure 00:23:30 retries = Retry(total=5, 00:23:30 backoff_factor=1, 00:23:30 allowed_methods=frozenset(['GET', 'POST'])) 00:23:30 00:23:30 adapter = HTTPAdapter(max_retries=retries) 00:23:30 self.session.mount('http://', adapter) 00:23:30 self.session.mount('https://', adapter) 00:23:30 00:23:30 # configuration data for xapp registration and deregistration 00:23:30 self._config_data = None 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 with open(self._config_path) as json_file: 00:23:30 self._config_data = json.load(json_file) 00:23:30 else: 00:23:30 > elf.logger.error("__init__: Cannot Read config file for xapp Registration") 00:23:30 E NameError: name 'elf' is not defined 00:23:30 00:23:30 ricxappframe/xapp_frame.py:128: NameError 00:23:30 _________________________ test_default_config_handler __________________________ 00:23:30 00:23:30 self = 00:23:30 00:23:30 def _new_conn(self) -> socket.socket: 00:23:30 """Establish a socket connection and set nodelay settings on it. 00:23:30 00:23:30 :return: New socket connection. 00:23:30 """ 00:23:30 try: 00:23:30 > sock = connection.create_connection( 00:23:30 (self._dns_host, self.port), 00:23:30 self.timeout, 00:23:30 source_address=self.source_address, 00:23:30 socket_options=self.socket_options, 00:23:30 ) 00:23:30 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connection.py:203: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/util/connection.py:60: in create_connection 00:23:30 for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 host = 'service-ricplt-appmgr-http.ricplt', port = 8080 00:23:30 family = , type = 00:23:30 proto = 0, flags = 0 00:23:30 00:23:30 def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0): 00:23:30 """Resolve host and port into list of address info entries. 00:23:30 00:23:30 Translate the host/port argument into a sequence of 5-tuples that contain 00:23:30 all the necessary arguments for creating a socket connected to that service. 00:23:30 host is a domain name, a string representation of an IPv4/v6 address or 00:23:30 None. port is a string service name such as 'http', a numeric port number or 00:23:30 None. By passing None as the value of host and port, you can pass NULL to 00:23:30 the underlying C API. 00:23:30 00:23:30 The family, type and proto arguments can be optionally specified in order to 00:23:30 narrow the list of addresses returned. Passing zero as a value for each of 00:23:30 these arguments selects the full range of results. 00:23:30 """ 00:23:30 # We override this function since we want to translate the numeric family 00:23:30 # and socket type values to enum constants. 00:23:30 addrlist = [] 00:23:30 > for res in _socket.getaddrinfo(host, port, family, type, proto, flags): 00:23:30 E OSError: [Errno 16] Device or resource busy 00:23:30 00:23:30 /opt/pyenv/versions/3.10.6/lib/python3.10/socket.py:955: OSError 00:23:30 00:23:30 The above exception was the direct cause of the following exception: 00:23:30 00:23:30 self = 00:23:30 method = 'POST', url = '/ric/v1/deregister', body = '' 00:23:30 headers = {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded'} 00:23:30 retries = Retry(total=0, connect=None, read=None, redirect=None, status=None) 00:23:30 redirect = False, assert_same_host = False 00:23:30 timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None 00:23:30 release_conn = False, chunked = True, body_pos = None, preload_content = False 00:23:30 decode_content = False, response_kw = {} 00:23:30 parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/ric/v1/deregister', query=None, fragment=None) 00:23:30 destination_scheme = None, conn = None, release_this_conn = True 00:23:30 http_tunnel_required = False, err = None, clean_exit = False 00:23:30 00:23:30 def urlopen( # type: ignore[override] 00:23:30 self, 00:23:30 method: str, 00:23:30 url: str, 00:23:30 body: _TYPE_BODY | None = None, 00:23:30 headers: typing.Mapping[str, str] | None = None, 00:23:30 retries: Retry | bool | int | None = None, 00:23:30 redirect: bool = True, 00:23:30 assert_same_host: bool = True, 00:23:30 timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, 00:23:30 pool_timeout: int | None = None, 00:23:30 release_conn: bool | None = None, 00:23:30 chunked: bool = False, 00:23:30 body_pos: _TYPE_BODY_POSITION | None = None, 00:23:30 preload_content: bool = True, 00:23:30 decode_content: bool = True, 00:23:30 **response_kw: typing.Any, 00:23:30 ) -> BaseHTTPResponse: 00:23:30 """ 00:23:30 Get a connection from the pool and perform an HTTP request. This is the 00:23:30 lowest level call for making a request, so you'll need to specify all 00:23:30 the raw details. 00:23:30 00:23:30 .. note:: 00:23:30 00:23:30 More commonly, it's appropriate to use a convenience method 00:23:30 such as :meth:`request`. 00:23:30 00:23:30 .. note:: 00:23:30 00:23:30 `release_conn` will only behave as expected if 00:23:30 `preload_content=False` because we want to make 00:23:30 `preload_content=False` the default behaviour someday soon without 00:23:30 breaking backwards compatibility. 00:23:30 00:23:30 :param method: 00:23:30 HTTP request method (such as GET, POST, PUT, etc.) 00:23:30 00:23:30 :param url: 00:23:30 The URL to perform the request on. 00:23:30 00:23:30 :param body: 00:23:30 Data to send in the request body, either :class:`str`, :class:`bytes`, 00:23:30 an iterable of :class:`str`/:class:`bytes`, or a file-like object. 00:23:30 00:23:30 :param headers: 00:23:30 Dictionary of custom headers to send, such as User-Agent, 00:23:30 If-None-Match, etc. If None, pool headers are used. If provided, 00:23:30 these headers completely replace any pool-specific headers. 00:23:30 00:23:30 :param retries: 00:23:30 Configure the number of retries to allow before raising a 00:23:30 :class:`~urllib3.exceptions.MaxRetryError` exception. 00:23:30 00:23:30 Pass ``None`` to retry until you receive a response. Pass a 00:23:30 :class:`~urllib3.util.retry.Retry` object for fine-grained control 00:23:30 over different types of retries. 00:23:30 Pass an integer number to retry connection errors that many times, 00:23:30 but no other types of errors. Pass zero to never retry. 00:23:30 00:23:30 If ``False``, then retries are disabled and any exception is raised 00:23:30 immediately. Also, instead of raising a MaxRetryError on redirects, 00:23:30 the redirect response will be returned. 00:23:30 00:23:30 :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. 00:23:30 00:23:30 :param redirect: 00:23:30 If True, automatically handle redirects (status codes 301, 302, 00:23:30 303, 307, 308). Each redirect counts as a retry. Disabling retries 00:23:30 will disable redirect, too. 00:23:30 00:23:30 :param assert_same_host: 00:23:30 If ``True``, will make sure that the host of the pool requests is 00:23:30 consistent else will raise HostChangedError. When ``False``, you can 00:23:30 use the pool on an HTTP proxy and request foreign hosts. 00:23:30 00:23:30 :param timeout: 00:23:30 If specified, overrides the default timeout for this one 00:23:30 request. It may be a float (in seconds) or an instance of 00:23:30 :class:`urllib3.util.Timeout`. 00:23:30 00:23:30 :param pool_timeout: 00:23:30 If set and the pool is set to block=True, then this method will 00:23:30 block for ``pool_timeout`` seconds and raise EmptyPoolError if no 00:23:30 connection is available within the time period. 00:23:30 00:23:30 :param bool preload_content: 00:23:30 If True, the response's body will be preloaded into memory. 00:23:30 00:23:30 :param bool decode_content: 00:23:30 If True, will attempt to decode the body based on the 00:23:30 'content-encoding' header. 00:23:30 00:23:30 :param release_conn: 00:23:30 If False, then the urlopen call will not release the connection 00:23:30 back into the pool once a response is received (but will release if 00:23:30 you read the entire contents of the response such as when 00:23:30 `preload_content=True`). This is useful if you're not preloading 00:23:30 the response's content immediately. You will need to call 00:23:30 ``r.release_conn()`` on the response ``r`` to return the connection 00:23:30 back into the pool. If None, it takes the value of ``preload_content`` 00:23:30 which defaults to ``True``. 00:23:30 00:23:30 :param bool chunked: 00:23:30 If True, urllib3 will send the body using chunked transfer 00:23:30 encoding. Otherwise, urllib3 will send the body using the standard 00:23:30 content-length form. Defaults to False. 00:23:30 00:23:30 :param int body_pos: 00:23:30 Position to seek to in file-like body in the event of a retry or 00:23:30 redirect. Typically this won't need to be set because urllib3 will 00:23:30 auto-populate the value when needed. 00:23:30 """ 00:23:30 parsed_url = parse_url(url) 00:23:30 destination_scheme = parsed_url.scheme 00:23:30 00:23:30 if headers is None: 00:23:30 headers = self.headers 00:23:30 00:23:30 if not isinstance(retries, Retry): 00:23:30 retries = Retry.from_int(retries, redirect=redirect, default=self.retries) 00:23:30 00:23:30 if release_conn is None: 00:23:30 release_conn = preload_content 00:23:30 00:23:30 # Check host 00:23:30 if assert_same_host and not self.is_same_host(url): 00:23:30 raise HostChangedError(self, url, retries) 00:23:30 00:23:30 # Ensure that the URL we're connecting to is properly encoded 00:23:30 if url.startswith("/"): 00:23:30 url = to_str(_encode_target(url)) 00:23:30 else: 00:23:30 url = to_str(parsed_url.url) 00:23:30 00:23:30 conn = None 00:23:30 00:23:30 # Track whether `conn` needs to be released before 00:23:30 # returning/raising/recursing. Update this variable if necessary, and 00:23:30 # leave `release_conn` constant throughout the function. That way, if 00:23:30 # the function recurses, the original value of `release_conn` will be 00:23:30 # passed down into the recursive call, and its value will be respected. 00:23:30 # 00:23:30 # See issue #651 [1] for details. 00:23:30 # 00:23:30 # [1] 00:23:30 release_this_conn = release_conn 00:23:30 00:23:30 http_tunnel_required = connection_requires_http_tunnel( 00:23:30 self.proxy, self.proxy_config, destination_scheme 00:23:30 ) 00:23:30 00:23:30 # Merge the proxy headers. Only done when not using HTTP CONNECT. We 00:23:30 # have to copy the headers dict so we can safely change it without those 00:23:30 # changes being reflected in anyone else's copy. 00:23:30 if not http_tunnel_required: 00:23:30 headers = headers.copy() # type: ignore[attr-defined] 00:23:30 headers.update(self.proxy_headers) # type: ignore[union-attr] 00:23:30 00:23:30 # Must keep the exception bound to a separate variable or else Python 3 00:23:30 # complains about UnboundLocalError. 00:23:30 err = None 00:23:30 00:23:30 # Keep track of whether we cleanly exited the except block. This 00:23:30 # ensures we do proper cleanup in finally. 00:23:30 clean_exit = False 00:23:30 00:23:30 # Rewind body position, if needed. Record current position 00:23:30 # for future rewinds in the event of a redirect/retry. 00:23:30 body_pos = set_file_position(body, body_pos) 00:23:30 00:23:30 try: 00:23:30 # Request a connection from the queue. 00:23:30 timeout_obj = self._get_timeout(timeout) 00:23:30 conn = self._get_conn(timeout=pool_timeout) 00:23:30 00:23:30 conn.timeout = timeout_obj.connect_timeout # type: ignore[assignment] 00:23:30 00:23:30 # Is this a closed/new connection that requires CONNECT tunnelling? 00:23:30 if self.proxy is not None and http_tunnel_required and conn.is_closed: 00:23:30 try: 00:23:30 self._prepare_proxy(conn) 00:23:30 except (BaseSSLError, OSError, SocketTimeout) as e: 00:23:30 self._raise_timeout( 00:23:30 err=e, url=self.proxy.url, timeout_value=conn.timeout 00:23:30 ) 00:23:30 raise 00:23:30 00:23:30 # If we're going to release the connection in ``finally:``, then 00:23:30 # the response doesn't need to know about the connection. Otherwise 00:23:30 # it will also try to release it and we'll have a double-release 00:23:30 # mess. 00:23:30 response_conn = conn if not release_conn else None 00:23:30 00:23:30 # Make the request on the HTTPConnection object 00:23:30 > response = self._make_request( 00:23:30 conn, 00:23:30 method, 00:23:30 url, 00:23:30 timeout=timeout_obj, 00:23:30 body=body, 00:23:30 headers=headers, 00:23:30 chunked=chunked, 00:23:30 retries=retries, 00:23:30 response_conn=response_conn, 00:23:30 preload_content=preload_content, 00:23:30 decode_content=decode_content, 00:23:30 **response_kw, 00:23:30 ) 00:23:30 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:790: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:496: in _make_request 00:23:30 conn.request( 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connection.py:395: in request 00:23:30 self.endheaders() 00:23:30 /opt/pyenv/versions/3.10.6/lib/python3.10/http/client.py:1277: in endheaders 00:23:30 self._send_output(message_body, encode_chunked=encode_chunked) 00:23:30 /opt/pyenv/versions/3.10.6/lib/python3.10/http/client.py:1037: in _send_output 00:23:30 self.send(msg) 00:23:30 /opt/pyenv/versions/3.10.6/lib/python3.10/http/client.py:975: in send 00:23:30 self.connect() 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connection.py:243: in connect 00:23:30 self.sock = self._new_conn() 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 00:23:30 def _new_conn(self) -> socket.socket: 00:23:30 """Establish a socket connection and set nodelay settings on it. 00:23:30 00:23:30 :return: New socket connection. 00:23:30 """ 00:23:30 try: 00:23:30 sock = connection.create_connection( 00:23:30 (self._dns_host, self.port), 00:23:30 self.timeout, 00:23:30 source_address=self.source_address, 00:23:30 socket_options=self.socket_options, 00:23:30 ) 00:23:30 except socket.gaierror as e: 00:23:30 raise NameResolutionError(self.host, self, e) from e 00:23:30 except SocketTimeout as e: 00:23:30 raise ConnectTimeoutError( 00:23:30 self, 00:23:30 f"Connection to {self.host} timed out. (connect timeout={self.timeout})", 00:23:30 ) from e 00:23:30 00:23:30 except OSError as e: 00:23:30 > raise NewConnectionError( 00:23:30 self, f"Failed to establish a new connection: {e}" 00:23:30 ) from e 00:23:30 E urllib3.exceptions.NewConnectionError: : Failed to establish a new connection: [Errno 16] Device or resource busy 00:23:30 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connection.py:218: NewConnectionError 00:23:30 00:23:30 The above exception was the direct cause of the following exception: 00:23:30 00:23:30 self = 00:23:30 request = , stream = False 00:23:30 timeout = Timeout(connect=None, read=None, total=None), verify = True 00:23:30 cert = None, proxies = OrderedDict() 00:23:30 00:23:30 def send( 00:23:30 self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None 00:23:30 ): 00:23:30 """Sends PreparedRequest object. Returns Response object. 00:23:30 00:23:30 :param request: The :class:`PreparedRequest ` being sent. 00:23:30 :param stream: (optional) Whether to stream the request content. 00:23:30 :param timeout: (optional) How long to wait for the server to send 00:23:30 data before giving up, as a float, or a :ref:`(connect timeout, 00:23:30 read timeout) ` tuple. 00:23:30 :type timeout: float or tuple or urllib3 Timeout object 00:23:30 :param verify: (optional) Either a boolean, in which case it controls whether 00:23:30 we verify the server's TLS certificate, or a string, in which case it 00:23:30 must be a path to a CA bundle to use 00:23:30 :param cert: (optional) Any user-provided SSL certificate to be trusted. 00:23:30 :param proxies: (optional) The proxies dictionary to apply to the request. 00:23:30 :rtype: requests.Response 00:23:30 """ 00:23:30 00:23:30 try: 00:23:30 conn = self.get_connection(request.url, proxies) 00:23:30 except LocationValueError as e: 00:23:30 raise InvalidURL(e, request=request) 00:23:30 00:23:30 self.cert_verify(conn, request.url, verify, cert) 00:23:30 url = self.request_url(request, proxies) 00:23:30 self.add_headers( 00:23:30 request, 00:23:30 stream=stream, 00:23:30 timeout=timeout, 00:23:30 verify=verify, 00:23:30 cert=cert, 00:23:30 proxies=proxies, 00:23:30 ) 00:23:30 00:23:30 chunked = not (request.body is None or "Content-Length" in request.headers) 00:23:30 00:23:30 if isinstance(timeout, tuple): 00:23:30 try: 00:23:30 connect, read = timeout 00:23:30 timeout = TimeoutSauce(connect=connect, read=read) 00:23:30 except ValueError: 00:23:30 raise ValueError( 00:23:30 f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, " 00:23:30 f"or a single float to set both timeouts to the same value." 00:23:30 ) 00:23:30 elif isinstance(timeout, TimeoutSauce): 00:23:30 pass 00:23:30 else: 00:23:30 timeout = TimeoutSauce(connect=timeout, read=timeout) 00:23:30 00:23:30 try: 00:23:30 > resp = conn.urlopen( 00:23:30 method=request.method, 00:23:30 url=url, 00:23:30 body=request.body, 00:23:30 headers=request.headers, 00:23:30 redirect=False, 00:23:30 assert_same_host=False, 00:23:30 preload_content=False, 00:23:30 decode_content=False, 00:23:30 retries=self.max_retries, 00:23:30 timeout=timeout, 00:23:30 chunked=chunked, 00:23:30 ) 00:23:30 00:23:30 .tox/code/lib/python3.10/site-packages/requests/adapters.py:486: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:874: in urlopen 00:23:30 return self.urlopen( 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:874: in urlopen 00:23:30 return self.urlopen( 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:874: in urlopen 00:23:30 return self.urlopen( 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:874: in urlopen 00:23:30 return self.urlopen( 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:874: in urlopen 00:23:30 return self.urlopen( 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:844: in urlopen 00:23:30 retries = retries.increment( 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = Retry(total=0, connect=None, read=None, redirect=None, status=None) 00:23:30 method = 'POST', url = '/ric/v1/deregister', response = None 00:23:30 error = NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy') 00:23:30 _pool = 00:23:30 _stacktrace = 00:23:30 00:23:30 def increment( 00:23:30 self, 00:23:30 method: str | None = None, 00:23:30 url: str | None = None, 00:23:30 response: BaseHTTPResponse | None = None, 00:23:30 error: Exception | None = None, 00:23:30 _pool: ConnectionPool | None = None, 00:23:30 _stacktrace: TracebackType | None = None, 00:23:30 ) -> Retry: 00:23:30 """Return a new Retry object with incremented retry counters. 00:23:30 00:23:30 :param response: A response object, or None, if the server did not 00:23:30 return a response. 00:23:30 :type response: :class:`~urllib3.response.BaseHTTPResponse` 00:23:30 :param Exception error: An error encountered during the request, or 00:23:30 None if the response was received successfully. 00:23:30 00:23:30 :return: A new ``Retry`` object. 00:23:30 """ 00:23:30 if self.total is False and error: 00:23:30 # Disabled, indicate to re-raise the error. 00:23:30 raise reraise(type(error), error, _stacktrace) 00:23:30 00:23:30 total = self.total 00:23:30 if total is not None: 00:23:30 total -= 1 00:23:30 00:23:30 connect = self.connect 00:23:30 read = self.read 00:23:30 redirect = self.redirect 00:23:30 status_count = self.status 00:23:30 other = self.other 00:23:30 cause = "unknown" 00:23:30 status = None 00:23:30 redirect_location = None 00:23:30 00:23:30 if error and self._is_connection_error(error): 00:23:30 # Connect retry? 00:23:30 if connect is False: 00:23:30 raise reraise(type(error), error, _stacktrace) 00:23:30 elif connect is not None: 00:23:30 connect -= 1 00:23:30 00:23:30 elif error and self._is_read_error(error): 00:23:30 # Read retry? 00:23:30 if read is False or method is None or not self._is_method_retryable(method): 00:23:30 raise reraise(type(error), error, _stacktrace) 00:23:30 elif read is not None: 00:23:30 read -= 1 00:23:30 00:23:30 elif error: 00:23:30 # Other retry? 00:23:30 if other is not None: 00:23:30 other -= 1 00:23:30 00:23:30 elif response and response.get_redirect_location(): 00:23:30 # Redirect retry? 00:23:30 if redirect is not None: 00:23:30 redirect -= 1 00:23:30 cause = "too many redirects" 00:23:30 response_redirect_location = response.get_redirect_location() 00:23:30 if response_redirect_location: 00:23:30 redirect_location = response_redirect_location 00:23:30 status = response.status 00:23:30 00:23:30 else: 00:23:30 # Incrementing because of a server error like a 500 in 00:23:30 # status_forcelist and the given method is in the allowed_methods 00:23:30 cause = ResponseError.GENERIC_ERROR 00:23:30 if response and response.status: 00:23:30 if status_count is not None: 00:23:30 status_count -= 1 00:23:30 cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status) 00:23:30 status = response.status 00:23:30 00:23:30 history = self.history + ( 00:23:30 RequestHistory(method, url, error, status, redirect_location), 00:23:30 ) 00:23:30 00:23:30 new_retry = self.new( 00:23:30 total=total, 00:23:30 connect=connect, 00:23:30 read=read, 00:23:30 redirect=redirect, 00:23:30 status=status_count, 00:23:30 other=other, 00:23:30 history=history, 00:23:30 ) 00:23:30 00:23:30 if new_retry.is_exhausted(): 00:23:30 reason = error or ResponseError(cause) 00:23:30 > raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] 00:23:30 E urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='service-ricplt-appmgr-http.ricplt', port=8080): Max retries exceeded with url: /ric/v1/deregister (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')) 00:23:30 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/util/retry.py:515: MaxRetryError 00:23:30 00:23:30 During handling of the above exception, another exception occurred: 00:23:30 00:23:30 monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f3a2b0eb280> 00:23:30 00:23:30 def test_default_config_handler(monkeypatch): 00:23:30 """Just for coverage""" 00:23:30 init_config_file() 00:23:30 monkeypatch.setenv(Constants.CONFIG_FILE_ENV, config_file_path) 00:23:30 00:23:30 def default_rmr_handler(self, summary, sbuf): 00:23:30 pass 00:23:30 00:23:30 # listen port is irrelevant, no messages arrive 00:23:30 global rmr_xapp_defconfig 00:23:30 rmr_xapp_defconfig = RMRXapp(default_rmr_handler, rmr_port=4567, use_fake_sdl=True) 00:23:30 # in unit tests we need to thread here or else execution is not returned! 00:23:30 rmr_xapp_defconfig.run(thread=True, rmr_timeout=1) 00:23:30 write_config_file() 00:23:30 # give the work loop a chance to timeout on RMR and process the config event 00:23:30 time.sleep(3) 00:23:30 > rmr_xapp_defconfig.stop() 00:23:30 00:23:30 tests/test_config.py:86: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 ricxappframe/xapp_frame.py:926: in stop 00:23:30 super().stop() 00:23:30 ricxappframe/xapp_frame.py:755: in stop 00:23:30 self.xapp_shutdown() 00:23:30 ricxappframe/xapp_frame.py:230: in xapp_shutdown 00:23:30 self.deregister() 00:23:30 ricxappframe/xapp_frame.py:220: in deregister 00:23:30 resp = self.session.post(dereg_url, request_string) 00:23:30 .tox/code/lib/python3.10/site-packages/requests/sessions.py:637: in post 00:23:30 return self.request("POST", url, data=data, json=json, **kwargs) 00:23:30 .tox/code/lib/python3.10/site-packages/requests/sessions.py:589: in request 00:23:30 resp = self.send(prep, **send_kwargs) 00:23:30 .tox/code/lib/python3.10/site-packages/requests/sessions.py:703: in send 00:23:30 r = adapter.send(request, **kwargs) 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 request = , stream = False 00:23:30 timeout = Timeout(connect=None, read=None, total=None), verify = True 00:23:30 cert = None, proxies = OrderedDict() 00:23:30 00:23:30 def send( 00:23:30 self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None 00:23:30 ): 00:23:30 """Sends PreparedRequest object. Returns Response object. 00:23:30 00:23:30 :param request: The :class:`PreparedRequest ` being sent. 00:23:30 :param stream: (optional) Whether to stream the request content. 00:23:30 :param timeout: (optional) How long to wait for the server to send 00:23:30 data before giving up, as a float, or a :ref:`(connect timeout, 00:23:30 read timeout) ` tuple. 00:23:30 :type timeout: float or tuple or urllib3 Timeout object 00:23:30 :param verify: (optional) Either a boolean, in which case it controls whether 00:23:30 we verify the server's TLS certificate, or a string, in which case it 00:23:30 must be a path to a CA bundle to use 00:23:30 :param cert: (optional) Any user-provided SSL certificate to be trusted. 00:23:30 :param proxies: (optional) The proxies dictionary to apply to the request. 00:23:30 :rtype: requests.Response 00:23:30 """ 00:23:30 00:23:30 try: 00:23:30 conn = self.get_connection(request.url, proxies) 00:23:30 except LocationValueError as e: 00:23:30 raise InvalidURL(e, request=request) 00:23:30 00:23:30 self.cert_verify(conn, request.url, verify, cert) 00:23:30 url = self.request_url(request, proxies) 00:23:30 self.add_headers( 00:23:30 request, 00:23:30 stream=stream, 00:23:30 timeout=timeout, 00:23:30 verify=verify, 00:23:30 cert=cert, 00:23:30 proxies=proxies, 00:23:30 ) 00:23:30 00:23:30 chunked = not (request.body is None or "Content-Length" in request.headers) 00:23:30 00:23:30 if isinstance(timeout, tuple): 00:23:30 try: 00:23:30 connect, read = timeout 00:23:30 timeout = TimeoutSauce(connect=connect, read=read) 00:23:30 except ValueError: 00:23:30 raise ValueError( 00:23:30 f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, " 00:23:30 f"or a single float to set both timeouts to the same value." 00:23:30 ) 00:23:30 elif isinstance(timeout, TimeoutSauce): 00:23:30 pass 00:23:30 else: 00:23:30 timeout = TimeoutSauce(connect=timeout, read=timeout) 00:23:30 00:23:30 try: 00:23:30 resp = conn.urlopen( 00:23:30 method=request.method, 00:23:30 url=url, 00:23:30 body=request.body, 00:23:30 headers=request.headers, 00:23:30 redirect=False, 00:23:30 assert_same_host=False, 00:23:30 preload_content=False, 00:23:30 decode_content=False, 00:23:30 retries=self.max_retries, 00:23:30 timeout=timeout, 00:23:30 chunked=chunked, 00:23:30 ) 00:23:30 00:23:30 except (ProtocolError, OSError) as err: 00:23:30 raise ConnectionError(err, request=request) 00:23:30 00:23:30 except MaxRetryError as e: 00:23:30 if isinstance(e.reason, ConnectTimeoutError): 00:23:30 # TODO: Remove this in 3.0.0: see #2811 00:23:30 if not isinstance(e.reason, NewConnectionError): 00:23:30 raise ConnectTimeout(e, request=request) 00:23:30 00:23:30 if isinstance(e.reason, ResponseError): 00:23:30 raise RetryError(e, request=request) 00:23:30 00:23:30 if isinstance(e.reason, _ProxyError): 00:23:30 raise ProxyError(e, request=request) 00:23:30 00:23:30 if isinstance(e.reason, _SSLError): 00:23:30 # This branch is for urllib3 v1.22 and later. 00:23:30 raise SSLError(e, request=request) 00:23:30 00:23:30 > raise ConnectionError(e, request=request) 00:23:30 E requests.exceptions.ConnectionError: HTTPConnectionPool(host='service-ricplt-appmgr-http.ricplt', port=8080): Max retries exceeded with url: /ric/v1/deregister (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')) 00:23:30 00:23:30 .tox/code/lib/python3.10/site-packages/requests/adapters.py:519: ConnectionError 00:23:30 ----------------------------- Captured stderr call ----------------------------- 00:23:30 1703722897436 28088/RMR [INFO] sends: ts=1703722897 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:4569 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722897436 28088/RMR [INFO] sends: ts=1703722897 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:4564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722897436 28088/RMR [INFO] sends: ts=1703722897 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:3564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722897436 28088/RMR [INFO] sends: ts=1703722897 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:3563 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722897511 28088/RMR [INFO] sends: ts=1703722897 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:4569 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722897512 28088/RMR [INFO] sends: ts=1703722897 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:4564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722897512 28088/RMR [INFO] sends: ts=1703722897 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:3564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722897512 28088/RMR [INFO] sends: ts=1703722897 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:3563 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722928439 28088/RMR [INFO] sends: ts=1703722928 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:4569 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722928439 28088/RMR [INFO] sends: ts=1703722928 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:4564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722928439 28088/RMR [INFO] sends: ts=1703722928 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:3564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722928439 28088/RMR [INFO] sends: ts=1703722928 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:3563 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722928515 28088/RMR [INFO] sends: ts=1703722928 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:4569 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722928515 28088/RMR [INFO] sends: ts=1703722928 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:4564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722928515 28088/RMR [INFO] sends: ts=1703722928 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:3564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722928515 28088/RMR [INFO] sends: ts=1703722928 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:3563 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 ------------------------------ Captured log call ------------------------------- 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 __________________________ test_custom_config_handler __________________________ 00:23:30 00:23:30 self = 00:23:30 00:23:30 def _new_conn(self) -> socket.socket: 00:23:30 """Establish a socket connection and set nodelay settings on it. 00:23:30 00:23:30 :return: New socket connection. 00:23:30 """ 00:23:30 try: 00:23:30 > sock = connection.create_connection( 00:23:30 (self._dns_host, self.port), 00:23:30 self.timeout, 00:23:30 source_address=self.source_address, 00:23:30 socket_options=self.socket_options, 00:23:30 ) 00:23:30 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connection.py:203: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/util/connection.py:60: in create_connection 00:23:30 for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 host = 'service-ricplt-appmgr-http.ricplt', port = 8080 00:23:30 family = , type = 00:23:30 proto = 0, flags = 0 00:23:30 00:23:30 def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0): 00:23:30 """Resolve host and port into list of address info entries. 00:23:30 00:23:30 Translate the host/port argument into a sequence of 5-tuples that contain 00:23:30 all the necessary arguments for creating a socket connected to that service. 00:23:30 host is a domain name, a string representation of an IPv4/v6 address or 00:23:30 None. port is a string service name such as 'http', a numeric port number or 00:23:30 None. By passing None as the value of host and port, you can pass NULL to 00:23:30 the underlying C API. 00:23:30 00:23:30 The family, type and proto arguments can be optionally specified in order to 00:23:30 narrow the list of addresses returned. Passing zero as a value for each of 00:23:30 these arguments selects the full range of results. 00:23:30 """ 00:23:30 # We override this function since we want to translate the numeric family 00:23:30 # and socket type values to enum constants. 00:23:30 addrlist = [] 00:23:30 > for res in _socket.getaddrinfo(host, port, family, type, proto, flags): 00:23:30 E OSError: [Errno 16] Device or resource busy 00:23:30 00:23:30 /opt/pyenv/versions/3.10.6/lib/python3.10/socket.py:955: OSError 00:23:30 00:23:30 The above exception was the direct cause of the following exception: 00:23:30 00:23:30 self = 00:23:30 method = 'POST', url = '/ric/v1/deregister', body = '' 00:23:30 headers = {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded'} 00:23:30 retries = Retry(total=0, connect=None, read=None, redirect=None, status=None) 00:23:30 redirect = False, assert_same_host = False 00:23:30 timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None 00:23:30 release_conn = False, chunked = True, body_pos = None, preload_content = False 00:23:30 decode_content = False, response_kw = {} 00:23:30 parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/ric/v1/deregister', query=None, fragment=None) 00:23:30 destination_scheme = None, conn = None, release_this_conn = True 00:23:30 http_tunnel_required = False, err = None, clean_exit = False 00:23:30 00:23:30 def urlopen( # type: ignore[override] 00:23:30 self, 00:23:30 method: str, 00:23:30 url: str, 00:23:30 body: _TYPE_BODY | None = None, 00:23:30 headers: typing.Mapping[str, str] | None = None, 00:23:30 retries: Retry | bool | int | None = None, 00:23:30 redirect: bool = True, 00:23:30 assert_same_host: bool = True, 00:23:30 timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, 00:23:30 pool_timeout: int | None = None, 00:23:30 release_conn: bool | None = None, 00:23:30 chunked: bool = False, 00:23:30 body_pos: _TYPE_BODY_POSITION | None = None, 00:23:30 preload_content: bool = True, 00:23:30 decode_content: bool = True, 00:23:30 **response_kw: typing.Any, 00:23:30 ) -> BaseHTTPResponse: 00:23:30 """ 00:23:30 Get a connection from the pool and perform an HTTP request. This is the 00:23:30 lowest level call for making a request, so you'll need to specify all 00:23:30 the raw details. 00:23:30 00:23:30 .. note:: 00:23:30 00:23:30 More commonly, it's appropriate to use a convenience method 00:23:30 such as :meth:`request`. 00:23:30 00:23:30 .. note:: 00:23:30 00:23:30 `release_conn` will only behave as expected if 00:23:30 `preload_content=False` because we want to make 00:23:30 `preload_content=False` the default behaviour someday soon without 00:23:30 breaking backwards compatibility. 00:23:30 00:23:30 :param method: 00:23:30 HTTP request method (such as GET, POST, PUT, etc.) 00:23:30 00:23:30 :param url: 00:23:30 The URL to perform the request on. 00:23:30 00:23:30 :param body: 00:23:30 Data to send in the request body, either :class:`str`, :class:`bytes`, 00:23:30 an iterable of :class:`str`/:class:`bytes`, or a file-like object. 00:23:30 00:23:30 :param headers: 00:23:30 Dictionary of custom headers to send, such as User-Agent, 00:23:30 If-None-Match, etc. If None, pool headers are used. If provided, 00:23:30 these headers completely replace any pool-specific headers. 00:23:30 00:23:30 :param retries: 00:23:30 Configure the number of retries to allow before raising a 00:23:30 :class:`~urllib3.exceptions.MaxRetryError` exception. 00:23:30 00:23:30 Pass ``None`` to retry until you receive a response. Pass a 00:23:30 :class:`~urllib3.util.retry.Retry` object for fine-grained control 00:23:30 over different types of retries. 00:23:30 Pass an integer number to retry connection errors that many times, 00:23:30 but no other types of errors. Pass zero to never retry. 00:23:30 00:23:30 If ``False``, then retries are disabled and any exception is raised 00:23:30 immediately. Also, instead of raising a MaxRetryError on redirects, 00:23:30 the redirect response will be returned. 00:23:30 00:23:30 :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. 00:23:30 00:23:30 :param redirect: 00:23:30 If True, automatically handle redirects (status codes 301, 302, 00:23:30 303, 307, 308). Each redirect counts as a retry. Disabling retries 00:23:30 will disable redirect, too. 00:23:30 00:23:30 :param assert_same_host: 00:23:30 If ``True``, will make sure that the host of the pool requests is 00:23:30 consistent else will raise HostChangedError. When ``False``, you can 00:23:30 use the pool on an HTTP proxy and request foreign hosts. 00:23:30 00:23:30 :param timeout: 00:23:30 If specified, overrides the default timeout for this one 00:23:30 request. It may be a float (in seconds) or an instance of 00:23:30 :class:`urllib3.util.Timeout`. 00:23:30 00:23:30 :param pool_timeout: 00:23:30 If set and the pool is set to block=True, then this method will 00:23:30 block for ``pool_timeout`` seconds and raise EmptyPoolError if no 00:23:30 connection is available within the time period. 00:23:30 00:23:30 :param bool preload_content: 00:23:30 If True, the response's body will be preloaded into memory. 00:23:30 00:23:30 :param bool decode_content: 00:23:30 If True, will attempt to decode the body based on the 00:23:30 'content-encoding' header. 00:23:30 00:23:30 :param release_conn: 00:23:30 If False, then the urlopen call will not release the connection 00:23:30 back into the pool once a response is received (but will release if 00:23:30 you read the entire contents of the response such as when 00:23:30 `preload_content=True`). This is useful if you're not preloading 00:23:30 the response's content immediately. You will need to call 00:23:30 ``r.release_conn()`` on the response ``r`` to return the connection 00:23:30 back into the pool. If None, it takes the value of ``preload_content`` 00:23:30 which defaults to ``True``. 00:23:30 00:23:30 :param bool chunked: 00:23:30 If True, urllib3 will send the body using chunked transfer 00:23:30 encoding. Otherwise, urllib3 will send the body using the standard 00:23:30 content-length form. Defaults to False. 00:23:30 00:23:30 :param int body_pos: 00:23:30 Position to seek to in file-like body in the event of a retry or 00:23:30 redirect. Typically this won't need to be set because urllib3 will 00:23:30 auto-populate the value when needed. 00:23:30 """ 00:23:30 parsed_url = parse_url(url) 00:23:30 destination_scheme = parsed_url.scheme 00:23:30 00:23:30 if headers is None: 00:23:30 headers = self.headers 00:23:30 00:23:30 if not isinstance(retries, Retry): 00:23:30 retries = Retry.from_int(retries, redirect=redirect, default=self.retries) 00:23:30 00:23:30 if release_conn is None: 00:23:30 release_conn = preload_content 00:23:30 00:23:30 # Check host 00:23:30 if assert_same_host and not self.is_same_host(url): 00:23:30 raise HostChangedError(self, url, retries) 00:23:30 00:23:30 # Ensure that the URL we're connecting to is properly encoded 00:23:30 if url.startswith("/"): 00:23:30 url = to_str(_encode_target(url)) 00:23:30 else: 00:23:30 url = to_str(parsed_url.url) 00:23:30 00:23:30 conn = None 00:23:30 00:23:30 # Track whether `conn` needs to be released before 00:23:30 # returning/raising/recursing. Update this variable if necessary, and 00:23:30 # leave `release_conn` constant throughout the function. That way, if 00:23:30 # the function recurses, the original value of `release_conn` will be 00:23:30 # passed down into the recursive call, and its value will be respected. 00:23:30 # 00:23:30 # See issue #651 [1] for details. 00:23:30 # 00:23:30 # [1] 00:23:30 release_this_conn = release_conn 00:23:30 00:23:30 http_tunnel_required = connection_requires_http_tunnel( 00:23:30 self.proxy, self.proxy_config, destination_scheme 00:23:30 ) 00:23:30 00:23:30 # Merge the proxy headers. Only done when not using HTTP CONNECT. We 00:23:30 # have to copy the headers dict so we can safely change it without those 00:23:30 # changes being reflected in anyone else's copy. 00:23:30 if not http_tunnel_required: 00:23:30 headers = headers.copy() # type: ignore[attr-defined] 00:23:30 headers.update(self.proxy_headers) # type: ignore[union-attr] 00:23:30 00:23:30 # Must keep the exception bound to a separate variable or else Python 3 00:23:30 # complains about UnboundLocalError. 00:23:30 err = None 00:23:30 00:23:30 # Keep track of whether we cleanly exited the except block. This 00:23:30 # ensures we do proper cleanup in finally. 00:23:30 clean_exit = False 00:23:30 00:23:30 # Rewind body position, if needed. Record current position 00:23:30 # for future rewinds in the event of a redirect/retry. 00:23:30 body_pos = set_file_position(body, body_pos) 00:23:30 00:23:30 try: 00:23:30 # Request a connection from the queue. 00:23:30 timeout_obj = self._get_timeout(timeout) 00:23:30 conn = self._get_conn(timeout=pool_timeout) 00:23:30 00:23:30 conn.timeout = timeout_obj.connect_timeout # type: ignore[assignment] 00:23:30 00:23:30 # Is this a closed/new connection that requires CONNECT tunnelling? 00:23:30 if self.proxy is not None and http_tunnel_required and conn.is_closed: 00:23:30 try: 00:23:30 self._prepare_proxy(conn) 00:23:30 except (BaseSSLError, OSError, SocketTimeout) as e: 00:23:30 self._raise_timeout( 00:23:30 err=e, url=self.proxy.url, timeout_value=conn.timeout 00:23:30 ) 00:23:30 raise 00:23:30 00:23:30 # If we're going to release the connection in ``finally:``, then 00:23:30 # the response doesn't need to know about the connection. Otherwise 00:23:30 # it will also try to release it and we'll have a double-release 00:23:30 # mess. 00:23:30 response_conn = conn if not release_conn else None 00:23:30 00:23:30 # Make the request on the HTTPConnection object 00:23:30 > response = self._make_request( 00:23:30 conn, 00:23:30 method, 00:23:30 url, 00:23:30 timeout=timeout_obj, 00:23:30 body=body, 00:23:30 headers=headers, 00:23:30 chunked=chunked, 00:23:30 retries=retries, 00:23:30 response_conn=response_conn, 00:23:30 preload_content=preload_content, 00:23:30 decode_content=decode_content, 00:23:30 **response_kw, 00:23:30 ) 00:23:30 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:790: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:496: in _make_request 00:23:30 conn.request( 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connection.py:395: in request 00:23:30 self.endheaders() 00:23:30 /opt/pyenv/versions/3.10.6/lib/python3.10/http/client.py:1277: in endheaders 00:23:30 self._send_output(message_body, encode_chunked=encode_chunked) 00:23:30 /opt/pyenv/versions/3.10.6/lib/python3.10/http/client.py:1037: in _send_output 00:23:30 self.send(msg) 00:23:30 /opt/pyenv/versions/3.10.6/lib/python3.10/http/client.py:975: in send 00:23:30 self.connect() 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connection.py:243: in connect 00:23:30 self.sock = self._new_conn() 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 00:23:30 def _new_conn(self) -> socket.socket: 00:23:30 """Establish a socket connection and set nodelay settings on it. 00:23:30 00:23:30 :return: New socket connection. 00:23:30 """ 00:23:30 try: 00:23:30 sock = connection.create_connection( 00:23:30 (self._dns_host, self.port), 00:23:30 self.timeout, 00:23:30 source_address=self.source_address, 00:23:30 socket_options=self.socket_options, 00:23:30 ) 00:23:30 except socket.gaierror as e: 00:23:30 raise NameResolutionError(self.host, self, e) from e 00:23:30 except SocketTimeout as e: 00:23:30 raise ConnectTimeoutError( 00:23:30 self, 00:23:30 f"Connection to {self.host} timed out. (connect timeout={self.timeout})", 00:23:30 ) from e 00:23:30 00:23:30 except OSError as e: 00:23:30 > raise NewConnectionError( 00:23:30 self, f"Failed to establish a new connection: {e}" 00:23:30 ) from e 00:23:30 E urllib3.exceptions.NewConnectionError: : Failed to establish a new connection: [Errno 16] Device or resource busy 00:23:30 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connection.py:218: NewConnectionError 00:23:30 00:23:30 The above exception was the direct cause of the following exception: 00:23:30 00:23:30 self = 00:23:30 request = , stream = False 00:23:30 timeout = Timeout(connect=None, read=None, total=None), verify = True 00:23:30 cert = None, proxies = OrderedDict() 00:23:30 00:23:30 def send( 00:23:30 self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None 00:23:30 ): 00:23:30 """Sends PreparedRequest object. Returns Response object. 00:23:30 00:23:30 :param request: The :class:`PreparedRequest ` being sent. 00:23:30 :param stream: (optional) Whether to stream the request content. 00:23:30 :param timeout: (optional) How long to wait for the server to send 00:23:30 data before giving up, as a float, or a :ref:`(connect timeout, 00:23:30 read timeout) ` tuple. 00:23:30 :type timeout: float or tuple or urllib3 Timeout object 00:23:30 :param verify: (optional) Either a boolean, in which case it controls whether 00:23:30 we verify the server's TLS certificate, or a string, in which case it 00:23:30 must be a path to a CA bundle to use 00:23:30 :param cert: (optional) Any user-provided SSL certificate to be trusted. 00:23:30 :param proxies: (optional) The proxies dictionary to apply to the request. 00:23:30 :rtype: requests.Response 00:23:30 """ 00:23:30 00:23:30 try: 00:23:30 conn = self.get_connection(request.url, proxies) 00:23:30 except LocationValueError as e: 00:23:30 raise InvalidURL(e, request=request) 00:23:30 00:23:30 self.cert_verify(conn, request.url, verify, cert) 00:23:30 url = self.request_url(request, proxies) 00:23:30 self.add_headers( 00:23:30 request, 00:23:30 stream=stream, 00:23:30 timeout=timeout, 00:23:30 verify=verify, 00:23:30 cert=cert, 00:23:30 proxies=proxies, 00:23:30 ) 00:23:30 00:23:30 chunked = not (request.body is None or "Content-Length" in request.headers) 00:23:30 00:23:30 if isinstance(timeout, tuple): 00:23:30 try: 00:23:30 connect, read = timeout 00:23:30 timeout = TimeoutSauce(connect=connect, read=read) 00:23:30 except ValueError: 00:23:30 raise ValueError( 00:23:30 f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, " 00:23:30 f"or a single float to set both timeouts to the same value." 00:23:30 ) 00:23:30 elif isinstance(timeout, TimeoutSauce): 00:23:30 pass 00:23:30 else: 00:23:30 timeout = TimeoutSauce(connect=timeout, read=timeout) 00:23:30 00:23:30 try: 00:23:30 > resp = conn.urlopen( 00:23:30 method=request.method, 00:23:30 url=url, 00:23:30 body=request.body, 00:23:30 headers=request.headers, 00:23:30 redirect=False, 00:23:30 assert_same_host=False, 00:23:30 preload_content=False, 00:23:30 decode_content=False, 00:23:30 retries=self.max_retries, 00:23:30 timeout=timeout, 00:23:30 chunked=chunked, 00:23:30 ) 00:23:30 00:23:30 .tox/code/lib/python3.10/site-packages/requests/adapters.py:486: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:874: in urlopen 00:23:30 return self.urlopen( 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:874: in urlopen 00:23:30 return self.urlopen( 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:874: in urlopen 00:23:30 return self.urlopen( 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:874: in urlopen 00:23:30 return self.urlopen( 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:874: in urlopen 00:23:30 return self.urlopen( 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/connectionpool.py:844: in urlopen 00:23:30 retries = retries.increment( 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = Retry(total=0, connect=None, read=None, redirect=None, status=None) 00:23:30 method = 'POST', url = '/ric/v1/deregister', response = None 00:23:30 error = NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy') 00:23:30 _pool = 00:23:30 _stacktrace = 00:23:30 00:23:30 def increment( 00:23:30 self, 00:23:30 method: str | None = None, 00:23:30 url: str | None = None, 00:23:30 response: BaseHTTPResponse | None = None, 00:23:30 error: Exception | None = None, 00:23:30 _pool: ConnectionPool | None = None, 00:23:30 _stacktrace: TracebackType | None = None, 00:23:30 ) -> Retry: 00:23:30 """Return a new Retry object with incremented retry counters. 00:23:30 00:23:30 :param response: A response object, or None, if the server did not 00:23:30 return a response. 00:23:30 :type response: :class:`~urllib3.response.BaseHTTPResponse` 00:23:30 :param Exception error: An error encountered during the request, or 00:23:30 None if the response was received successfully. 00:23:30 00:23:30 :return: A new ``Retry`` object. 00:23:30 """ 00:23:30 if self.total is False and error: 00:23:30 # Disabled, indicate to re-raise the error. 00:23:30 raise reraise(type(error), error, _stacktrace) 00:23:30 00:23:30 total = self.total 00:23:30 if total is not None: 00:23:30 total -= 1 00:23:30 00:23:30 connect = self.connect 00:23:30 read = self.read 00:23:30 redirect = self.redirect 00:23:30 status_count = self.status 00:23:30 other = self.other 00:23:30 cause = "unknown" 00:23:30 status = None 00:23:30 redirect_location = None 00:23:30 00:23:30 if error and self._is_connection_error(error): 00:23:30 # Connect retry? 00:23:30 if connect is False: 00:23:30 raise reraise(type(error), error, _stacktrace) 00:23:30 elif connect is not None: 00:23:30 connect -= 1 00:23:30 00:23:30 elif error and self._is_read_error(error): 00:23:30 # Read retry? 00:23:30 if read is False or method is None or not self._is_method_retryable(method): 00:23:30 raise reraise(type(error), error, _stacktrace) 00:23:30 elif read is not None: 00:23:30 read -= 1 00:23:30 00:23:30 elif error: 00:23:30 # Other retry? 00:23:30 if other is not None: 00:23:30 other -= 1 00:23:30 00:23:30 elif response and response.get_redirect_location(): 00:23:30 # Redirect retry? 00:23:30 if redirect is not None: 00:23:30 redirect -= 1 00:23:30 cause = "too many redirects" 00:23:30 response_redirect_location = response.get_redirect_location() 00:23:30 if response_redirect_location: 00:23:30 redirect_location = response_redirect_location 00:23:30 status = response.status 00:23:30 00:23:30 else: 00:23:30 # Incrementing because of a server error like a 500 in 00:23:30 # status_forcelist and the given method is in the allowed_methods 00:23:30 cause = ResponseError.GENERIC_ERROR 00:23:30 if response and response.status: 00:23:30 if status_count is not None: 00:23:30 status_count -= 1 00:23:30 cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status) 00:23:30 status = response.status 00:23:30 00:23:30 history = self.history + ( 00:23:30 RequestHistory(method, url, error, status, redirect_location), 00:23:30 ) 00:23:30 00:23:30 new_retry = self.new( 00:23:30 total=total, 00:23:30 connect=connect, 00:23:30 read=read, 00:23:30 redirect=redirect, 00:23:30 status=status_count, 00:23:30 other=other, 00:23:30 history=history, 00:23:30 ) 00:23:30 00:23:30 if new_retry.is_exhausted(): 00:23:30 reason = error or ResponseError(cause) 00:23:30 > raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] 00:23:30 E urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='service-ricplt-appmgr-http.ricplt', port=8080): Max retries exceeded with url: /ric/v1/deregister (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')) 00:23:30 00:23:30 .tox/code/lib/python3.10/site-packages/urllib3/util/retry.py:515: MaxRetryError 00:23:30 00:23:30 During handling of the above exception, another exception occurred: 00:23:30 00:23:30 monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f3a280e9f60> 00:23:30 00:23:30 def test_custom_config_handler(monkeypatch): 00:23:30 # point watcher at the file 00:23:30 init_config_file() 00:23:30 monkeypatch.setenv(Constants.CONFIG_FILE_ENV, config_file_path) 00:23:30 00:23:30 def default_handler(self, summary, sbuf): 00:23:30 pass 00:23:30 00:23:30 startup_config_event = False 00:23:30 change_config_event = False 00:23:30 00:23:30 def config_handler(self, json): 00:23:30 mdc_logger.info("config_handler: json {}".format(json)) 00:23:30 nonlocal startup_config_event 00:23:30 nonlocal change_config_event 00:23:30 if "start" in json: 00:23:30 startup_config_event = True 00:23:30 if "change" in json: 00:23:30 change_config_event = True 00:23:30 00:23:30 # listen port is irrelevant, no messages arrive 00:23:30 global rmr_xapp_config 00:23:30 rmr_xapp_config = RMRXapp(default_handler, config_handler=config_handler, rmr_port=4567, use_fake_sdl=True) 00:23:30 assert startup_config_event 00:23:30 rmr_xapp_config.run(thread=True, rmr_timeout=1) # in unit tests we need to thread here or else execution is not returned! 00:23:30 write_config_file() 00:23:30 # give the work loop a chance to timeout on RMR and process the config event 00:23:30 time.sleep(3) 00:23:30 assert change_config_event 00:23:30 > rmr_xapp_config.stop() 00:23:30 00:23:30 tests/test_config.py:119: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 ricxappframe/xapp_frame.py:926: in stop 00:23:30 super().stop() 00:23:30 ricxappframe/xapp_frame.py:755: in stop 00:23:30 self.xapp_shutdown() 00:23:30 ricxappframe/xapp_frame.py:230: in xapp_shutdown 00:23:30 self.deregister() 00:23:30 ricxappframe/xapp_frame.py:220: in deregister 00:23:30 resp = self.session.post(dereg_url, request_string) 00:23:30 .tox/code/lib/python3.10/site-packages/requests/sessions.py:637: in post 00:23:30 return self.request("POST", url, data=data, json=json, **kwargs) 00:23:30 .tox/code/lib/python3.10/site-packages/requests/sessions.py:589: in request 00:23:30 resp = self.send(prep, **send_kwargs) 00:23:30 .tox/code/lib/python3.10/site-packages/requests/sessions.py:703: in send 00:23:30 r = adapter.send(request, **kwargs) 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 request = , stream = False 00:23:30 timeout = Timeout(connect=None, read=None, total=None), verify = True 00:23:30 cert = None, proxies = OrderedDict() 00:23:30 00:23:30 def send( 00:23:30 self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None 00:23:30 ): 00:23:30 """Sends PreparedRequest object. Returns Response object. 00:23:30 00:23:30 :param request: The :class:`PreparedRequest ` being sent. 00:23:30 :param stream: (optional) Whether to stream the request content. 00:23:30 :param timeout: (optional) How long to wait for the server to send 00:23:30 data before giving up, as a float, or a :ref:`(connect timeout, 00:23:30 read timeout) ` tuple. 00:23:30 :type timeout: float or tuple or urllib3 Timeout object 00:23:30 :param verify: (optional) Either a boolean, in which case it controls whether 00:23:30 we verify the server's TLS certificate, or a string, in which case it 00:23:30 must be a path to a CA bundle to use 00:23:30 :param cert: (optional) Any user-provided SSL certificate to be trusted. 00:23:30 :param proxies: (optional) The proxies dictionary to apply to the request. 00:23:30 :rtype: requests.Response 00:23:30 """ 00:23:30 00:23:30 try: 00:23:30 conn = self.get_connection(request.url, proxies) 00:23:30 except LocationValueError as e: 00:23:30 raise InvalidURL(e, request=request) 00:23:30 00:23:30 self.cert_verify(conn, request.url, verify, cert) 00:23:30 url = self.request_url(request, proxies) 00:23:30 self.add_headers( 00:23:30 request, 00:23:30 stream=stream, 00:23:30 timeout=timeout, 00:23:30 verify=verify, 00:23:30 cert=cert, 00:23:30 proxies=proxies, 00:23:30 ) 00:23:30 00:23:30 chunked = not (request.body is None or "Content-Length" in request.headers) 00:23:30 00:23:30 if isinstance(timeout, tuple): 00:23:30 try: 00:23:30 connect, read = timeout 00:23:30 timeout = TimeoutSauce(connect=connect, read=read) 00:23:30 except ValueError: 00:23:30 raise ValueError( 00:23:30 f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, " 00:23:30 f"or a single float to set both timeouts to the same value." 00:23:30 ) 00:23:30 elif isinstance(timeout, TimeoutSauce): 00:23:30 pass 00:23:30 else: 00:23:30 timeout = TimeoutSauce(connect=timeout, read=timeout) 00:23:30 00:23:30 try: 00:23:30 resp = conn.urlopen( 00:23:30 method=request.method, 00:23:30 url=url, 00:23:30 body=request.body, 00:23:30 headers=request.headers, 00:23:30 redirect=False, 00:23:30 assert_same_host=False, 00:23:30 preload_content=False, 00:23:30 decode_content=False, 00:23:30 retries=self.max_retries, 00:23:30 timeout=timeout, 00:23:30 chunked=chunked, 00:23:30 ) 00:23:30 00:23:30 except (ProtocolError, OSError) as err: 00:23:30 raise ConnectionError(err, request=request) 00:23:30 00:23:30 except MaxRetryError as e: 00:23:30 if isinstance(e.reason, ConnectTimeoutError): 00:23:30 # TODO: Remove this in 3.0.0: see #2811 00:23:30 if not isinstance(e.reason, NewConnectionError): 00:23:30 raise ConnectTimeout(e, request=request) 00:23:30 00:23:30 if isinstance(e.reason, ResponseError): 00:23:30 raise RetryError(e, request=request) 00:23:30 00:23:30 if isinstance(e.reason, _ProxyError): 00:23:30 raise ProxyError(e, request=request) 00:23:30 00:23:30 if isinstance(e.reason, _SSLError): 00:23:30 # This branch is for urllib3 v1.22 and later. 00:23:30 raise SSLError(e, request=request) 00:23:30 00:23:30 > raise ConnectionError(e, request=request) 00:23:30 E requests.exceptions.ConnectionError: HTTPConnectionPool(host='service-ricplt-appmgr-http.ricplt', port=8080): Max retries exceeded with url: /ric/v1/deregister (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')) 00:23:30 00:23:30 .tox/code/lib/python3.10/site-packages/requests/adapters.py:519: ConnectionError 00:23:30 ----------------------------- Captured stderr call ----------------------------- 00:23:30 1703722931043 28088/RMR [INFO] sends: ts=1703722931 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:4569 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722931043 28088/RMR [INFO] sends: ts=1703722931 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:4564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722931043 28088/RMR [INFO] sends: ts=1703722931 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:3564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722931043 28088/RMR [INFO] sends: ts=1703722931 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:3563 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722959443 28088/RMR [INFO] sends: ts=1703722959 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:4569 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722959443 28088/RMR [INFO] sends: ts=1703722959 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:4564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722959443 28088/RMR [INFO] sends: ts=1703722959 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:3564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722959443 28088/RMR [INFO] sends: ts=1703722959 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:3563 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722959518 28088/RMR [INFO] sends: ts=1703722959 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:4569 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722959519 28088/RMR [INFO] sends: ts=1703722959 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:4564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722959519 28088/RMR [INFO] sends: ts=1703722959 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:3564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722959519 28088/RMR [INFO] sends: ts=1703722959 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:3563 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722962047 28088/RMR [INFO] sends: ts=1703722962 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:4569 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722962047 28088/RMR [INFO] sends: ts=1703722962 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:4564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722962047 28088/RMR [INFO] sends: ts=1703722962 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:3564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722962047 28088/RMR [INFO] sends: ts=1703722962 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:3563 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 ------------------------------ Captured log call ------------------------------- 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 --------------------------- Captured stderr teardown --------------------------- 00:23:30 1703722990446 28088/RMR [INFO] sends: ts=1703722990 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:4569 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722990446 28088/RMR [INFO] sends: ts=1703722990 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:4564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722990446 28088/RMR [INFO] sends: ts=1703722990 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:3564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722990446 28088/RMR [INFO] sends: ts=1703722990 src=prd-ubuntu1804-builder-2c-2g-2145:4652 target=127.0.0.1:3563 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722990522 28088/RMR [INFO] sends: ts=1703722990 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:4569 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722990522 28088/RMR [INFO] sends: ts=1703722990 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:4564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722990522 28088/RMR [INFO] sends: ts=1703722990 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:3564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722990522 28088/RMR [INFO] sends: ts=1703722990 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:3563 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722993050 28088/RMR [INFO] sends: ts=1703722993 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:4569 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722993050 28088/RMR [INFO] sends: ts=1703722993 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:4564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722993050 28088/RMR [INFO] sends: ts=1703722993 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:3564 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 1703722993050 28088/RMR [INFO] sends: ts=1703722993 src=prd-ubuntu1804-builder-2c-2g-2145:4567 target=127.0.0.1:3563 open=0 succ=0 fail=0 (hard=0 soft=0) 00:23:30 ---------------------------- Captured log teardown ----------------------------- 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 WARNING urllib3.connectionpool:connectionpool.py:871 Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError(': Failed to establish a new connection: [Errno 16] Device or resource busy')': /ric/v1/deregister 00:23:30 ____________________________ test_init_general_xapp ____________________________ 00:23:30 00:23:30 def test_init_general_xapp(): 00:23:30 def entry(self): 00:23:30 # normally we would have some kind of loop here 00:23:30 print("bye") 00:23:30 00:23:30 > gen_xapp = Xapp(entrypoint=entry, rmr_wait_for_ready=False, use_fake_sdl=True) 00:23:30 00:23:30 tests/test_init.py:46: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 ricxappframe/xapp_frame.py:961: in __init__ 00:23:30 super().__init__(rmr_port=rmr_port, rmr_wait_for_ready=rmr_wait_for_ready, use_fake_sdl=use_fake_sdl) 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = , rmr_port = 4562 00:23:30 rmr_wait_for_ready = False, use_fake_sdl = True, post_init = None 00:23:30 00:23:30 def __init__(self, rmr_port=4562, rmr_wait_for_ready=True, use_fake_sdl=False, post_init=None): 00:23:30 """ 00:23:30 Documented in the class comment. 00:23:30 """ 00:23:30 # PUBLIC, can be used by xapps using self.(name): 00:23:30 self.logger = Logger(name=__name__) 00:23:30 self._appthread = None 00:23:30 00:23:30 # Start rmr rcv thread 00:23:30 self._rmr_loop = xapp_rmr.RmrLoop(port=rmr_port, wait_for_ready=rmr_wait_for_ready) 00:23:30 self._mrc = self._rmr_loop.mrc # for convenience 00:23:30 00:23:30 # SDL 00:23:30 self.sdl = SDLWrapper(use_fake_sdl) 00:23:30 00:23:30 # Config 00:23:30 # The environment variable specifies the path to the Xapp config file 00:23:30 self._config_path = os.environ.get(Constants.CONFIG_FILE_ENV, None) 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 self._inotify = inotify_simple.INotify() 00:23:30 self._inotify.add_watch(self._config_path, inotify_simple.flags.MODIFY) 00:23:30 self.logger.debug("__init__: watching config file {}".format(self._config_path)) 00:23:30 else: 00:23:30 self._inotify = None 00:23:30 self.logger.warning("__init__: NOT watching any config file") 00:23:30 00:23:30 self.session = requests.Session() 00:23:30 # set Retry mechanism for any failure 00:23:30 retries = Retry(total=5, 00:23:30 backoff_factor=1, 00:23:30 allowed_methods=frozenset(['GET', 'POST'])) 00:23:30 00:23:30 adapter = HTTPAdapter(max_retries=retries) 00:23:30 self.session.mount('http://', adapter) 00:23:30 self.session.mount('https://', adapter) 00:23:30 00:23:30 # configuration data for xapp registration and deregistration 00:23:30 self._config_data = None 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 with open(self._config_path) as json_file: 00:23:30 self._config_data = json.load(json_file) 00:23:30 else: 00:23:30 > elf.logger.error("__init__: Cannot Read config file for xapp Registration") 00:23:30 E NameError: name 'elf' is not defined 00:23:30 00:23:30 ricxappframe/xapp_frame.py:128: NameError 00:23:30 ______________________________ test_init_rmr_xapp ______________________________ 00:23:30 00:23:30 def test_init_rmr_xapp(): 00:23:30 def post_init(self): 00:23:30 print("hey") 00:23:30 00:23:30 def foo(self, _summary, _sbuf): 00:23:30 pass 00:23:30 00:23:30 > rmr_xapp = RMRXapp(foo, post_init=post_init, rmr_wait_for_ready=False, use_fake_sdl=True) 00:23:30 00:23:30 tests/test_init.py:59: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 ricxappframe/xapp_frame.py:811: in __init__ 00:23:30 super().__init__( 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 rmr_port = 4562, rmr_wait_for_ready = False, use_fake_sdl = True 00:23:30 post_init = .post_init at 0x7f3a2ab6beb0> 00:23:30 00:23:30 def __init__(self, rmr_port=4562, rmr_wait_for_ready=True, use_fake_sdl=False, post_init=None): 00:23:30 """ 00:23:30 Documented in the class comment. 00:23:30 """ 00:23:30 # PUBLIC, can be used by xapps using self.(name): 00:23:30 self.logger = Logger(name=__name__) 00:23:30 self._appthread = None 00:23:30 00:23:30 # Start rmr rcv thread 00:23:30 self._rmr_loop = xapp_rmr.RmrLoop(port=rmr_port, wait_for_ready=rmr_wait_for_ready) 00:23:30 self._mrc = self._rmr_loop.mrc # for convenience 00:23:30 00:23:30 # SDL 00:23:30 self.sdl = SDLWrapper(use_fake_sdl) 00:23:30 00:23:30 # Config 00:23:30 # The environment variable specifies the path to the Xapp config file 00:23:30 self._config_path = os.environ.get(Constants.CONFIG_FILE_ENV, None) 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 self._inotify = inotify_simple.INotify() 00:23:30 self._inotify.add_watch(self._config_path, inotify_simple.flags.MODIFY) 00:23:30 self.logger.debug("__init__: watching config file {}".format(self._config_path)) 00:23:30 else: 00:23:30 self._inotify = None 00:23:30 self.logger.warning("__init__: NOT watching any config file") 00:23:30 00:23:30 self.session = requests.Session() 00:23:30 # set Retry mechanism for any failure 00:23:30 retries = Retry(total=5, 00:23:30 backoff_factor=1, 00:23:30 allowed_methods=frozenset(['GET', 'POST'])) 00:23:30 00:23:30 adapter = HTTPAdapter(max_retries=retries) 00:23:30 self.session.mount('http://', adapter) 00:23:30 self.session.mount('https://', adapter) 00:23:30 00:23:30 # configuration data for xapp registration and deregistration 00:23:30 self._config_data = None 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 with open(self._config_path) as json_file: 00:23:30 self._config_data = json.load(json_file) 00:23:30 else: 00:23:30 > elf.logger.error("__init__: Cannot Read config file for xapp Registration") 00:23:30 E NameError: name 'elf' is not defined 00:23:30 00:23:30 ricxappframe/xapp_frame.py:128: NameError 00:23:30 ________________________________ test_rmr_init _________________________________ 00:23:30 00:23:30 def test_rmr_init(): 00:23:30 00:23:30 # test variables 00:23:30 def_pay = None 00:23:30 sixty_pay = None 00:23:30 00:23:30 # create rmr app 00:23:30 00:23:30 def default_handler(self, summary, sbuf): 00:23:30 nonlocal def_pay 00:23:30 def_pay = json.loads(summary["payload"]) 00:23:30 self.rmr_free(sbuf) 00:23:30 00:23:30 def sixtythou_handler(self, summary, sbuf): 00:23:30 nonlocal sixty_pay 00:23:30 sixty_pay = json.loads(summary["payload"]) 00:23:30 self.rmr_free(sbuf) 00:23:30 00:23:30 global rmr_xapp 00:23:30 > rmr_xapp = RMRXapp(default_handler, rmr_port=4564, use_fake_sdl=True) 00:23:30 00:23:30 tests/test_xapps.py:52: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 ricxappframe/xapp_frame.py:811: in __init__ 00:23:30 super().__init__( 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 rmr_port = 4564, rmr_wait_for_ready = True, use_fake_sdl = True 00:23:30 post_init = None 00:23:30 00:23:30 def __init__(self, rmr_port=4562, rmr_wait_for_ready=True, use_fake_sdl=False, post_init=None): 00:23:30 """ 00:23:30 Documented in the class comment. 00:23:30 """ 00:23:30 # PUBLIC, can be used by xapps using self.(name): 00:23:30 self.logger = Logger(name=__name__) 00:23:30 self._appthread = None 00:23:30 00:23:30 # Start rmr rcv thread 00:23:30 self._rmr_loop = xapp_rmr.RmrLoop(port=rmr_port, wait_for_ready=rmr_wait_for_ready) 00:23:30 self._mrc = self._rmr_loop.mrc # for convenience 00:23:30 00:23:30 # SDL 00:23:30 self.sdl = SDLWrapper(use_fake_sdl) 00:23:30 00:23:30 # Config 00:23:30 # The environment variable specifies the path to the Xapp config file 00:23:30 self._config_path = os.environ.get(Constants.CONFIG_FILE_ENV, None) 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 self._inotify = inotify_simple.INotify() 00:23:30 self._inotify.add_watch(self._config_path, inotify_simple.flags.MODIFY) 00:23:30 self.logger.debug("__init__: watching config file {}".format(self._config_path)) 00:23:30 else: 00:23:30 self._inotify = None 00:23:30 self.logger.warning("__init__: NOT watching any config file") 00:23:30 00:23:30 self.session = requests.Session() 00:23:30 # set Retry mechanism for any failure 00:23:30 retries = Retry(total=5, 00:23:30 backoff_factor=1, 00:23:30 allowed_methods=frozenset(['GET', 'POST'])) 00:23:30 00:23:30 adapter = HTTPAdapter(max_retries=retries) 00:23:30 self.session.mount('http://', adapter) 00:23:30 self.session.mount('https://', adapter) 00:23:30 00:23:30 # configuration data for xapp registration and deregistration 00:23:30 self._config_data = None 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 with open(self._config_path) as json_file: 00:23:30 self._config_data = json.load(json_file) 00:23:30 else: 00:23:30 > elf.logger.error("__init__: Cannot Read config file for xapp Registration") 00:23:30 E NameError: name 'elf' is not defined 00:23:30 00:23:30 ricxappframe/xapp_frame.py:128: NameError 00:23:30 _____________________________ test_rmr_healthcheck _____________________________ 00:23:30 00:23:30 def test_rmr_healthcheck(): 00:23:30 # thanos uses the rmr xapp to healthcheck the rmr xapp 00:23:30 00:23:30 # test variables 00:23:30 health_pay = None 00:23:30 00:23:30 def post_init(self): 00:23:30 self.rmr_send(b"", Constants.RIC_HEALTH_CHECK_REQ) 00:23:30 00:23:30 def default_handler(self, summary, sbuf): 00:23:30 pass 00:23:30 00:23:30 global rmr_xapp_health 00:23:30 > rmr_xapp_health = RMRXapp(default_handler, post_init=post_init, rmr_port=4666, use_fake_sdl=True) 00:23:30 00:23:30 tests/test_xapps.py:100: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 ricxappframe/xapp_frame.py:811: in __init__ 00:23:30 super().__init__( 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 rmr_port = 4666, rmr_wait_for_ready = True, use_fake_sdl = True 00:23:30 post_init = .post_init at 0x7f3a2ab69870> 00:23:30 00:23:30 def __init__(self, rmr_port=4562, rmr_wait_for_ready=True, use_fake_sdl=False, post_init=None): 00:23:30 """ 00:23:30 Documented in the class comment. 00:23:30 """ 00:23:30 # PUBLIC, can be used by xapps using self.(name): 00:23:30 self.logger = Logger(name=__name__) 00:23:30 self._appthread = None 00:23:30 00:23:30 # Start rmr rcv thread 00:23:30 self._rmr_loop = xapp_rmr.RmrLoop(port=rmr_port, wait_for_ready=rmr_wait_for_ready) 00:23:30 self._mrc = self._rmr_loop.mrc # for convenience 00:23:30 00:23:30 # SDL 00:23:30 self.sdl = SDLWrapper(use_fake_sdl) 00:23:30 00:23:30 # Config 00:23:30 # The environment variable specifies the path to the Xapp config file 00:23:30 self._config_path = os.environ.get(Constants.CONFIG_FILE_ENV, None) 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 self._inotify = inotify_simple.INotify() 00:23:30 self._inotify.add_watch(self._config_path, inotify_simple.flags.MODIFY) 00:23:30 self.logger.debug("__init__: watching config file {}".format(self._config_path)) 00:23:30 else: 00:23:30 self._inotify = None 00:23:30 self.logger.warning("__init__: NOT watching any config file") 00:23:30 00:23:30 self.session = requests.Session() 00:23:30 # set Retry mechanism for any failure 00:23:30 retries = Retry(total=5, 00:23:30 backoff_factor=1, 00:23:30 allowed_methods=frozenset(['GET', 'POST'])) 00:23:30 00:23:30 adapter = HTTPAdapter(max_retries=retries) 00:23:30 self.session.mount('http://', adapter) 00:23:30 self.session.mount('https://', adapter) 00:23:30 00:23:30 # configuration data for xapp registration and deregistration 00:23:30 self._config_data = None 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 with open(self._config_path) as json_file: 00:23:30 self._config_data = json.load(json_file) 00:23:30 else: 00:23:30 > elf.logger.error("__init__: Cannot Read config file for xapp Registration") 00:23:30 E NameError: name 'elf' is not defined 00:23:30 00:23:30 ricxappframe/xapp_frame.py:128: NameError 00:23:30 ___________________________ test_rnib_get_list_nodeb ___________________________ 00:23:30 00:23:30 rnib_information = [b'\n\nnodeb_5678\x12\x14\n\tplmn_5678\x12\x07nb_5678\x18\x06', b''] 00:23:30 00:23:30 def test_rnib_get_list_nodeb(rnib_information): 00:23:30 global rnib_xapp 00:23:30 > rnib_xapp = _BaseXapp(rmr_port=4777, rmr_wait_for_ready=False, use_fake_sdl=True) 00:23:30 00:23:30 tests/test_xapps.py:117: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 rmr_port = 4777, rmr_wait_for_ready = False, use_fake_sdl = True 00:23:30 post_init = None 00:23:30 00:23:30 def __init__(self, rmr_port=4562, rmr_wait_for_ready=True, use_fake_sdl=False, post_init=None): 00:23:30 """ 00:23:30 Documented in the class comment. 00:23:30 """ 00:23:30 # PUBLIC, can be used by xapps using self.(name): 00:23:30 self.logger = Logger(name=__name__) 00:23:30 self._appthread = None 00:23:30 00:23:30 # Start rmr rcv thread 00:23:30 self._rmr_loop = xapp_rmr.RmrLoop(port=rmr_port, wait_for_ready=rmr_wait_for_ready) 00:23:30 self._mrc = self._rmr_loop.mrc # for convenience 00:23:30 00:23:30 # SDL 00:23:30 self.sdl = SDLWrapper(use_fake_sdl) 00:23:30 00:23:30 # Config 00:23:30 # The environment variable specifies the path to the Xapp config file 00:23:30 self._config_path = os.environ.get(Constants.CONFIG_FILE_ENV, None) 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 self._inotify = inotify_simple.INotify() 00:23:30 self._inotify.add_watch(self._config_path, inotify_simple.flags.MODIFY) 00:23:30 self.logger.debug("__init__: watching config file {}".format(self._config_path)) 00:23:30 else: 00:23:30 self._inotify = None 00:23:30 self.logger.warning("__init__: NOT watching any config file") 00:23:30 00:23:30 self.session = requests.Session() 00:23:30 # set Retry mechanism for any failure 00:23:30 retries = Retry(total=5, 00:23:30 backoff_factor=1, 00:23:30 allowed_methods=frozenset(['GET', 'POST'])) 00:23:30 00:23:30 adapter = HTTPAdapter(max_retries=retries) 00:23:30 self.session.mount('http://', adapter) 00:23:30 self.session.mount('https://', adapter) 00:23:30 00:23:30 # configuration data for xapp registration and deregistration 00:23:30 self._config_data = None 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 with open(self._config_path) as json_file: 00:23:30 self._config_data = json.load(json_file) 00:23:30 else: 00:23:30 > elf.logger.error("__init__: Cannot Read config file for xapp Registration") 00:23:30 E NameError: name 'elf' is not defined 00:23:30 00:23:30 ricxappframe/xapp_frame.py:128: NameError 00:23:30 _________________________ test_rnib_get_list_all_nodeb _________________________ 00:23:30 00:23:30 rnib_information = [b'\n\nnodeb_5678\x12\x14\n\tplmn_5678\x12\x07nb_5678\x18\x06', b''] 00:23:30 00:23:30 def test_rnib_get_list_all_nodeb(rnib_information): 00:23:30 global rnib_xapp 00:23:30 > rnib_xapp = _BaseXapp(rmr_port=4777, rmr_wait_for_ready=False, use_fake_sdl=True) 00:23:30 00:23:30 tests/test_xapps.py:145: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 rmr_port = 4777, rmr_wait_for_ready = False, use_fake_sdl = True 00:23:30 post_init = None 00:23:30 00:23:30 def __init__(self, rmr_port=4562, rmr_wait_for_ready=True, use_fake_sdl=False, post_init=None): 00:23:30 """ 00:23:30 Documented in the class comment. 00:23:30 """ 00:23:30 # PUBLIC, can be used by xapps using self.(name): 00:23:30 self.logger = Logger(name=__name__) 00:23:30 self._appthread = None 00:23:30 00:23:30 # Start rmr rcv thread 00:23:30 self._rmr_loop = xapp_rmr.RmrLoop(port=rmr_port, wait_for_ready=rmr_wait_for_ready) 00:23:30 self._mrc = self._rmr_loop.mrc # for convenience 00:23:30 00:23:30 # SDL 00:23:30 self.sdl = SDLWrapper(use_fake_sdl) 00:23:30 00:23:30 # Config 00:23:30 # The environment variable specifies the path to the Xapp config file 00:23:30 self._config_path = os.environ.get(Constants.CONFIG_FILE_ENV, None) 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 self._inotify = inotify_simple.INotify() 00:23:30 self._inotify.add_watch(self._config_path, inotify_simple.flags.MODIFY) 00:23:30 self.logger.debug("__init__: watching config file {}".format(self._config_path)) 00:23:30 else: 00:23:30 self._inotify = None 00:23:30 self.logger.warning("__init__: NOT watching any config file") 00:23:30 00:23:30 self.session = requests.Session() 00:23:30 # set Retry mechanism for any failure 00:23:30 retries = Retry(total=5, 00:23:30 backoff_factor=1, 00:23:30 allowed_methods=frozenset(['GET', 'POST'])) 00:23:30 00:23:30 adapter = HTTPAdapter(max_retries=retries) 00:23:30 self.session.mount('http://', adapter) 00:23:30 self.session.mount('https://', adapter) 00:23:30 00:23:30 # configuration data for xapp registration and deregistration 00:23:30 self._config_data = None 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 with open(self._config_path) as json_file: 00:23:30 self._config_data = json.load(json_file) 00:23:30 else: 00:23:30 > elf.logger.error("__init__: Cannot Read config file for xapp Registration") 00:23:30 E NameError: name 'elf' is not defined 00:23:30 00:23:30 ricxappframe/xapp_frame.py:128: NameError 00:23:30 ___________________________ test_rnib_get_list_cells ___________________________ 00:23:30 00:23:30 rnib_cellinformation = [b'\x08\x01', b'\x08\x01'] 00:23:30 00:23:30 def test_rnib_get_list_cells(rnib_cellinformation): 00:23:30 global rnib_xapp 00:23:30 00:23:30 > rnib_xapp = _BaseXapp(rmr_port=4777, rmr_wait_for_ready=False, use_fake_sdl=True) 00:23:30 00:23:30 tests/test_xapps.py:166: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 rmr_port = 4777, rmr_wait_for_ready = False, use_fake_sdl = True 00:23:30 post_init = None 00:23:30 00:23:30 def __init__(self, rmr_port=4562, rmr_wait_for_ready=True, use_fake_sdl=False, post_init=None): 00:23:30 """ 00:23:30 Documented in the class comment. 00:23:30 """ 00:23:30 # PUBLIC, can be used by xapps using self.(name): 00:23:30 self.logger = Logger(name=__name__) 00:23:30 self._appthread = None 00:23:30 00:23:30 # Start rmr rcv thread 00:23:30 self._rmr_loop = xapp_rmr.RmrLoop(port=rmr_port, wait_for_ready=rmr_wait_for_ready) 00:23:30 self._mrc = self._rmr_loop.mrc # for convenience 00:23:30 00:23:30 # SDL 00:23:30 self.sdl = SDLWrapper(use_fake_sdl) 00:23:30 00:23:30 # Config 00:23:30 # The environment variable specifies the path to the Xapp config file 00:23:30 self._config_path = os.environ.get(Constants.CONFIG_FILE_ENV, None) 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 self._inotify = inotify_simple.INotify() 00:23:30 self._inotify.add_watch(self._config_path, inotify_simple.flags.MODIFY) 00:23:30 self.logger.debug("__init__: watching config file {}".format(self._config_path)) 00:23:30 else: 00:23:30 self._inotify = None 00:23:30 self.logger.warning("__init__: NOT watching any config file") 00:23:30 00:23:30 self.session = requests.Session() 00:23:30 # set Retry mechanism for any failure 00:23:30 retries = Retry(total=5, 00:23:30 backoff_factor=1, 00:23:30 allowed_methods=frozenset(['GET', 'POST'])) 00:23:30 00:23:30 adapter = HTTPAdapter(max_retries=retries) 00:23:30 self.session.mount('http://', adapter) 00:23:30 self.session.mount('https://', adapter) 00:23:30 00:23:30 # configuration data for xapp registration and deregistration 00:23:30 self._config_data = None 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 with open(self._config_path) as json_file: 00:23:30 self._config_data = json.load(json_file) 00:23:30 else: 00:23:30 > elf.logger.error("__init__: Cannot Read config file for xapp Registration") 00:23:30 E NameError: name 'elf' is not defined 00:23:30 00:23:30 ricxappframe/xapp_frame.py:128: NameError 00:23:30 ---------------------------- Captured stdout setup ----------------------------- 00:23:30 00:23:30 _____________________________ test_rnib_get_nodeb ______________________________ 00:23:30 00:23:30 rnib_helpers = 00:23:30 00:23:30 def test_rnib_get_nodeb(rnib_helpers): 00:23:30 global rnib_xapp 00:23:30 > rnib_xapp = _BaseXapp(rmr_port=4777, rmr_wait_for_ready=False, use_fake_sdl=True) 00:23:30 00:23:30 tests/test_xapps.py:184: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 rmr_port = 4777, rmr_wait_for_ready = False, use_fake_sdl = True 00:23:30 post_init = None 00:23:30 00:23:30 def __init__(self, rmr_port=4562, rmr_wait_for_ready=True, use_fake_sdl=False, post_init=None): 00:23:30 """ 00:23:30 Documented in the class comment. 00:23:30 """ 00:23:30 # PUBLIC, can be used by xapps using self.(name): 00:23:30 self.logger = Logger(name=__name__) 00:23:30 self._appthread = None 00:23:30 00:23:30 # Start rmr rcv thread 00:23:30 self._rmr_loop = xapp_rmr.RmrLoop(port=rmr_port, wait_for_ready=rmr_wait_for_ready) 00:23:30 self._mrc = self._rmr_loop.mrc # for convenience 00:23:30 00:23:30 # SDL 00:23:30 self.sdl = SDLWrapper(use_fake_sdl) 00:23:30 00:23:30 # Config 00:23:30 # The environment variable specifies the path to the Xapp config file 00:23:30 self._config_path = os.environ.get(Constants.CONFIG_FILE_ENV, None) 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 self._inotify = inotify_simple.INotify() 00:23:30 self._inotify.add_watch(self._config_path, inotify_simple.flags.MODIFY) 00:23:30 self.logger.debug("__init__: watching config file {}".format(self._config_path)) 00:23:30 else: 00:23:30 self._inotify = None 00:23:30 self.logger.warning("__init__: NOT watching any config file") 00:23:30 00:23:30 self.session = requests.Session() 00:23:30 # set Retry mechanism for any failure 00:23:30 retries = Retry(total=5, 00:23:30 backoff_factor=1, 00:23:30 allowed_methods=frozenset(['GET', 'POST'])) 00:23:30 00:23:30 adapter = HTTPAdapter(max_retries=retries) 00:23:30 self.session.mount('http://', adapter) 00:23:30 self.session.mount('https://', adapter) 00:23:30 00:23:30 # configuration data for xapp registration and deregistration 00:23:30 self._config_data = None 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 with open(self._config_path) as json_file: 00:23:30 self._config_data = json.load(json_file) 00:23:30 else: 00:23:30 > elf.logger.error("__init__: Cannot Read config file for xapp Registration") 00:23:30 E NameError: name 'elf' is not defined 00:23:30 00:23:30 ricxappframe/xapp_frame.py:128: NameError 00:23:30 ______________________________ test_rnib_get_cell ______________________________ 00:23:30 00:23:30 rnib_helpers = 00:23:30 00:23:30 def test_rnib_get_cell(rnib_helpers): 00:23:30 global rnib_xapp 00:23:30 > rnib_xapp = _BaseXapp(rmr_port=4777, rmr_wait_for_ready=False, use_fake_sdl=True) 00:23:30 00:23:30 tests/test_xapps.py:201: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 rmr_port = 4777, rmr_wait_for_ready = False, use_fake_sdl = True 00:23:30 post_init = None 00:23:30 00:23:30 def __init__(self, rmr_port=4562, rmr_wait_for_ready=True, use_fake_sdl=False, post_init=None): 00:23:30 """ 00:23:30 Documented in the class comment. 00:23:30 """ 00:23:30 # PUBLIC, can be used by xapps using self.(name): 00:23:30 self.logger = Logger(name=__name__) 00:23:30 self._appthread = None 00:23:30 00:23:30 # Start rmr rcv thread 00:23:30 self._rmr_loop = xapp_rmr.RmrLoop(port=rmr_port, wait_for_ready=rmr_wait_for_ready) 00:23:30 self._mrc = self._rmr_loop.mrc # for convenience 00:23:30 00:23:30 # SDL 00:23:30 self.sdl = SDLWrapper(use_fake_sdl) 00:23:30 00:23:30 # Config 00:23:30 # The environment variable specifies the path to the Xapp config file 00:23:30 self._config_path = os.environ.get(Constants.CONFIG_FILE_ENV, None) 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 self._inotify = inotify_simple.INotify() 00:23:30 self._inotify.add_watch(self._config_path, inotify_simple.flags.MODIFY) 00:23:30 self.logger.debug("__init__: watching config file {}".format(self._config_path)) 00:23:30 else: 00:23:30 self._inotify = None 00:23:30 self.logger.warning("__init__: NOT watching any config file") 00:23:30 00:23:30 self.session = requests.Session() 00:23:30 # set Retry mechanism for any failure 00:23:30 retries = Retry(total=5, 00:23:30 backoff_factor=1, 00:23:30 allowed_methods=frozenset(['GET', 'POST'])) 00:23:30 00:23:30 adapter = HTTPAdapter(max_retries=retries) 00:23:30 self.session.mount('http://', adapter) 00:23:30 self.session.mount('https://', adapter) 00:23:30 00:23:30 # configuration data for xapp registration and deregistration 00:23:30 self._config_data = None 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 with open(self._config_path) as json_file: 00:23:30 self._config_data = json.load(json_file) 00:23:30 else: 00:23:30 > elf.logger.error("__init__: Cannot Read config file for xapp Registration") 00:23:30 E NameError: name 'elf' is not defined 00:23:30 00:23:30 ricxappframe/xapp_frame.py:128: NameError 00:23:30 ___________________________ test_rnib_get_cell_by_id ___________________________ 00:23:30 00:23:30 rnib_helpers = 00:23:30 00:23:30 def test_rnib_get_cell_by_id(rnib_helpers): 00:23:30 global rnib_xapp 00:23:30 > rnib_xapp = _BaseXapp(rmr_port=4777, rmr_wait_for_ready=False, use_fake_sdl=True) 00:23:30 00:23:30 tests/test_xapps.py:218: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 rmr_port = 4777, rmr_wait_for_ready = False, use_fake_sdl = True 00:23:30 post_init = None 00:23:30 00:23:30 def __init__(self, rmr_port=4562, rmr_wait_for_ready=True, use_fake_sdl=False, post_init=None): 00:23:30 """ 00:23:30 Documented in the class comment. 00:23:30 """ 00:23:30 # PUBLIC, can be used by xapps using self.(name): 00:23:30 self.logger = Logger(name=__name__) 00:23:30 self._appthread = None 00:23:30 00:23:30 # Start rmr rcv thread 00:23:30 self._rmr_loop = xapp_rmr.RmrLoop(port=rmr_port, wait_for_ready=rmr_wait_for_ready) 00:23:30 self._mrc = self._rmr_loop.mrc # for convenience 00:23:30 00:23:30 # SDL 00:23:30 self.sdl = SDLWrapper(use_fake_sdl) 00:23:30 00:23:30 # Config 00:23:30 # The environment variable specifies the path to the Xapp config file 00:23:30 self._config_path = os.environ.get(Constants.CONFIG_FILE_ENV, None) 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 self._inotify = inotify_simple.INotify() 00:23:30 self._inotify.add_watch(self._config_path, inotify_simple.flags.MODIFY) 00:23:30 self.logger.debug("__init__: watching config file {}".format(self._config_path)) 00:23:30 else: 00:23:30 self._inotify = None 00:23:30 self.logger.warning("__init__: NOT watching any config file") 00:23:30 00:23:30 self.session = requests.Session() 00:23:30 # set Retry mechanism for any failure 00:23:30 retries = Retry(total=5, 00:23:30 backoff_factor=1, 00:23:30 allowed_methods=frozenset(['GET', 'POST'])) 00:23:30 00:23:30 adapter = HTTPAdapter(max_retries=retries) 00:23:30 self.session.mount('http://', adapter) 00:23:30 self.session.mount('https://', adapter) 00:23:30 00:23:30 # configuration data for xapp registration and deregistration 00:23:30 self._config_data = None 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 with open(self._config_path) as json_file: 00:23:30 self._config_data = json.load(json_file) 00:23:30 else: 00:23:30 > elf.logger.error("__init__: Cannot Read config file for xapp Registration") 00:23:30 E NameError: name 'elf' is not defined 00:23:30 00:23:30 ricxappframe/xapp_frame.py:128: NameError 00:23:30 _____________________________ test_rnib_get_cells ______________________________ 00:23:30 00:23:30 rnib_helpers = 00:23:30 00:23:30 def test_rnib_get_cells(rnib_helpers): 00:23:30 global rnib_xapp 00:23:30 > rnib_xapp = _BaseXapp(rmr_port=4777, rmr_wait_for_ready=False, use_fake_sdl=True) 00:23:30 00:23:30 tests/test_xapps.py:235: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 rmr_port = 4777, rmr_wait_for_ready = False, use_fake_sdl = True 00:23:30 post_init = None 00:23:30 00:23:30 def __init__(self, rmr_port=4562, rmr_wait_for_ready=True, use_fake_sdl=False, post_init=None): 00:23:30 """ 00:23:30 Documented in the class comment. 00:23:30 """ 00:23:30 # PUBLIC, can be used by xapps using self.(name): 00:23:30 self.logger = Logger(name=__name__) 00:23:30 self._appthread = None 00:23:30 00:23:30 # Start rmr rcv thread 00:23:30 self._rmr_loop = xapp_rmr.RmrLoop(port=rmr_port, wait_for_ready=rmr_wait_for_ready) 00:23:30 self._mrc = self._rmr_loop.mrc # for convenience 00:23:30 00:23:30 # SDL 00:23:30 self.sdl = SDLWrapper(use_fake_sdl) 00:23:30 00:23:30 # Config 00:23:30 # The environment variable specifies the path to the Xapp config file 00:23:30 self._config_path = os.environ.get(Constants.CONFIG_FILE_ENV, None) 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 self._inotify = inotify_simple.INotify() 00:23:30 self._inotify.add_watch(self._config_path, inotify_simple.flags.MODIFY) 00:23:30 self.logger.debug("__init__: watching config file {}".format(self._config_path)) 00:23:30 else: 00:23:30 self._inotify = None 00:23:30 self.logger.warning("__init__: NOT watching any config file") 00:23:30 00:23:30 self.session = requests.Session() 00:23:30 # set Retry mechanism for any failure 00:23:30 retries = Retry(total=5, 00:23:30 backoff_factor=1, 00:23:30 allowed_methods=frozenset(['GET', 'POST'])) 00:23:30 00:23:30 adapter = HTTPAdapter(max_retries=retries) 00:23:30 self.session.mount('http://', adapter) 00:23:30 self.session.mount('https://', adapter) 00:23:30 00:23:30 # configuration data for xapp registration and deregistration 00:23:30 self._config_data = None 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 with open(self._config_path) as json_file: 00:23:30 self._config_data = json.load(json_file) 00:23:30 else: 00:23:30 > elf.logger.error("__init__: Cannot Read config file for xapp Registration") 00:23:30 E NameError: name 'elf' is not defined 00:23:30 00:23:30 ricxappframe/xapp_frame.py:128: NameError 00:23:30 __________________________ test_rnib_get_global_nodeb __________________________ 00:23:30 00:23:30 rnib_helpers = 00:23:30 00:23:30 def test_rnib_get_global_nodeb(rnib_helpers): 00:23:30 global rnib_xapp 00:23:30 > rnib_xapp = _BaseXapp(rmr_port=4777, rmr_wait_for_ready=False, use_fake_sdl=True) 00:23:30 00:23:30 tests/test_xapps.py:252: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 rmr_port = 4777, rmr_wait_for_ready = False, use_fake_sdl = True 00:23:30 post_init = None 00:23:30 00:23:30 def __init__(self, rmr_port=4562, rmr_wait_for_ready=True, use_fake_sdl=False, post_init=None): 00:23:30 """ 00:23:30 Documented in the class comment. 00:23:30 """ 00:23:30 # PUBLIC, can be used by xapps using self.(name): 00:23:30 self.logger = Logger(name=__name__) 00:23:30 self._appthread = None 00:23:30 00:23:30 # Start rmr rcv thread 00:23:30 self._rmr_loop = xapp_rmr.RmrLoop(port=rmr_port, wait_for_ready=rmr_wait_for_ready) 00:23:30 self._mrc = self._rmr_loop.mrc # for convenience 00:23:30 00:23:30 # SDL 00:23:30 self.sdl = SDLWrapper(use_fake_sdl) 00:23:30 00:23:30 # Config 00:23:30 # The environment variable specifies the path to the Xapp config file 00:23:30 self._config_path = os.environ.get(Constants.CONFIG_FILE_ENV, None) 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 self._inotify = inotify_simple.INotify() 00:23:30 self._inotify.add_watch(self._config_path, inotify_simple.flags.MODIFY) 00:23:30 self.logger.debug("__init__: watching config file {}".format(self._config_path)) 00:23:30 else: 00:23:30 self._inotify = None 00:23:30 self.logger.warning("__init__: NOT watching any config file") 00:23:30 00:23:30 self.session = requests.Session() 00:23:30 # set Retry mechanism for any failure 00:23:30 retries = Retry(total=5, 00:23:30 backoff_factor=1, 00:23:30 allowed_methods=frozenset(['GET', 'POST'])) 00:23:30 00:23:30 adapter = HTTPAdapter(max_retries=retries) 00:23:30 self.session.mount('http://', adapter) 00:23:30 self.session.mount('https://', adapter) 00:23:30 00:23:30 # configuration data for xapp registration and deregistration 00:23:30 self._config_data = None 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 with open(self._config_path) as json_file: 00:23:30 self._config_data = json.load(json_file) 00:23:30 else: 00:23:30 > elf.logger.error("__init__: Cannot Read config file for xapp Registration") 00:23:30 E NameError: name 'elf' is not defined 00:23:30 00:23:30 ricxappframe/xapp_frame.py:128: NameError 00:23:30 __________________________ test_rnib_get_ranfunction ___________________________ 00:23:30 00:23:30 rnib_helpers = 00:23:30 00:23:30 def test_rnib_get_ranfunction(rnib_helpers): 00:23:30 global rnib_xapp 00:23:30 > rnib_xapp = _BaseXapp(rmr_port=4777, rmr_wait_for_ready=False, use_fake_sdl=True) 00:23:30 00:23:30 tests/test_xapps.py:269: 00:23:30 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 00:23:30 00:23:30 self = 00:23:30 rmr_port = 4777, rmr_wait_for_ready = False, use_fake_sdl = True 00:23:30 post_init = None 00:23:30 00:23:30 def __init__(self, rmr_port=4562, rmr_wait_for_ready=True, use_fake_sdl=False, post_init=None): 00:23:30 """ 00:23:30 Documented in the class comment. 00:23:30 """ 00:23:30 # PUBLIC, can be used by xapps using self.(name): 00:23:30 self.logger = Logger(name=__name__) 00:23:30 self._appthread = None 00:23:30 00:23:30 # Start rmr rcv thread 00:23:30 self._rmr_loop = xapp_rmr.RmrLoop(port=rmr_port, wait_for_ready=rmr_wait_for_ready) 00:23:30 self._mrc = self._rmr_loop.mrc # for convenience 00:23:30 00:23:30 # SDL 00:23:30 self.sdl = SDLWrapper(use_fake_sdl) 00:23:30 00:23:30 # Config 00:23:30 # The environment variable specifies the path to the Xapp config file 00:23:30 self._config_path = os.environ.get(Constants.CONFIG_FILE_ENV, None) 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 self._inotify = inotify_simple.INotify() 00:23:30 self._inotify.add_watch(self._config_path, inotify_simple.flags.MODIFY) 00:23:30 self.logger.debug("__init__: watching config file {}".format(self._config_path)) 00:23:30 else: 00:23:30 self._inotify = None 00:23:30 self.logger.warning("__init__: NOT watching any config file") 00:23:30 00:23:30 self.session = requests.Session() 00:23:30 # set Retry mechanism for any failure 00:23:30 retries = Retry(total=5, 00:23:30 backoff_factor=1, 00:23:30 allowed_methods=frozenset(['GET', 'POST'])) 00:23:30 00:23:30 adapter = HTTPAdapter(max_retries=retries) 00:23:30 self.session.mount('http://', adapter) 00:23:30 self.session.mount('https://', adapter) 00:23:30 00:23:30 # configuration data for xapp registration and deregistration 00:23:30 self._config_data = None 00:23:30 if self._config_path and os.path.isfile(self._config_path): 00:23:30 with open(self._config_path) as json_file: 00:23:30 self._config_data = json.load(json_file) 00:23:30 else: 00:23:30 > elf.logger.error("__init__: Cannot Read config file for xapp Registration") 00:23:30 E NameError: name 'elf' is not defined 00:23:30 00:23:30 ricxappframe/xapp_frame.py:128: NameError 00:23:30 =============================== warnings summary =============================== 00:23:30 tests/test_config.py::test_custom_config_handler 00:23:30 /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/.tox/code/lib/python3.10/site-packages/_pytest/threadexception.py:73: PytestUnhandledThreadExceptionWarning: Exception in thread Thread-3 (loop) 00:23:30 00:23:30 Traceback (most recent call last): 00:23:30 File "/w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/ricxappframe/xapp_frame.py", line 910, in loop 00:23:30 with open(self._config_path) as json_file: 00:23:30 FileNotFoundError: [Errno 2] No such file or directory: '/tmp/file.json' 00:23:30 00:23:30 During handling of the above exception, another exception occurred: 00:23:30 00:23:30 Traceback (most recent call last): 00:23:30 File "/opt/pyenv/versions/3.10.6/lib/python3.10/threading.py", line 1016, in _bootstrap_inner 00:23:30 self.run() 00:23:30 File "/opt/pyenv/versions/3.10.6/lib/python3.10/threading.py", line 953, in run 00:23:30 self._target(*self._args, **self._kwargs) 00:23:30 File "/w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/ricxappframe/xapp_frame.py", line 915, in loop 00:23:30 raise XappError(f"Error occurred during polling configuration handler: {error.str()}") 00:23:30 AttributeError: 'FileNotFoundError' object has no attribute 'str' 00:23:30 00:23:30 warnings.warn(pytest.PytestUnhandledThreadExceptionWarning(msg)) 00:23:30 00:23:30 -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html 00:23:30 ---------------------- generated xml file: /tmp/tests.xml ---------------------- 00:23:30 00:23:30 ---------- coverage: platform linux, python 3.10.6-final-0 ----------- 00:23:30 Name Stmts Miss Cover Missing 00:23:30 ----------------------------------------------------------------------- 00:23:30 ricxappframe/__init__.py 0 0 100% 00:23:30 ricxappframe/alarm/__init__.py 0 0 100% 00:23:30 ricxappframe/alarm/alarm.py 94 2 98% 250-251 00:23:30 ricxappframe/alarm/exceptions.py 2 0 100% 00:23:30 ricxappframe/constants.py 5 0 100% 00:23:30 ricxappframe/e2ap/__init__.py 0 0 100% 00:23:30 ricxappframe/e2ap/asn1.py 224 0 100% 00:23:30 ricxappframe/e2ap/asn1clib/__init__.py 0 0 100% 00:23:30 ricxappframe/e2ap/asn1clib/asn1clib.py 2 0 100% 00:23:30 ricxappframe/e2ap/asn1clib/types.py 16 0 100% 00:23:30 ricxappframe/logger/__init__.py 0 0 100% 00:23:30 ricxappframe/logger/mdclogger.py 133 22 83% 83-87, 95, 188-189, 196, 198, 200, 202, 220-224, 227-234 00:23:30 ricxappframe/metric/__init__.py 0 0 100% 00:23:30 ricxappframe/metric/exceptions.py 2 0 100% 00:23:30 ricxappframe/metric/metric.py 58 3 95% 122, 201-202 00:23:30 ricxappframe/rmr/__init__.py 0 0 100% 00:23:30 ricxappframe/rmr/exceptions.py 4 0 100% 00:23:30 ricxappframe/rmr/helpers.py 28 0 100% 00:23:30 ricxappframe/rmr/rmr.py 156 3 98% 257, 454, 544 00:23:30 ricxappframe/rmr/rmr_mocks/__init__.py 0 0 100% 00:23:30 ricxappframe/rmr/rmr_mocks/rmr_mocks.py 78 6 92% 39, 59, 79, 115, 133, 148 00:23:30 ricxappframe/rmr/rmrclib/__init__.py 0 0 100% 00:23:30 ricxappframe/rmr/rmrclib/rmrclib.py 38 1 97% 53 00:23:30 ricxappframe/util/__init__.py 0 0 100% 00:23:30 ricxappframe/util/constants.py 11 0 100% 00:23:30 ricxappframe/xapp_frame.py 263 134 49% 129, 133, 151-162, 173-199, 222-224, 231-232, 244-246, 266-276, 301-307, 322, 350, 378, 409, 425, 452-458, 478, 498, 525-530, 554-559, 584-590, 617-628, 645-650, 673-678, 701-709, 715, 739, 753, 757, 828-831, 897-901, 920, 927-928, 962, 968-970 00:23:30 ricxappframe/xapp_rest.py 91 12 87% 66, 72-74, 131-132, 142-143, 155-156, 191-193 00:23:30 ricxappframe/xapp_rmr.py 42 23 45% 76-94, 107-113, 126, 129-137 00:23:30 ricxappframe/xapp_sdl.py 94 2 98% 53, 655 00:23:30 ricxappframe/xapp_subscribe.py 54 3 94% 64, 103, 171 00:23:30 ricxappframe/xapp_symptomdata.py 119 20 83% 43, 111-116, 152, 154-156, 160-161, 200-201, 221-224, 228 00:23:30 ----------------------------------------------------------------------- 00:23:30 TOTAL 1514 231 85% 00:23:30 Coverage HTML written to dir htmlcov 00:23:30 Coverage XML written to file coverage.xml 00:23:30 00:23:30 Required test coverage of 70% reached. Total coverage: 84.74% 00:23:30 =========================== short test summary info ============================ 00:23:30 FAILED tests/test_config.py::test_config_no_env - NameError: name 'elf' is no... 00:23:30 FAILED tests/test_config.py::test_default_config_handler - requests.exception... 00:23:30 FAILED tests/test_config.py::test_custom_config_handler - requests.exceptions... 00:23:30 FAILED tests/test_init.py::test_init_general_xapp - NameError: name 'elf' is ... 00:23:30 FAILED tests/test_init.py::test_init_rmr_xapp - NameError: name 'elf' is not ... 00:23:30 FAILED tests/test_xapps.py::test_rmr_init - NameError: name 'elf' is not defined 00:23:30 FAILED tests/test_xapps.py::test_rmr_healthcheck - NameError: name 'elf' is n... 00:23:30 FAILED tests/test_xapps.py::test_rnib_get_list_nodeb - NameError: name 'elf' ... 00:23:30 FAILED tests/test_xapps.py::test_rnib_get_list_all_nodeb - NameError: name 'e... 00:23:30 FAILED tests/test_xapps.py::test_rnib_get_list_cells - NameError: name 'elf' ... 00:23:30 FAILED tests/test_xapps.py::test_rnib_get_nodeb - NameError: name 'elf' is no... 00:23:30 FAILED tests/test_xapps.py::test_rnib_get_cell - NameError: name 'elf' is not... 00:23:30 FAILED tests/test_xapps.py::test_rnib_get_cell_by_id - NameError: name 'elf' ... 00:23:30 FAILED tests/test_xapps.py::test_rnib_get_cells - NameError: name 'elf' is no... 00:23:30 FAILED tests/test_xapps.py::test_rnib_get_global_nodeb - NameError: name 'elf... 00:23:30 FAILED tests/test_xapps.py::test_rnib_get_ranfunction - NameError: name 'elf'... 00:23:30 ============= 16 failed, 59 passed, 1 warning in 119.63s (0:01:59) ============= 00:23:30 code: exit 1 (120.11 seconds) /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master> pytest --cov ricxappframe --cov-report xml --cov-report term-missing --cov-report html --cov-fail-under=70 --junitxml=/tmp/tests.xml pid=28088 00:23:30 .pkg: _exit> python /tmp/venv-HMen/lib/python3.10/site-packages/pyproject_api/_backend.py True setuptools.build_meta __legacy__ 00:23:30 code: FAIL ✖ in 2 minutes 16.35 seconds 00:23:30 flake8: install_deps> python -I -m pip install flake8 00:23:32 flake8: freeze> python -m pip freeze --all 00:23:32 flake8: flake8==6.1.0,mccabe==0.7.0,pip==23.3.1,pycodestyle==2.11.1,pyflakes==3.1.0,setuptools==69.0.2,wheel==0.42.0 00:23:32 flake8: commands[0]> flake8 setup.py ricxappframe tests 00:23:33 ricxappframe/xapp_frame.py:114:33: W291 trailing whitespace 00:23:33 ricxappframe/xapp_frame.py:128:13: F821 undefined name 'elf' 00:23:33 ricxappframe/xapp_frame.py:152:1: W293 blank line contains whitespace 00:23:33 ricxappframe/xapp_frame.py:176:9: F841 local variable 'pltnamespace' is assigned to but never used 00:23:33 ricxappframe/xapp_frame.py:182:29: F541 f-string is missing placeholders 00:23:33 ricxappframe/xapp_frame.py:194:50: F821 undefined name 'plt_namespace' 00:23:33 ricxappframe/xapp_frame.py:194:65: F821 undefined name 'plt_namespace' 00:23:33 ricxappframe/xapp_frame.py:199:72: W291 trailing whitespace 00:23:33 ricxappframe/xapp_frame.py:213:1: W293 blank line contains whitespace 00:23:33 ricxappframe/xapp_frame.py:224:75: W291 trailing whitespace 00:23:33 ricxappframe/xapp_frame.py:973:5: E303 too many blank lines (2) 00:23:33 ricxappframe/xapp_rmr.py:127:1: W293 blank line contains whitespace 00:23:33 ricxappframe/xapp_rmr.py:130:76: F821 undefined name 'port' 00:23:33 ricxappframe/xapp_rmr.py:133:1: W293 blank line contains whitespace 00:23:33 ricxappframe/xapp_rmr.py:140:1: W391 blank line at end of file 00:23:33 flake8: exit 1 (0.80 seconds) /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master> flake8 setup.py ricxappframe tests pid=28423 00:23:33 code: FAIL code 1 (136.35=setup[16.24]+cmd[120.11] seconds) 00:23:33 flake8: FAIL code 1 (3.12=setup[2.32]+cmd[0.80] seconds) 00:23:33 evaluation failed :( (139.65 seconds) 00:23:33 + tox_status=255 00:23:33 + echo '---> Completed tox runs' 00:23:33 ---> Completed tox runs 00:23:33 + for i in .tox/*/log 00:23:33 ++ awk -F/ '{print $2}' 00:23:33 ++ echo .tox/code/log 00:23:33 + tox_env=code 00:23:33 + cp -r .tox/code/log /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/archives/tox/code 00:23:33 + for i in .tox/*/log 00:23:33 ++ awk -F/ '{print $2}' 00:23:33 ++ echo .tox/flake8/log 00:23:33 + tox_env=flake8 00:23:33 + cp -r .tox/flake8/log /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/archives/tox/flake8 00:23:33 + DOC_DIR=docs/_build/html 00:23:33 + [[ -d docs/_build/html ]] 00:23:33 + echo '---> tox-run.sh ends' 00:23:33 ---> tox-run.sh ends 00:23:33 + test 255 -eq 0 00:23:33 + exit 255 00:23:33 ++ '[' 1 = 1 ']' 00:23:33 ++ '[' -x /usr/bin/clear_console ']' 00:23:33 ++ /usr/bin/clear_console -q 00:23:33 Build step 'Execute shell' marked build as failure 00:23:33 $ ssh-agent -k 00:23:33 unset SSH_AUTH_SOCK; 00:23:33 unset SSH_AGENT_PID; 00:23:33 echo Agent pid 5546 killed; 00:23:33 [ssh-agent] Stopped. 00:23:33 [PostBuildScript] - [INFO] Executing post build scripts. 00:23:33 [ric-plt-xapp-frame-py-pypi-verify-master] $ /bin/bash /tmp/jenkins14251985653747654302.sh 00:23:33 ---> sysstat.sh 00:23:34 [ric-plt-xapp-frame-py-pypi-verify-master] $ /bin/bash /tmp/jenkins6344061377947227172.sh 00:23:34 ---> package-listing.sh 00:23:34 ++ tr '[:upper:]' '[:lower:]' 00:23:34 ++ facter osfamily 00:23:34 + OS_FAMILY=debian 00:23:34 + workspace=/w/workspace/ric-plt-xapp-frame-py-pypi-verify-master 00:23:34 + START_PACKAGES=/tmp/packages_start.txt 00:23:34 + END_PACKAGES=/tmp/packages_end.txt 00:23:34 + DIFF_PACKAGES=/tmp/packages_diff.txt 00:23:34 + PACKAGES=/tmp/packages_start.txt 00:23:34 + '[' /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master ']' 00:23:34 + PACKAGES=/tmp/packages_end.txt 00:23:34 + case "${OS_FAMILY}" in 00:23:34 + grep '^ii' 00:23:34 + dpkg -l 00:23:34 + '[' -f /tmp/packages_start.txt ']' 00:23:34 + '[' -f /tmp/packages_end.txt ']' 00:23:34 + diff /tmp/packages_start.txt /tmp/packages_end.txt 00:23:34 + true 00:23:34 + '[' /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master ']' 00:23:34 + mkdir -p /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/archives/ 00:23:34 + cp -f /tmp/packages_diff.txt /tmp/packages_end.txt /tmp/packages_start.txt /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/archives/ 00:23:34 [ric-plt-xapp-frame-py-pypi-verify-master] $ /bin/bash /tmp/jenkins15246972934878817698.sh 00:23:34 ---> capture-instance-metadata.sh 00:23:34 Setup pyenv: 00:23:35 system 00:23:35 3.8.13 00:23:35 3.9.13 00:23:35 * 3.10.6 (set by /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/.python-version) 00:23:35 lf-activate-venv(): INFO: Reuse venv:/tmp/venv-M6V1 from file:/tmp/.os_lf_venv 00:23:36 lf-activate-venv(): INFO: Installing: lftools 00:23:51 lf-activate-venv(): INFO: Adding /tmp/venv-M6V1/bin to PATH 00:23:51 INFO: Running in OpenStack, capturing instance metadata 00:23:51 [ric-plt-xapp-frame-py-pypi-verify-master] $ /bin/bash /tmp/jenkins3118827781795872656.sh 00:23:52 provisioning config files... 00:23:52 copy managed file [jenkins-log-archives-settings] to file:/w/workspace/ric-plt-xapp-frame-py-pypi-verify-master@tmp/config4972484380197239745tmp 00:23:52 Regular expression run condition: Expression=[^.*logs-s3.*], Label=[] 00:23:52 Run condition [Regular expression match] preventing perform for step [Provide Configuration files] 00:23:52 [EnvInject] - Injecting environment variables from a build step. 00:23:52 [EnvInject] - Injecting as environment variables the properties content 00:23:52 SERVER_ID=logs 00:23:52 00:23:52 [EnvInject] - Variables injected successfully. 00:23:52 [ric-plt-xapp-frame-py-pypi-verify-master] $ /bin/bash /tmp/jenkins135941860319226813.sh 00:23:52 ---> create-netrc.sh 00:23:52 [ric-plt-xapp-frame-py-pypi-verify-master] $ /bin/bash /tmp/jenkins3858177173256098539.sh 00:23:52 ---> python-tools-install.sh 00:23:52 Setup pyenv: 00:23:52 system 00:23:52 3.8.13 00:23:52 3.9.13 00:23:52 * 3.10.6 (set by /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/.python-version) 00:23:52 lf-activate-venv(): INFO: Reuse venv:/tmp/venv-M6V1 from file:/tmp/.os_lf_venv 00:23:54 lf-activate-venv(): INFO: Installing: lftools 00:24:06 lf-activate-venv(): INFO: Adding /tmp/venv-M6V1/bin to PATH 00:24:06 [ric-plt-xapp-frame-py-pypi-verify-master] $ /bin/bash /tmp/jenkins14263495634903958681.sh 00:24:06 ---> sudo-logs.sh 00:24:06 Archiving 'sudo' log.. 00:24:06 [ric-plt-xapp-frame-py-pypi-verify-master] $ /bin/bash /tmp/jenkins1411964346143378366.sh 00:24:06 ---> job-cost.sh 00:24:06 Setup pyenv: 00:24:06 system 00:24:06 3.8.13 00:24:06 3.9.13 00:24:06 * 3.10.6 (set by /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/.python-version) 00:24:06 lf-activate-venv(): INFO: Reuse venv:/tmp/venv-M6V1 from file:/tmp/.os_lf_venv 00:24:08 lf-activate-venv(): INFO: Installing: zipp==1.1.0 python-openstackclient urllib3~=1.26.15 00:24:17 ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. 00:24:17 lftools 0.37.8 requires openstacksdk<1.5.0, but you have openstacksdk 2.0.0 which is incompatible. 00:24:17 lf-activate-venv(): INFO: Adding /tmp/venv-M6V1/bin to PATH 00:24:17 INFO: No Stack... 00:24:18 INFO: Retrieving Pricing Info for: v2-highcpu-2 00:24:18 INFO: Archiving Costs 00:24:18 [ric-plt-xapp-frame-py-pypi-verify-master] $ /bin/bash -l /tmp/jenkins11974723611909103221.sh 00:24:18 ---> logs-deploy.sh 00:24:18 Setup pyenv: 00:24:18 system 00:24:18 3.8.13 00:24:18 3.9.13 00:24:18 * 3.10.6 (set by /w/workspace/ric-plt-xapp-frame-py-pypi-verify-master/.python-version) 00:24:19 lf-activate-venv(): INFO: Reuse venv:/tmp/venv-M6V1 from file:/tmp/.os_lf_venv 00:24:21 lf-activate-venv(): INFO: Installing: lftools 00:24:34 ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. 00:24:34 python-openstackclient 6.4.0 requires openstacksdk>=2.0.0, but you have openstacksdk 1.4.0 which is incompatible. 00:24:34 lf-activate-venv(): INFO: Adding /tmp/venv-M6V1/bin to PATH 00:24:34 INFO: Nexus URL https://nexus.o-ran-sc.org path production/vex-sjc-oran-jenkins-prod-1/ric-plt-xapp-frame-py-pypi-verify-master/260 00:24:34 INFO: archiving workspace using pattern(s): 00:24:37 Archives upload complete. 00:24:37 INFO: archiving logs to Nexus 00:24:38 ---> uname -a: 00:24:38 Linux prd-ubuntu1804-builder-2c-2g-2145 5.4.0-146-generic #163-Ubuntu SMP Fri Mar 17 18:26:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux 00:24:38 00:24:38 00:24:38 ---> lscpu: 00:24:38 Architecture: x86_64 00:24:38 CPU op-mode(s): 32-bit, 64-bit 00:24:38 Byte Order: Little Endian 00:24:38 Address sizes: 40 bits physical, 48 bits virtual 00:24:38 CPU(s): 2 00:24:38 On-line CPU(s) list: 0,1 00:24:38 Thread(s) per core: 1 00:24:38 Core(s) per socket: 1 00:24:38 Socket(s): 2 00:24:38 NUMA node(s): 1 00:24:38 Vendor ID: AuthenticAMD 00:24:38 CPU family: 23 00:24:38 Model: 49 00:24:38 Model name: AMD EPYC-Rome Processor 00:24:38 Stepping: 0 00:24:38 CPU MHz: 2800.000 00:24:38 BogoMIPS: 5600.00 00:24:38 Virtualization: AMD-V 00:24:38 Hypervisor vendor: KVM 00:24:38 Virtualization type: full 00:24:38 L1d cache: 64 KiB 00:24:38 L1i cache: 64 KiB 00:24:38 L2 cache: 1 MiB 00:24:38 L3 cache: 32 MiB 00:24:38 NUMA node0 CPU(s): 0,1 00:24:38 Vulnerability Itlb multihit: Not affected 00:24:38 Vulnerability L1tf: Not affected 00:24:38 Vulnerability Mds: Not affected 00:24:38 Vulnerability Meltdown: Not affected 00:24:38 Vulnerability Mmio stale data: Not affected 00:24:38 Vulnerability Retbleed: Vulnerable 00:24:38 Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp 00:24:38 Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization 00:24:38 Vulnerability Spectre v2: Mitigation; Retpolines, IBPB conditional, IBRS_FW, STIBP disabled, RSB filling, PBRSB-eIBRS Not affected 00:24:38 Vulnerability Srbds: Not affected 00:24:38 Vulnerability Tsx async abort: Not affected 00:24:38 Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves clzero xsaveerptr wbnoinvd arat npt nrip_save umip rdpid arch_capabilities 00:24:38 00:24:38 00:24:38 ---> nproc: 00:24:38 2 00:24:38 00:24:38 00:24:39 ---> df -h: 00:24:39 Filesystem Size Used Avail Use% Mounted on 00:24:39 udev 975M 0 975M 0% /dev 00:24:39 tmpfs 199M 1016K 198M 1% /run 00:24:39 /dev/vda1 20G 8.5G 11G 45% / 00:24:39 tmpfs 992M 0 992M 0% /dev/shm 00:24:39 tmpfs 5.0M 0 5.0M 0% /run/lock 00:24:39 tmpfs 992M 0 992M 0% /sys/fs/cgroup 00:24:39 /dev/loop0 62M 62M 0 100% /snap/core20/1405 00:24:39 /dev/loop1 68M 68M 0 100% /snap/lxd/22753 00:24:39 /dev/loop2 44M 44M 0 100% /snap/snapd/15177 00:24:39 /dev/vda15 105M 6.1M 99M 6% /boot/efi 00:24:39 tmpfs 199M 0 199M 0% /run/user/1001 00:24:39 /dev/loop3 41M 41M 0 100% /snap/snapd/20290 00:24:39 /dev/loop4 92M 92M 0 100% /snap/lxd/24061 00:24:39 00:24:39 00:24:39 ---> free -m: 00:24:39 total used free shared buff/cache available 00:24:39 Mem: 1983 404 166 2 1411 1384 00:24:39 Swap: 1023 0 1023 00:24:39 00:24:39 00:24:39 ---> ip addr: 00:24:39 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 00:24:39 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 00:24:39 inet 127.0.0.1/8 scope host lo 00:24:39 valid_lft forever preferred_lft forever 00:24:39 inet6 ::1/128 scope host 00:24:39 valid_lft forever preferred_lft forever 00:24:39 2: ens3: mtu 1450 qdisc fq_codel state UP group default qlen 1000 00:24:39 link/ether fa:16:3e:39:ca:87 brd ff:ff:ff:ff:ff:ff 00:24:39 inet 10.32.6.101/23 brd 10.32.7.255 scope global dynamic ens3 00:24:39 valid_lft 86063sec preferred_lft 86063sec 00:24:39 inet6 fe80::f816:3eff:fe39:ca87/64 scope link 00:24:39 valid_lft forever preferred_lft forever 00:24:39 00:24:39 00:24:39 ---> sar -b -r -n DEV: 00:24:39 Linux 5.4.0-146-generic (prd-ubuntu1804-builder-2c-2g-2145) 12/28/23 _x86_64_ (2 CPU) 00:24:39 00:24:39 00:19:05 LINUX RESTART (2 CPU) 00:24:39 00:24:39 00:20:00 tps rtps wtps dtps bread/s bwrtn/s bdscd/s 00:24:39 00:21:02 128.17 42.26 85.91 0.00 1549.13 14151.69 0.00 00:24:39 00:22:01 86.94 28.28 58.66 0.00 893.66 7580.89 0.00 00:24:39 00:23:01 2.13 0.08 2.05 0.00 3.07 137.44 0.00 00:24:39 00:24:01 21.26 5.47 15.80 0.00 489.65 850.79 0.00 00:24:39 Average: 59.80 19.08 40.72 0.00 736.65 5708.01 0.00 00:24:39 00:24:39 00:20:00 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty 00:24:39 00:21:02 133592 1467312 328296 16.17 64908 1340948 808916 26.27 408360 1283032 94932 00:24:39 00:22:01 97592 1417096 377588 18.59 70392 1310416 1036916 33.67 493192 1220380 3012 00:24:39 00:23:01 91948 1411788 382996 18.86 70448 1310496 1073680 34.87 499652 1220516 92 00:24:39 00:24:01 128220 1431376 363164 17.88 73048 1288224 851456 27.65 485148 1197156 58936 00:24:39 Average: 112838 1431893 363011 17.88 69699 1312521 942742 30.62 471588 1230271 39243 00:24:39 00:24:39 00:20:00 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 00:24:39 00:21:02 lo 0.52 0.52 0.05 0.05 0.00 0.00 0.00 0.00 00:24:39 00:21:02 ens3 44.54 41.38 568.42 5.94 0.00 0.00 0.00 0.00 00:24:39 00:22:01 lo 2.58 2.58 0.29 0.29 0.00 0.00 0.00 0.00 00:24:39 00:22:01 ens3 26.43 26.06 82.59 4.46 0.00 0.00 0.00 0.00 00:24:39 00:23:01 lo 1.60 1.60 0.15 0.15 0.00 0.00 0.00 0.00 00:24:39 00:23:01 ens3 1.70 1.70 0.18 0.18 0.00 0.00 0.00 0.00 00:24:39 00:24:01 lo 3.88 3.88 0.53 0.53 0.00 0.00 0.00 0.00 00:24:39 00:24:01 ens3 17.25 16.40 12.84 8.15 0.00 0.00 0.00 0.00 00:24:39 Average: lo 2.14 2.14 0.26 0.26 0.00 0.00 0.00 0.00 00:24:39 Average: ens3 22.56 21.45 168.05 4.69 0.00 0.00 0.00 0.00 00:24:39 00:24:39 00:24:39 ---> sar -P ALL: 00:24:39 Linux 5.4.0-146-generic (prd-ubuntu1804-builder-2c-2g-2145) 12/28/23 _x86_64_ (2 CPU) 00:24:39 00:24:39 00:19:05 LINUX RESTART (2 CPU) 00:24:39 00:24:39 00:20:00 CPU %user %nice %system %iowait %steal %idle 00:24:39 00:21:02 all 38.80 7.53 8.23 7.03 0.15 38.27 00:24:39 00:21:02 0 50.44 6.34 8.21 5.78 0.16 29.07 00:24:39 00:21:02 1 27.08 8.73 8.25 8.29 0.13 47.52 00:24:39 00:22:01 all 19.41 0.00 2.18 6.14 0.12 72.15 00:24:39 00:22:01 0 16.25 0.00 2.34 7.96 0.12 73.33 00:24:39 00:22:01 1 22.60 0.00 2.02 4.30 0.12 70.96 00:24:39 00:23:01 all 1.87 0.00 0.22 0.04 0.06 97.81 00:24:39 00:23:01 0 2.86 0.00 0.17 0.02 0.05 96.90 00:24:39 00:23:01 1 0.87 0.00 0.27 0.07 0.07 98.73 00:24:39 00:24:01 all 21.17 0.00 1.47 1.33 0.09 75.94 00:24:39 00:24:01 0 25.35 0.00 1.52 0.71 0.10 72.33 00:24:39 00:24:01 1 16.95 0.00 1.42 1.97 0.08 79.58 00:24:39 Average: all 20.37 1.90 3.04 3.63 0.10 70.95 00:24:39 Average: 0 23.82 1.60 3.07 3.60 0.11 67.81 00:24:39 Average: 1 16.89 2.21 3.01 3.67 0.10 74.12 00:24:39 00:24:39 00:24:39