Please note that it also updates python to 3.12.
Change-Id: I715194304b37b9cd52affa998a94ba5ec52e7732
Signed-off-by: Cédric Ollivier <cedric.ollivier@orange.com>
 # add these directories to sys.path here. If the directory is relative to the
 # documentation root, use os.path.abspath to make it absolute, like shown here.
 #
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
+import os
+import sys
+sys.path.insert(0, os.path.abspath('..'))
 
 # -- General configuration ------------------------------------------------
 
 
-FROM alpine:3.17
+FROM alpine:3.20
 
 ARG BRANCH=master
 ARG OPENSTACK_TAG=master
     wget -q -O- https://opendev.org/openstack/requirements/raw/branch/$OPENSTACK_TAG/upper-constraints.txt > upper-constraints.txt && \
     sed -i -E /^packaging==+.*$/d upper-constraints.txt && \
     case $(uname -m) in aarch*|arm*) CFLAGS="-O0" \
-        pip3 install --no-cache-dir \
+        pip3 install --break-system-packages --no-cache-dir \
             -cupper-constraints.txt \
             -chttps://git.opnfv.org/functest-xtesting/plain/upper-constraints.txt?h=$BRANCH \
             lxml ;; esac && \
     (cd /src/functest-xtesting && \
         git fetch --tags https://gerrit.opnfv.org/gerrit/functest-xtesting $BRANCH && \
         git checkout FETCH_HEAD) && \
-    pip3 install --no-cache-dir --src /src \
+    pip3 install --break-system-packages --no-cache-dir --src /src \
         -cupper-constraints.txt \
         -chttps://git.opnfv.org/functest-xtesting/plain/upper-constraints.txt?h=$BRANCH \
         /src/functest-xtesting && \
     addgroup -g 1000 xtesting && adduser -u 1000 -G xtesting -D xtesting && \
     mkdir -p /var/lib/xtesting/results && chown -R xtesting: /var/lib/xtesting && \
     apk del .build-deps
-COPY testcases.yaml /usr/lib/python3.10/site-packages/xtesting/ci/testcases.yaml
+COPY testcases.yaml /usr/lib/python3.12/site-packages/xtesting/ci/testcases.yaml
 USER xtesting
 WORKDIR /var/lib/xtesting/results
 CMD ["run_tests", "-t", "all"]
 
           args:
             suites:
               - >-
-                /usr/lib/python3.10/site-packages/xtesting/samples/HelloWorld.robot
+                /usr/lib/python3.12/site-packages/xtesting/samples/HelloWorld.robot
             variable:
               - 'var01:foo'
               - 'var02:bar'
           name: behaveframework
           args:
             suites:
-              - /usr/lib/python3.10/site-packages/xtesting/samples/features
+              - /usr/lib/python3.12/site-packages/xtesting/samples/features
             tags:
               - foo
       - case_name: eighth
         run:
           name: ansible
           args:
-            private_data_dir: /usr/lib/python3.10/site-packages/xtesting/samples
+            private_data_dir: /usr/lib/python3.12/site-packages/xtesting/samples
             playbook: helloworld.yml
       - case_name: nineth
         project_name: xtesting
         run:
           name: pytest
           args:
-            dir: /usr/lib/python3.10/site-packages/xtesting/samples/fourth.py
+            dir: /usr/lib/python3.12/site-packages/xtesting/samples/fourth.py
 
 [tox]
-envlist = docs,pep8,pylint,yamllint,bashate,py310,cover,perm,pre-commit
+envlist = docs,pep8,pylint,yamllint,bashate,py312,cover,perm,pre-commit
 skipsdist = True
 
 [testenv]
     xtesting/tests/unit
 
 [testenv:docs]
-basepython = python3.10
+basepython = python3.12
 commands =
   doc8 README.rst api --ignore-path api/build
   sphinx-build -W -b html api/ api/build
 
 [testenv:pep8]
-basepython = python3.10
+basepython = python3.12
 commands = flake8
 
 [testenv:pylint]
-basepython = python3.10
+basepython = python3.12
 allowlist_externals = bash
 commands =
   pylint --min-similarity-lines=10 \
     --disable=locally-disabled --ignore-imports=y --reports=n --extension-pkg-whitelist=lxml xtesting
 
 [testenv:yamllint]
-basepython = python3.10
-files =
-  .travis.yml
-  ansible
-  xtesting/ci
+basepython = python3.12
+files = .travis.yml ansible xtesting/ci
 commands =
   yamllint -s {[testenv:yamllint]files}
 
 [testenv:bashate]
-basepython = python3.10
+basepython = python3.12
 files =
   build.sh
 commands = bashate {[testenv:bashate]files}
 
 [testenv:bandit]
-basepython = python3.10
+basepython = python3.12
 commands = bandit -r xtesting -x tests -n 5 -ll -s B602
 
 [testenv:cover]
-basepython = python3.10
-dirs =
-  xtesting/tests/unit/ci
-  xtesting/tests/unit/core
-  xtesting/tests/unit/utils/test_decorators.py
+basepython = python3.12
+dirs = xtesting/tests/unit/ci xtesting/tests/unit/core xtesting/tests/unit/utils/test_decorators.py
 commands =
   pytest --cov=xtesting --cov-reset --cov-report html --cov-fail-under=100 \
     {[testenv:cover]dirs}
 
 [testenv:perm]
-basepython = python3.10
+basepython = python3.12
 allowlist_externals = bash
-path=. -not -path './.tox/*' -not -path './.git/*' -not -path './doc/reveal.js/*' -not -path './elements/xtesting/install.d/*'
+path=. -prune -not -path './.tox' -not -path './.git' -not -path './doc/reveal.js' \
+  -not -path './elements/xtesting/install.d' -not -name '*.pyc' -not -name '__pycache__' \
+  -not -path './doc/api/build'
 commands =
   bash -c "\
     find {[testenv:perm]path} \( -type f -not -perm 644 -o -type d -not -perm 755 \) \
     find {[testenv:perm]path} -exec file \{\} + | grep CRLF && exit 1 || exit 0"
 
 [testenv:pre-commit]
-basepython = python3.10
+basepython = python3.12
 commands =
     pre-commit run --all-files --show-diff-on-failure
 
-robotframework===4.1.2
-bandit===1.7.0
+robotframework===6.1.1
+bandit===1.7.9
 behave===1.2.6
-behave-html-formatter===0.9.8
-pylint===2.17.6
-flake8===4.0.1
-ansible-lint===5.2.1
-pre-commit===3.1.1
-astroid===2.15.8
+behave-html-formatter===0.9.10
+pylint===3.2.7
+flake8===7.1.1
+ansible-lint===24.7.0
+pre-commit===3.8.0
+astroid===3.2.4
+sphinx-rtd-theme==3.0.0rc1
 
                     if test_case.is_skipped:
                         result = 'SKIP'
                     else:
-                        result = 'PASS' if(test_case.is_successful(
+                        result = 'PASS' if (test_case.is_successful(
                             ) == test_case.EX_OK) else 'FAIL'
                     msg.add_row(
                         [test_case.case_name, test_case.project_name,
 
           args:
             suites:
               - >-
-                /usr/lib/python3.10/site-packages/xtesting/samples/HelloWorld.robot
+                /usr/lib/python3.12/site-packages/xtesting/samples/HelloWorld.robot
             variable:
               - 'var01:foo'
               - 'var02:bar'
           name: behaveframework
           args:
             suites:
-              - /usr/lib/python3.10/site-packages/xtesting/samples/features
+              - /usr/lib/python3.12/site-packages/xtesting/samples/features
             tags:
               - foo
       - case_name: eighth
         run:
           name: ansible
           args:
-            private_data_dir: /usr/lib/python3.10/site-packages/xtesting/samples
+            private_data_dir: /usr/lib/python3.12/site-packages/xtesting/samples
             playbook: helloworld.yml
       - case_name: nineth
         project_name: xtesting
         run:
           name: pytest
           args:
-            dir: /usr/lib/python3.10/site-packages/xtesting/samples/fourth.py
+            dir: /usr/lib/python3.12/site-packages/xtesting/samples/fourth.py
 
             if self.is_skipped:
                 result = 'SKIP'
             else:
-                result = 'PASS' if(self.is_successful(
+                result = 'PASS' if (self.is_successful(
                     ) == TestCase.EX_OK) else 'FAIL'
             msg = prettytable.PrettyTable(
                 header_style='upper', padding_width=5,
             assert self.stop_time
             if self.stop_time < self.start_time:
                 return "XX:XX"
-            return(
+            return (
                 f"{str(int(self.stop_time - self.start_time) // 60).zfill(2)}:"
                 f"{str(int(self.stop_time - self.start_time) % 60).zfill(2)}")
 
 
             pass
         envfile = 'rc_file'
         with mock.patch('builtins.open',
-                        mock.mock_open(read_data=msg)) as mock_method,\
+                        mock.mock_open(read_data=msg)) as mock_method, \
                 mock.patch('os.path.isfile', return_value=True):
             mock_method.return_value.__iter__ = lambda self: iter(
                 self.readline, '')
 
             mock_method.assert_called_with()
 
     def test_run_deploy_vnf_exc(self):
-        with mock.patch.object(self.test, 'prepare'),\
+        with mock.patch.object(self.test, 'prepare'), \
             mock.patch.object(self.test, 'deploy_orchestrator',
                               return_value=True), \
             mock.patch.object(self.test, 'deploy_vnf',
             mock_method.assert_called_with()
 
     def test_run_test_vnf_exc(self):
-        with mock.patch.object(self.test, 'prepare'),\
+        with mock.patch.object(self.test, 'prepare'), \
             mock.patch.object(self.test, 'deploy_orchestrator',
                               return_value=True), \
             mock.patch.object(self.test, 'deploy_vnf', return_value=True), \
             mock_method.assert_called_with()
 
     def test_run_deploy_orch_ko(self):
-        with mock.patch.object(self.test, 'prepare'),\
+        with mock.patch.object(self.test, 'prepare'), \
                 mock.patch.object(self.test, 'deploy_orchestrator',
                                   return_value=False), \
                 mock.patch.object(self.test, 'deploy_vnf',
                              testcase.TestCase.EX_TESTCASE_FAILED)
 
     def test_run_vnf_deploy_ko(self):
-        with mock.patch.object(self.test, 'prepare'),\
+        with mock.patch.object(self.test, 'prepare'), \
                 mock.patch.object(self.test, 'deploy_orchestrator',
                                   return_value=True), \
                 mock.patch.object(self.test, 'deploy_vnf',
                              testcase.TestCase.EX_TESTCASE_FAILED)
 
     def test_run_vnf_test_ko(self):
-        with mock.patch.object(self.test, 'prepare'),\
+        with mock.patch.object(self.test, 'prepare'), \
                 mock.patch.object(self.test, 'deploy_orchestrator',
                                   return_value=True), \
                 mock.patch.object(self.test, 'deploy_vnf',
                              testcase.TestCase.EX_TESTCASE_FAILED)
 
     def test_run_default(self):
-        with mock.patch.object(self.test, 'prepare'),\
+        with mock.patch.object(self.test, 'prepare'), \
                 mock.patch.object(self.test, 'deploy_orchestrator',
                                   return_value=True), \
                 mock.patch.object(self.test, 'deploy_vnf',