docs: install_deps> python -I -m pip install -r docs/requirements.txt docs: freeze> python -m pip freeze --all docs: alabaster==1.0.0,attrs==26.1.0,babel==2.18.0,certifi==2026.10.19,charset-normalizer==3.5.2,contourpy==1.3.3,cycler==0.12.1,deepmerge==3.0.1,docutils==0.22.4,elastic-transport==8.19.0,elasticsearch==8.19.3,elasticsearch-dsl==8.15.4,fonttools==4.67.0,idna==3.20,imagesize==2.0.1,Jinja2==3.1.6,jsonschema==4.26.0,jsonschema-specifications==2025.9.1,jsonschema_rs==0.58.6,kiwisolver==1.5.1,lfdocs_conf==0.11.0,MarkupSafe==3.0.4,matplotlib==3.11.2,minijinja==2.24.0,mistune==3.4.0,numpy==2.4.6,packaging==26.3,picobox==4.0.0,pillow==13.0.0,pip==26.2.2,Pygments==2.21.0,pyparsing==3.3.3,python-dateutil==2.9.0.post0,PyYAML==6.0.3,referencing==0.37.0,requests==2.34.2,requests-file==3.0.1,robotframework==7.5,roman-numerals==4.1.0,rpds-py==2026.9.1,setuptools==84.2.1,six==1.17.0,snowballstemmer==3.1.1,Sphinx==9.0.4,sphinx-data-viewer==0.1.5,sphinx-needs==9.0.0,sphinx-tabs==3.5.0,sphinx_mdinclude==0.6.2,sphinx_rtd_theme==3.1.0,sphinxcontrib-applehelp==2.0.0,sphinxcontrib-devhelp==2.0.0,sphinxcontrib-htmlhelp==2.1.0,sphinxcontrib-httpdomain==2.2.1,sphinxcontrib-jquery==4.1,sphinxcontrib-jsmath==2.0.0,sphinxcontrib-mermaid==2.1.1,sphinxcontrib-openapi==0.10.0,sphinxcontrib-plantuml==0.31,sphinxcontrib-qthelp==2.0.0,sphinxcontrib-serializinghtml==2.0.0,typing_extensions==4.16.0,ub-project==1.1.0,urllib3==2.8.0 docs: commands[0]> sphinx-build -W -n -b html -d /w/workspace/integration-test-tox-verify-master/.tox/docs/tmp/doctrees ./docs/ /w/workspace/integration-test-tox-verify-master/docs/_build/html Running Sphinx v9.0.4 /w/workspace/integration-test-tox-verify-master/csit/libraries /w/workspace/integration-test-tox-verify-master/docs /w/workspace/integration-test-tox-verify-master/docs/_static/integration/robot /w/workspace/integration-test-tox-verify-master/csit/libraries /w/workspace/integration-test-tox-verify-master/docs /w/workspace/integration-test-tox-verify-master/csit/libraries /w/workspace/integration-test-tox-verify-master/docs /w/workspace/integration-test-tox-verify-master/docs/_build/robot /w/workspace/integration-test-tox-verify-master/csit/libraries /w/workspace/integration-test-tox-verify-master/docs /w/workspace/integration-test-tox-verify-master/csit/libraries /w/workspace/integration-test-tox-verify-master/docs /w/workspace/integration-test-tox-verify-master/docs/_build/robot/YangCollection.robot.html /w/workspace/integration-test-tox-verify-master/docs/_build/robot/WorkflowsL2switch.robot.html /w/workspace/integration-test-tox-verify-master/docs/_build/robot/AAAJsonUtils.py.html /w/workspace/integration-test-tox-verify-master/docs/_build/robot/MdsalLowlevelPy.py.html /w/workspace/integration-test-tox-verify-master/docs/_build/robot/BGPcliKeywords.robot.html Importing library '/w/workspace/integration-test-tox-verify-master/csit/libraries/MininetTopo/topo-3sw-2host_multipath.py' failed: ModuleNotFoundError: No module named 'mininet' Traceback (most recent call last): File "/w/workspace/integration-test-tox-verify-master/csit/libraries/MininetTopo/topo-3sw-2host_multipath.py", line 11, in from mininet.topo import Topo PYTHONPATH: /w/workspace/integration-test-tox-verify-master/csit/libraries/MininetTopo /w/workspace/integration-test-tox-verify-master/csit/libraries /opt/pyenv/versions/3.11.10/lib/python311.zip /opt/pyenv/versions/3.11.10/lib/python3.11 /opt/pyenv/versions/3.11.10/lib/python3.11/lib-dynload /w/workspace/integration-test-tox-verify-master/.tox/docs/lib/python3.11/site-packages Try --help for usage information. /w/workspace/integration-test-tox-verify-master/docs /w/workspace/integration-test-tox-verify-master/docs/_build/robot /w/workspace/integration-test-tox-verify-master/docs /w/workspace/integration-test-tox-verify-master/docs loading translations [en]... done making output directory... done Converting `source_suffix = '.rst'` to `source_suffix = {'.rst': 'restructuredtext'}`. loading intersphinx inventory 'common-packer' from https://docs.releng.linuxfoundation.org/projects/common-packer/en/stable/objects.inv ... loading intersphinx inventory 'global-jjb' from https://docs.releng.linuxfoundation.org/projects/global-jjb/en/stable/objects.inv ... loading intersphinx inventory 'lfdocs' from https://docs.releng.linuxfoundation.org/en/latest/objects.inv ... loading intersphinx inventory 'lfdocs-conf' from https://docs.releng.linuxfoundation.org/projects/lfdocs-conf/en/stable/objects.inv ... loading intersphinx inventory 'lftools' from https://docs.releng.linuxfoundation.org/projects/lftools/en/stable/objects.inv ... loading intersphinx inventory 'pipelines' from https://docs.releng.linuxfoundation.org/projects/pipelines/en/latest/objects.inv ... loading intersphinx inventory 'python' from https://docs.python.org/3/objects.inv ... loading intersphinx inventory 'odl-releng-builder' from http://docs.opendaylight.org/projects/releng-builder/en/latest/objects.inv ... intersphinx inventory has moved: http://docs.opendaylight.org/projects/releng-builder/en/latest/objects.inv -> https://docs.opendaylight.org/projects/releng-builder/en/latest/objects.inv building [mo]: targets for 0 po files that are out of date writing output... building [html]: targets for 12 source files that are out of date updating environment: [new config] 12 added, 0 changed, 0 removed reading sources... [ 8%] cluster/carbon/caveats reading sources... [ 17%] cluster/carbon/index reading sources... [ 25%] cluster/carbon/release reading sources... [ 33%] cluster/carbon/sandbox reading sources... [ 42%] cluster/carbon/scenarios reading sources... [ 50%] cluster/carbon/sr1 reading sources... [ 58%] cluster/carbon/sr2 reading sources... [ 67%] cluster/carbon/tests reading sources... [ 75%] cluster/index reading sources... [ 83%] index reading sources... [ 92%] run-test-locally reading sources... [100%] system-test-guide looking for now-outdated files... none found pickling environment... done checking consistency... done preparing documents... done copying assets... copying static files... Writing evaluated template result to /w/workspace/integration-test-tox-verify-master/docs/_build/html/_static/basic.css Writing evaluated template result to /w/workspace/integration-test-tox-verify-master/docs/_build/html/_static/language_data.js Writing evaluated template result to /w/workspace/integration-test-tox-verify-master/docs/_build/html/_static/documentation_options.js Writing evaluated template result to /w/workspace/integration-test-tox-verify-master/docs/_build/html/_static/js/versions.js copying static files: done copying extra files... copying extra files: done copying assets: done writing output... [ 8%] cluster/carbon/caveats writing output... [ 17%] cluster/carbon/index writing output... [ 25%] cluster/carbon/release writing output... [ 33%] cluster/carbon/sandbox writing output... [ 42%] cluster/carbon/scenarios writing output... [ 50%] cluster/carbon/sr1 writing output... [ 58%] cluster/carbon/sr2 writing output... [ 67%] cluster/carbon/tests writing output... [ 75%] cluster/index writing output... [ 83%] index writing output... [ 92%] run-test-locally writing output... [100%] system-test-guide generating indices... genindex done highlighting module code... writing additional pages... search done dumping search index in English (code: en)... done dumping object inventory... done build succeeded. The HTML pages are in docs/_build/html. docs: OK ✔ in 30.15 seconds pre-commit: install_deps> python -I -m pip install pre-commit pre-commit: freeze> python -m pip freeze --all pre-commit: cfgv==3.5.0,distlib==0.4.4,filelock==4.2.4,identify==2.6.20,nodeenv==1.11.0,packaging==26.3,pip==26.2.2,platformdirs==4.13.5,pre_commit==4.7.0,python-discovery==1.6.4,PyYAML==6.0.3,setuptools==84.2.1,virtualenv==21.14.12 pre-commit: commands[0]> pre-commit run --all-files --show-diff-on-failure [INFO] Initializing environment for https://github.com/pre-commit/pre-commit-hooks. [WARNING] repo `https://github.com/pre-commit/pre-commit-hooks` uses deprecated stage names (commit, push) which will be removed in a future version. Hint: often `pre-commit autoupdate --repo https://github.com/pre-commit/pre-commit-hooks` will fix this. if it does not -- consider reporting an issue to that repo. [INFO] Initializing environment for https://github.com/PyCQA/flake8. [INFO] Initializing environment for https://github.com/psf/black. [INFO] Initializing environment for https://github.com/MarketSquare/robotframework-tidy. [INFO] Initializing environment for https://github.com/MarketSquare/robotframework-tidy:robotframework==6.1.1. [INFO] Initializing environment for https://github.com/jorisroovers/gitlint. [INFO] Initializing environment for https://github.com/jorisroovers/gitlint:./gitlint-core[trusted-deps]. [INFO] Initializing environment for local:rstcheck,sphinx. [INFO] Installing environment for https://github.com/pre-commit/pre-commit-hooks. [INFO] Once installed this environment will be reused. [INFO] This may take a few minutes... [INFO] Installing environment for https://github.com/PyCQA/flake8. [INFO] Once installed this environment will be reused. [INFO] This may take a few minutes... [INFO] Installing environment for https://github.com/psf/black. [INFO] Once installed this environment will be reused. [INFO] This may take a few minutes... [INFO] Installing environment for https://github.com/MarketSquare/robotframework-tidy. [INFO] Once installed this environment will be reused. [INFO] This may take a few minutes... [INFO] Installing environment for local. [INFO] Once installed this environment will be reused. [INFO] This may take a few minutes... trim trailing whitespace.................................................Passed flake8...................................................................Failed - hook id: flake8 - exit code: 1 tools/fastbgp/play2.py:2747:28: W292 no newline at end of file threaded_job(arguments) ^ tools/fastbgp/play3.py:2680:28: W292 no newline at end of file threaded_job(arguments) ^ black....................................................................Failed - hook id: black - files were modified by this hook reformatted tools/fastbgp/play2.py reformatted tools/fastbgp/play3.py All done! ✨ 🍰 ✨ 2 files reformatted, 105 files left unchanged. robotidy.................................................................Passed rstcheck.................................................................Passed pre-commit hook(s) made changes. If you are seeing this message in CI, reproduce locally with: `pre-commit run --all-files`. To run `pre-commit` as part of git workflow, use `pre-commit install`. All changes made by hooks: diff --git a/tools/fastbgp/play2.py b/tools/fastbgp/play2.py index ca7dfd28..60a23a67 100755 --- a/tools/fastbgp/play2.py +++ b/tools/fastbgp/play2.py @@ -179,7 +179,9 @@ def parse_arguments(): str_help = "Link-State NLRI supported" parser.add_argument("--bgpls", default=False, type=bool, help=str_help) str_help = "Link-State NLRI: Identifier" - parser.add_argument("-lsid", "--lsid", dest="lsid", default=1, type=int, help=str_help) + parser.add_argument( + "-lsid", "--lsid", dest="lsid", default=1, type=int, help=str_help + ) str_help = "Link-State NLRI: Policy Color" parser.add_argument( "--color", "-lstid", dest="color", default=100, type=int, help=str_help @@ -835,12 +837,8 @@ class MessageGenerator(object): Returns: :return: dictionary of LS NLRI parameters and values """ - identifier = self.ls_nlri_default["Identifier"] + int( - index / self.lsid_step - ) - color = self.ls_nlri_default["Color"] + int( - index / self.color_step - ) + identifier = self.ls_nlri_default["Identifier"] + int(index / self.lsid_step) + color = self.ls_nlri_default["Color"] + int(index / self.color_step) discriminator = self.ls_nlri_default["Discriminator"] + int( index / self.discriminator_step ) @@ -1492,14 +1490,22 @@ class MessageGenerator(object): # SR Policy Candidate Path Descriptor TLV (TLV 554) - RFC 9857 Section 4 tlv_554_val = ( - struct.pack("B", int(ls_nlri["ProtocolOrigin"])) # 1 octet: Protocol-Origin + struct.pack( + "B", int(ls_nlri["ProtocolOrigin"]) + ) # 1 octet: Protocol-Origin + b"\x00" # 1 octet: Flags (E=0, O=0 for IPv4) + b"\x00\x00" # 2 octets: Reserved + struct.pack(">I", int(ls_nlri["Endpoint"])) # 4 octets: Endpoint + struct.pack(">I", int(ls_nlri["Color"])) # 4 octets: Policy Color - + struct.pack(">I", int(ls_nlri["OriginatorASN"])) # 4 octets: Originator ASN - + struct.pack(">I", int(ls_nlri["OriginatorAddress"])) # 4 octets: Originator Address - + struct.pack(">I", int(ls_nlri["Discriminator"])) # 4 octets: Discriminator + + struct.pack( + ">I", int(ls_nlri["OriginatorASN"]) + ) # 4 octets: Originator ASN + + struct.pack( + ">I", int(ls_nlri["OriginatorAddress"]) + ) # 4 octets: Originator Address + + struct.pack( + ">I", int(ls_nlri["Discriminator"]) + ) # 4 octets: Discriminator ) tlv_554 = struct.pack(">HH", 554, len(tlv_554_val)) + tlv_554_val @@ -2744,4 +2750,4 @@ def threaded_job(arguments): if __name__ == "__main__": arguments = parse_arguments() logger = create_logger(arguments.loglevel, arguments.logfile) - threaded_job(arguments) \ No newline at end of file + threaded_job(arguments) diff --git a/tools/fastbgp/play3.py b/tools/fastbgp/play3.py index 234e62a5..8a9edcad 100755 --- a/tools/fastbgp/play3.py +++ b/tools/fastbgp/play3.py @@ -179,7 +179,9 @@ def parse_arguments(): str_help = "Link-State NLRI supported" parser.add_argument("--bgpls", default=False, type=bool, help=str_help) str_help = "Link-State NLRI: Identifier" - parser.add_argument("-lsid", "--lsid", dest="lsid", default=1, type=int, help=str_help) + parser.add_argument( + "-lsid", "--lsid", dest="lsid", default=1, type=int, help=str_help + ) str_help = "Link-State NLRI: Policy Color" parser.add_argument( "--color", "-lstid", dest="color", default=100, type=int, help=str_help @@ -920,18 +922,16 @@ class MessageGenerator(object): """ if self.nlri_type == 6: identifier = self.base_identifier + int(index / self.lsid_step) - sid = ipaddr.IPv6Address(int(self.base_sid) + int(index / self.srv6_sid_step)) + sid = ipaddr.IPv6Address( + int(self.base_sid) + int(index / self.srv6_sid_step) + ) srv6_nlri_values = self.srv6_nlri_default.copy() srv6_nlri_values["Identifier"] = identifier srv6_nlri_values["SID"] = sid return srv6_nlri_values - identifier = self.ls_nlri_default["Identifier"] + int( - index / self.lsid_step - ) - color = self.ls_nlri_default["Color"] + int( - index / self.color_step - ) + identifier = self.ls_nlri_default["Identifier"] + int(index / self.lsid_step) + color = self.ls_nlri_default["Color"] + int(index / self.color_step) discriminator = self.ls_nlri_default["Discriminator"] + int( index / self.discriminator_step ) @@ -1139,151 +1139,72 @@ class MessageGenerator(object): optional_parameters_hex = b"" if self.rfc4760 or self.allf: optional_parameter_hex = ( - b"\x02" - b"\x06" - b"\x01" - b"\x04" - b"\x00\x01" - b"\x00" - b"\x01" + b"\x02" b"\x06" b"\x01" b"\x04" b"\x00\x01" b"\x00" b"\x01" ) optional_parameters_hex += optional_parameter_hex if self.ipv6 or self.allf: optional_parameter_hex = ( - b"\x02" - b"\x06" - b"\x01" - b"\x04" - b"\x00\x02" - b"\x00" - b"\x01" + b"\x02" b"\x06" b"\x01" b"\x04" b"\x00\x02" b"\x00" b"\x01" ) optional_parameters_hex += optional_parameter_hex if self.bgpls or self.allf: optional_parameter_hex = ( - b"\x02" - b"\x06" - b"\x01" - b"\x04" - b"\x40\x04" - b"\x00" - b"\x47" + b"\x02" b"\x06" b"\x01" b"\x04" b"\x40\x04" b"\x00" b"\x47" ) optional_parameters_hex += optional_parameter_hex if self.evpn or self.allf: optional_parameter_hex = ( - b"\x02" - b"\x06" - b"\x01" - b"\x04" - b"\x00\x19" - b"\x00" - b"\x46" + b"\x02" b"\x06" b"\x01" b"\x04" b"\x00\x19" b"\x00" b"\x46" ) optional_parameters_hex += optional_parameter_hex if self.mvpn or self.allf: optional_parameter_hex = ( - b"\x02" - b"\x06" - b"\x01" - b"\x04" - b"\x00\x01" - b"\x00" - b"\x05" + b"\x02" b"\x06" b"\x01" b"\x04" b"\x00\x01" b"\x00" b"\x05" ) optional_parameters_hex += optional_parameter_hex optional_parameter_hex = ( - b"\x02" - b"\x06" - b"\x01" - b"\x04" - b"\x00\x02" - b"\x00" - b"\x05" + b"\x02" b"\x06" b"\x01" b"\x04" b"\x00\x02" b"\x00" b"\x05" ) optional_parameters_hex += optional_parameter_hex if self.l3vpn_mcast or self.allf: optional_parameter_hex = ( - b"\x02" - b"\x06" - b"\x01" - b"\x04" - b"\x00\x01" - b"\x00" - b"\x81" + b"\x02" b"\x06" b"\x01" b"\x04" b"\x00\x01" b"\x00" b"\x81" ) optional_parameters_hex += optional_parameter_hex optional_parameter_hex = ( - b"\x02" - b"\x06" - b"\x01" - b"\x04" - b"\x00\x02" - b"\x00" - b"\x81" + b"\x02" b"\x06" b"\x01" b"\x04" b"\x00\x02" b"\x00" b"\x81" ) optional_parameters_hex += optional_parameter_hex if self.l3vpn or self.allf: optional_parameter_hex = ( - b"\x02" - b"\x06" - b"\x01" - b"\x04" - b"\x00\x01" - b"\x00" - b"\x80" + b"\x02" b"\x06" b"\x01" b"\x04" b"\x00\x01" b"\x00" b"\x80" ) optional_parameters_hex += optional_parameter_hex optional_parameter_hex = ( - b"\x02" - b"\x06" - b"\x01" - b"\x04" - b"\x00\x02" - b"\x00" - b"\x80" + b"\x02" b"\x06" b"\x01" b"\x04" b"\x00\x02" b"\x00" b"\x80" ) optional_parameters_hex += optional_parameter_hex if self.rt_constrain or self.allf: optional_parameter_hex = ( - b"\x02" - b"\x06" - b"\x01" - b"\x04" - b"\x00\x01" - b"\x00" - b"\x84" + b"\x02" b"\x06" b"\x01" b"\x04" b"\x00\x01" b"\x00" b"\x84" ) optional_parameters_hex += optional_parameter_hex if self.bgplu or self.allf: optional_parameter_hex = ( - b"\x02" - b"\x06" - b"\x01" - b"\x04" - b"\x00\x01" - b"\x00" - b"\x04" + b"\x02" b"\x06" b"\x01" b"\x04" b"\x00\x01" b"\x00" b"\x04" ) optional_parameters_hex += optional_parameter_hex - optional_parameter_hex = ( - b"\x02" - b"\x06" - b"\x41" - b"\x04" - ) - optional_parameter_hex += struct.pack( - ">I", my_autonomous_system - ) + optional_parameter_hex = b"\x02" b"\x06" b"\x41" b"\x04" + optional_parameter_hex += struct.pack(">I", my_autonomous_system) optional_parameters_hex += optional_parameter_hex if self.grace != 8: @@ -1466,48 +1387,20 @@ class MessageGenerator(object): path_attributes_hex = b"" if not self.skipattr: - path_attributes_hex += ( - b"\x40" - b"\x01" - b"\x01" - b"\x00" - ) - path_attributes_hex += ( - b"\x40" - b"\x02" - b"\x06" - b"\x02" - b"\x01" - ) + path_attributes_hex += b"\x40" b"\x01" b"\x01" b"\x00" + path_attributes_hex += b"\x40" b"\x02" b"\x06" b"\x02" b"\x01" my_as_hex = struct.pack(">I", my_autonomous_system) path_attributes_hex += my_as_hex - path_attributes_hex += ( - b"\x40" - b"\x05" - b"\x04" - b"\x00\x00\x00\x64" - ) + path_attributes_hex += b"\x40" b"\x05" b"\x04" b"\x00\x00\x00\x64" if nlri_prefixes != []: - path_attributes_hex += ( - b"\x40" - b"\x03" - b"\x04" - ) + path_attributes_hex += b"\x40" b"\x03" b"\x04" next_hop_hex = struct.pack(">I", int(next_hop)) path_attributes_hex += next_hop_hex if originator_id is not None: - path_attributes_hex += ( - b"\x80" - b"\x09" - b"\x04" - ) + path_attributes_hex += b"\x80" b"\x09" b"\x04" path_attributes_hex += struct.pack(">I", int(originator_id)) if cluster_list_item is not None: - path_attributes_hex += ( - b"\x80" - b"\x0a" - b"\x04" - ) + path_attributes_hex += b"\x80" b"\x0a" b"\x04" path_attributes_hex += struct.pack(">I", int(cluster_list_item)) if self.bgpls and not end_of_rib: @@ -1552,17 +1445,12 @@ class MessageGenerator(object): mp_reach_content = ( b"\x40\x04" b"\x47" - b"\x04" - + struct.pack(">I", int(next_hop)) - + b"\x00" - + nlri + b"\x04" + struct.pack(">I", int(next_hop)) + b"\x00" + nlri ) path_attributes_hex += ( b"\x80" - b"\x0e" - + struct.pack("B", len(mp_reach_content)) - + mp_reach_content + b"\x0e" + struct.pack("B", len(mp_reach_content)) + mp_reach_content ) elif self.nlri_type == 6: @@ -1602,9 +1490,7 @@ class MessageGenerator(object): path_attributes_hex += ( b"\x80" - b"\x0e" - + struct.pack("B", len(mp_reach_content)) - + mp_reach_content + b"\x0e" + struct.pack("B", len(mp_reach_content)) + mp_reach_content ) # 5. BGP-LS Attribute (Attribute 29) @@ -1630,9 +1516,7 @@ class MessageGenerator(object): attr_29_content = tlv_1250 + tlv_1252 path_attributes_hex += ( b"\x80" - b"\x1d" - + struct.pack("B", len(attr_29_content)) - + attr_29_content + b"\x1d" + struct.pack("B", len(attr_29_content)) + attr_29_content ) total_path_attributes_length = len(path_attributes_hex) @@ -2677,4 +2561,4 @@ def threaded_job(arguments): if __name__ == "__main__": arguments = parse_arguments() logger = create_logger(arguments.loglevel, arguments.logfile) - threaded_job(arguments) \ No newline at end of file + threaded_job(arguments) pre-commit: exit 1 (46.62 seconds) /w/workspace/integration-test-tox-verify-master> pre-commit run --all-files --show-diff-on-failure pid=2587 pre-commit: FAIL ✖ in 49.77 seconds gitlint: install_deps> python -I -m pip install gitlint gitlint: freeze> python -m pip freeze --all gitlint: arrow==1.2.3,click==8.1.3,gitlint==0.19.1,gitlint-core==0.19.1,pip==26.2.2,python-dateutil==2.9.0.post0,setuptools==84.2.1,sh==1.14.3,six==1.17.0 gitlint: commands[0]> gitlint docs: OK (30.15=setup[25.82]+cmd[4.33] seconds) pre-commit: FAIL code 1 (49.77=setup[3.15]+cmd[46.62] seconds) gitlint: OK (14.73=setup[14.60]+cmd[0.13] seconds) evaluation failed :( (94.68 seconds)